Hello everyone,
I have an external board with processor nrf51422 and sensor BNO055 (I2C).
I have a processor code created by someone else and I have a problem getting data from the sensor. I know that similar topics have already appeared on the forum, but despite many attempts I have not managed to establish communication.
So I present the original, theoretically working version of Twi_functions.
Twi_functions.c
#include "twi_functions.h" /* TWI instance. */ const nrf_drv_twi_t twi_sensors_instance = NRF_DRV_TWI_INSTANCE(1); void twi_init (void) { ret_code_t err_code; const nrf_drv_twi_config_t twi_sensors_config = { .scl = I2C_SENSORS_SCL_PIN, .sda = I2C_SENSORS_SDA_PIN, .frequency = NRF_TWI_FREQ_100K, .interrupt_priority = APP_IRQ_PRIORITY_LOW }; err_code = nrf_drv_twi_init(&twi_sensors_instance, &twi_sensors_config, NULL, NULL); APP_ERROR_CHECK(err_code); nrf_drv_twi_enable(&twi_sensors_instance); } void twi_read_register(uint8_t slave_address, uint8_t register_address, uint8_t *read_data, uint8_t data_length) { // Send register address nrf_drv_twi_tx(&twi_sensors_instance, slave_address, ®ister_address, sizeof(register_address), true); // Receive data nrf_drv_twi_rx(&twi_sensors_instance, slave_address, read_data, data_length, false); } void twi_write_register(uint8_t slave_address, uint8_t register_address, uint8_t *data, uint8_t data_length){ uint8_t data_packet[data_length + 1]; data_packet[0] = register_address; memcpy(data_packet+1,data, data_length); nrf_drv_twi_tx(&twi_sensors_instance, slave_address, data_packet, data_length +1, false); }
int8_t bno055_getTemp() { bno055_setPage(0); uint8_t t; bno055_readData(BNO055_TEMP, &t, 1); return t; } void bno055_setup() { bno055_reset(); uint8_t id = 0; bno055_readData(BNO055_CHIP_ID, &id, 1); if (id != BNO055_ID) { printf("Can't find BNO055, id: 0x%02x. Please check your wiring.\r\n", id); } bno055_setPage(0); uint8_t tmp = 0x0; bno055_writeData(BNO055_SYS_TRIGGER, &tmp); // Select BNO055 config mode bno055_setOperationModeConfig(); bno055_delay(10); } void bno055_writeData(uint8_t reg, uint8_t *data) { twi_write_register(BNO055_I2C_ADDR_LO,reg, data, sizeof(*data)); } void bno055_readData(uint8_t reg, uint8_t *data, uint8_t len) { twi_read_register(BNO055_I2C_ADDR_LO, reg, data, len); }