Hi,
I have been having trouble getting any read/writes going with my Infineon TLV493D magnetic sensor over i2c. I suspect it may be a cast or syntax thing that I can't get to the bottom of.
As I understand it, when calling nrf_drv_twi_rx the size of the buffer array is the number of bytes the master tries to read from the slave. However, I always get a warning from the compiler: expected 'uint8_t * {aka unsigned char *}' but argument is of type 'uint8_t (*)[7] {aka unsigned char (*)[7]}' when I try to pass an array of size 7 to read 7 bytes. I then use that information to write 4 bytes to send to the sensor, and same warning arises for nrf_drv_twi_tx. Is that the right function to use for reading/writing multiple bytes? I understand nrfx_ is the new driver version and will replace all when I get this solved... just trying to get off the ground at this point.
Some things I have noticed trying to diagnose this are that if I try to declare a byte to send as a const I will get error 16 (invalid address). The only thing that works is casting as static, but not static const. Even though the function itself in nrf_drv_twi.h appears to ask for a const* this doesn't seem to work when I try to pass that.
I attached a code snippet because the whole file is long. Also I built this from the twi example file in SDK 15.2
/* TWI instance ID. */ #define TWI_INSTANCE_ID 0 #define MAG_SDA_PIN NRF_GPIO_PIN_MAP(0,26) #define MAG_SCL_PIN NRF_GPIO_PIN_MAP(0,27) /* Indicates if operation on TWI has ended. */ static volatile bool m_xfer_done = false; /* TWI instance. */ static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID); /* Buffer for samples read from temperature sensor. */// static uint8_t m_sample[7]; // sensor data buffer to create application static uint8_t sensorbitmap[10]; // initial register read and store static uint8_t MAG_SENSOR_ADDRESS = 0x3f; static uint8_t sendrecovery = 0xFF; // startup send recovery bits static uint8_t sendreset = 0x00; // startup send reset bits ....later on we call the following... err_code = nrf_drv_twi_rx(&m_twi, MAG_SENSOR_ADDRESS, &sensorbitmap, sizeof(sensorbitmap)); // Read and store sensorbitmap for later use APP_ERROR_CHECK(err_code); // NRF_LOG_INFO(err_code); .... and use it to send this... void mag_sensor_set_mode(void) { ret_code_t err_code; const uint8_t write_registers[4] = { 0x00, 0x00 | MAG_SENSOR_IICADDR | INT_DISABLE | FAST_MODE_DISABLE | LOW_POWER_MODE_ENABLE, sensorbitmap[8], TEMPERATURE_ENABLE | LOW_POWER_PERIOD_12MS | PARITY_TEST_DISABLE | (sensorbitmap[9] & 0x0F) }; SEGGER_RTT_printf(0, "write_registers: %d\n", write_registers); err_code = nrf_drv_twi_tx(&m_twi, MAG_SENSOR_ADDRESS, write_registers, sizeof(write_registers), true); APP_ERROR_CHECK(err_code); NRF_LOG_INFO(err_code); while (m_xfer_done == false); }
Any help is greatly appreciated!