Because the custom Atmel board uses an Atmega328PB, many libraries that work on the Arduino also work on the board. This simplified software development greatly as many chips, such as the selected BNO055 and BNO080 IMUs, already had libraries written for them.

Two custom boards were soldered, one with each IMU. Unfortunately, even though the custom boards followed the reference I2C specification in the datasheets, neither of the libraries were able to detect the IMUs when connected.

Software Debugging

The first type of debugging that was done was to use an I2C scanner to scan all I2C addresses on the bus to see if any devices responded. The BNO055 board was not found when connected, while the BNO080 board was found on the address 0x28. This was not expected as this is one of the listed addresses of the BNO055 chip, and not one of the BNO080 addresses in the datasheet.

Hardware Debugging

The I2C lines themselves were tested to check the data being sent and received by microcontroller and imu are correct. A rough outline of the I2C protocol is as follows:

I2C Protocol, courtesy of Sparkfun

Each library’s example code was modified to attempt to initialize the IMUs in a loop. The SDA and SCL lines were connected to an oscilloscope and the data was analyzed. An example picture is of the startup signal is shown here, with SDA (data) shown in yellow and SCL (clock) shown in blue:

Probed Signals of the I2C bus

From the signals shown, it can be seen that all data transmitted was NACKed and not responded to. All signals experienced this behaviour, except for the BNO080 chip on startup at address 0x28. This chip continuously pulled the SDA line low after receiving an address and did not provide useful data. In addition, a spike of voltage was observed near the end of the pull-down of SDA. No behaviour consistent with the I2C protocol was observed.

Conclusion

The custom IMU boards were likely not soldered properly as surface mount LGA packages are difficult to mount and verify that the connections are solid. It was decided to create an adapter board for the main board socket to the Adafruit 9-axis IMU board which is known to work.