I have setup where is nRF52840+Zephyr and BHI160B is connected to with i2c @400kHz. BMM150 is connected to BHI160B.
Most of the BHI160-codes are from: https://github.com/BoschSensortec/BHy1_driver_and_MCU_solution
Firmware for upload with bhy_initialize_from_rom() is: Bosch_PCB_7183_di03_BMI160_BMM150-7183_di03.2.1.11696_170103.h
Normal booting sequence is going fine, but bhy_get_crc_host(v_crc_host_u32) returns v_crc_host_u32 = 0xFFFFFFFF. Return value itself is BHY_SUCCESS.
During the firmware upload (and only time) INT is going low for 5ms, which is abnormal as FW is not uploaded yet. Normally INT reason is not read here, but bhy_get_chip_status() in ISR claims that firmware_idle and no_eeprom are set by 1.
Overall boot and FW upload:
Begin of FW upload:
End of FW upload:
Any thoughts, what can be wrong here?
Solved! Go to Solution.
Could you get BHI160B_chip_id? First you should check whether I2C communication is successful or not.
Do you know whether there is the length limitation of I2C communication on nRF52840 platform?
This is what is read before FW upload using bhy_get_product_id() and bhy_get_revision_id():
product ID: 0x83, revision ID: 0x3
I think 32 byte transfers are fine.
Maybe you should modify your I2C functions to split the write or read length if write or read length is larger than limitation?
Or you need us to offer these two functions?
What I have analyzed the transmission with bus logic analyzer, there is no problems with current transmission lengths (32 bytes), 32 byte transmissions are fine. I imported screenshots of begin and end of the transmissions if you want to check.
Is there possible to detect if BHI160 didn't read the FW properly? Is CRC = 0xFFFFFFFF meaning that any byte didn't read properly?
Why INT happens if FW upload is not finished?