Skip to content
Snippets Groups Projects
Commit 2b55534d authored by Sam Calisch's avatar Sam Calisch
Browse files

added firmware for i2c with nrf52 to as5013, still debugging values

parent 90b97c65
No related branches found
No related tags found
No related merge requests found
Pipeline #
//read raw values from as5013 hall effect array ic
//sec, 2017
//as5013 registers
#define ctrl_reg 0x0F
#define T_ctrl_reg 0x2D
#define c_raw_values_start 0x16 //starting address for raw sensor values
#define n_tx_bytes 1 //only need transmit the start read address
#define n_rx_bytes 20 //20 values pos_low, pos_high, neg_low, neg_high for each of c1, c2, c3, c4, c5
#define scl_pin 0 //XL1
#define sda_pin 1 //XL2
#define rst_pin 3 //A1
static uint8_t txdata[n_tx_bytes] = {0};
static uint8_t rxdata[n_rx_bytes] = {0};
//raw sensor values
volatile int16_t c1,c2,c3,c4,c5;
void twi_tx(){
// triggering the STARTTX task
NRF_TWIM0->TASKS_STARTTX = 1;
while( !(NRF_TWIM0->EVENTS_STOPPED) ){}
}
void twi_rx(){
// triggering the STARTRX task
NRF_TWIM0->TASKS_STARTRX = 1;
while( !(NRF_TWIM0->EVENTS_STOPPED) ){}
}
void setup() {
Serial.begin(115200);
//Need to switch to internal LFCLK to disconnect from XL1 and XL2
NRF_CLOCK->LFCLKSRC = 0; //disconnect XL1 AND XL2 FROM LFCLK?
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0){}
NRF_TWIM0->ENABLE = (TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos) & TWI_ENABLE_ENABLE_Msk;
NRF_GPIO->PIN_CNF[scl_pin] = (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) & GPIO_PIN_CNF_DRIVE_Msk;
NRF_GPIO->PIN_CNF[sda_pin] = (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) & GPIO_PIN_CNF_DRIVE_Msk;
NRF_GPIO->DIRCLR = (1<<scl_pin)|(1<<sda_pin); //set SDA/SCL as inputs (likely not necessary)
NRF_GPIO->DIRSET = (1<<rst_pin); //set AS5013 nRESET pin as output
NRF_GPIO->OUTCLR = (1<<rst_pin); //hardware reset
delay(1);
NRF_GPIO->OUTSET = (1<<rst_pin); //turn on as5013
delay(1);
NRF_TWIM0->PSEL.SCL = ((scl_pin << TWIM_PSEL_SCL_PIN_Pos) & TWIM_PSEL_SCL_PIN_Msk)
| ((TWIM_PSEL_SCL_CONNECT_Connected << TWIM_PSEL_SCL_CONNECT_Pos) & TWIM_PSEL_SCL_CONNECT_Msk);
NRF_TWIM0->PSEL.SDA = ((sda_pin << TWIM_PSEL_SDA_PIN_Pos) & TWIM_PSEL_SDA_PIN_Msk)
| ((TWIM_PSEL_SDA_CONNECT_Connected << TWIM_PSEL_SDA_CONNECT_Pos) & TWIM_PSEL_SDA_CONNECT_Msk);
NRF_TWIM0->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K100 << TWI_FREQUENCY_FREQUENCY_Pos) & TWI_FREQUENCY_FREQUENCY_Msk;
NRF_TWIM0->ADDRESS = (0x41 << TWI_ADDRESS_ADDRESS_Pos) & TWI_ADDRESS_ADDRESS_Msk;
NRF_TWIM0->TXD.PTR = (uint32_t)(&txdata);
NRF_TWIM0->RXD.PTR = (uint32_t)(&rxdata);
NRF_TWIM0->TXD.MAXCNT = (n_tx_bytes << TWIM_TXD_MAXCNT_MAXCNT_Pos) & TWIM_TXD_MAXCNT_MAXCNT_Msk;
NRF_TWIM0->RXD.MAXCNT = (n_rx_bytes << TWIM_RXD_MAXCNT_MAXCNT_Pos) & TWIM_RXD_MAXCNT_MAXCNT_Msk;
//set up short between LASTTX and STOP and between LASTRX and STOP
NRF_TWIM0->SHORTS = ((TWIM_SHORTS_LASTTX_STOP_Enabled << TWIM_SHORTS_LASTTX_STOP_Pos) & TWIM_SHORTS_LASTTX_STOP_Msk)
| ((TWIM_SHORTS_LASTRX_STOP_Enabled << TWIM_SHORTS_LASTRX_STOP_Pos) & TWIM_SHORTS_LASTRX_STOP_Msk);
//NRF_TWIM0->ENABLE = (TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos) & TWI_ENABLE_ENABLE_Msk;
//There's a typo in nrf52_bitfields, so we set this manually.
NRF_TWIM0->ENABLE = (6 << TWI_ENABLE_ENABLE_Pos) & TWI_ENABLE_ENABLE_Msk;
while(1){
//Serial.println("start txing");
txdata[0] = c_raw_values_start; //set up to read from address
twi_tx();
//Serial.println("done txing");
//Serial.println("start rxing");
twi_rx();
//Serial.println("done rxing");
c1 = (((int16_t)rxdata[2])<<8 + (int16_t)rxdata[3]) - (((int16_t)rxdata[0])<<8 + (int16_t)rxdata[1]);
c2 = (((int16_t)rxdata[6])<<8 + (int16_t)rxdata[7]) - (((int16_t)rxdata[4])<<8 + (int16_t)rxdata[5]);
c3 = (((int16_t)rxdata[10])<<8 + (int16_t)rxdata[11]) - (((int16_t)rxdata[8])<<8 + (int16_t)rxdata[9]);
c4 = (((int16_t)rxdata[14])<<8 + (int16_t)rxdata[15]) - (((int16_t)rxdata[12])<<8 + (int16_t)rxdata[13]);
c5 = (((int16_t)rxdata[18])<<8 + (int16_t)rxdata[19]) - (((int16_t)rxdata[16])<<8 + (int16_t)rxdata[17]);
Serial.println("Raw sensor values");
Serial.println(c1);
Serial.println(c2);
Serial.println(c3);
Serial.println(c4);
Serial.println(c5);
}
delay(100);
}
void loop() {}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment