I'm currently trying to incorporate bno055 into zephyr RTOS for a project. As I understood the official API at https://github.com/BoschSensortec/BNO055_driver, the device needs a initialized bno055_struct instance and that instance has to be provided .read() .write() .delay() function definitions as well as I2C_address. The device is initialized using .init() API call and reads the chip_id, acc_id, mag_id etc registers followed by writing config page to 0. Next the API reads current operation mode, if not CONFIGURE_MODE it sets device into CONFIG_MODE applies NORMAL power mode, goes back to CONFIG_MODE and sets desired OPERATION_MODE. My issue is as follows:
When attempting to change the OPERATION_MODE to ACC_ONLY or any other mode, I can see using Saleae Logic Analyzer that I am sending a 0x11 value to 0x3D register. However when I read said register after 600ms operation mode change delay the register remains sat to 0x10 ( I am aware that the MSB is ignored). I am using the I2C interface to read and write to registers.The device is connected as follows:
VIN -> 3.0V, 3vo -> 3.0V, GND -> Power Supply GND, SDA -> NRF52840 SDA, SCL -> NRF52840 SCL, RST -> 3.0V, PS0 -> GND, PS1 -> GND, INT -> floating and ADR -> GND.
So following the datasheet the device has address of 0x28 and is configured to communicate using I2C bus. Following the example provided in the bno055_support.h file the sensor shouldn't require additional calls other then .init() , set_power_mode() and set_operation_mode() to be ready to be read from. I am struggling to understand where I have made a mistake. Can somebody shed some light on to the issue?
Thanks in advance!
Solved! Go to Solution.
I saw your I2C plotter in the attachment.
the I2C write process looks wrong. you can refer to the page 102 of BNO055 datasheet for I2C write operate.
For me the write is not execute correctly.
Thank you for your reply!
Yes my setup was wrong when attempting to write to BNO055 I should've setup communication to write a byte of data denoting a register I wish to write to, followed by an acknowledgement ACK and the actual byte of data I wish to supply the register with . In my case however, the write one byte was followed by a NEW write one byte transaction resulting in nothing being writen.