diff --git a/as5013-test/nrf52-as5013/nrf52-as5013.ino b/as5013-test/nrf52-as5013/nrf52-as5013.ino new file mode 100644 index 0000000000000000000000000000000000000000..1b7424a9c2cf5c4c76df1144718d62165c29b76e --- /dev/null +++ b/as5013-test/nrf52-as5013/nrf52-as5013.ino @@ -0,0 +1,94 @@ +//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() {}