BNO086 I2C Communication problem with Teensy 4.1


Was doing some more poking around with this chip and how its using RST and INT. Definitely don't think its as I2C issue - more of device/libary issue. As a note Sparkfun uses the CEVA library for interfacing with the device.
Did a bit more of a deep dive into the specs and the 2 libraries. Here is what I found:

1. Adafruit library uses an older version of the Hillcrest SHTP protocol geared to the BNO080 and BNO085 which they have break outs for. They do not support separate INT/RST pins in there library except for SPI implementation. Some examples seem to work, partial work or fail after a few readings.
a. more_reports example; seems to provide data for some reports but gives messages about can not read sensor periodically​
b. rotation vector example: gives a few report outputs then the sensor keeps reseting​
c. quaternion_yaw_pitch_roll example: seems to work.​
2. The Sparkfun library uses the latest released version of the SHTP protocol with the CEVA Sensor Hub driver.

3. Reading the documents referenced on the Sparkfun product page: especially the Sensor Hub Transport Protocol seems to indicate that using the interrupt pin is mandatory, but does not appear to work with only the INT pin set with the Sparkfun library. But the example that @KurtE and I put together does work with just INT which was based on the olde version of SHTP.

From*MTcwMTgwNTg5Ni43LjEuMTcwMTgwNzQyNy42MC4wLjA. it states
1. The H_INTN pin is the application interrupt line that indicates the BNO08X requires attention. This should be tied to a GPIO with wake capability. The interrupt is active low.
2. NRST is the reset line for the BNO08X and can be either driven by the application processor or the board reset.
which may explain why the BNO086 needs the RST pin connected.

Don't think I am going to dig any deeper unless there is an issue as @PaulStoffregen stated
Just as a note, from the sparkfun examples:
// For the most reliable interaction with the SHTP bus, we need
// to use hardware reset control, and to monitor the H_INT pin.
// The H_INT pin will go low when its okay to talk on the SHTP bus.
// Setup without INT/RST control (Not Recommended)
Last edited:
Since I am a glutton for punishment here a few boards tested where if you just hook up I2c without INT/RST connected they don't work:
Arduino GIGA R1
Arduino R4 WiFI
ESP32 Micromod.

They do work if you hook up INT and RST pins. Ok I am done with this device.

Posted on the Sparkfun forum and someone referenced me to the hook up guide and there is a big note on the hardware hookup page:
As of v1.0.3, you will need to wire up the reset and interrupt pins. Using only the I2C port was not sufficient enough to get the BNO086 to work reliably with a microcontroller.

The I/O pins have also been changed for the reset and interrupt pins! Make sure to adjust your connections accordingly.
Was doing a little more testing of the BNO086 and thought I would post this update.

When running a couple of the examples at 400khz I would get a sensor reset error and then you would see no output after the setReports. Reading a Sparkfun issue in their repo found this in:

>If any one comes across this conversation and is running into the same thing, we would recommend trying 350Khz, as that seems to work reliably with our setup (ESP32 IoT Redboard and QWIIC/INT/RST). Also note, there has been an issue using setClock(), and so the work around currently is to include it in the begin function like so: Wire.begin(SDA, SCL, 350000);

So I changed the I2C clockspeed to 350khz in the examples I was playing with and it worked. So suggest that if it does not work for you at 400khz change the clock to 350khz.