Electronic – Additional Voltage on I2C Bus

i2coscilloscopevoltage

I have redesigned one of my boards to the ICM-20689 (datasheet) instead of the ICM-20789 because of a voltage issue that I previously had. Link to previous issue.

A little background on my setup. The ICM-20689 is running on 3.3V with 3.3V on the VDDIO pin and 10k pullup resistors on the I2C bus. The master device is running at 5V, but only needs 60% (3V) to read a voltage high. The frequency is set to 400kHz.

I have been able to communicate with the device just fine and get good data. I wanted to look at the bus voltages with an oscilloscope to make sure that everything looked fine, and I noticed something a little odd. Before the master starts talking with the ICM-20689, the bus line is at a voltage of 3.3V. When the master wakes up the device and starts receiving data, the voltage jumps to 3.7V.

enter image description here

My oscilloscope is not the greatest, but the probe is in 10x mode, and I am using the trigger to capture the data on the first packet of data sent. On all subsequent data packages, the voltage stays at 3.7V. Is this is an issue with the device, or is this maybe an issue with my measurement setup?

Edit: Here is the schematic for the ICM-20689. This "voltage bump" happens on both the SCL and SDA lines. To my knowledge, there are no internal pull-ups active on any devices on the bus.

enter image description here

Is this normal for I2C? What is causing this bump? Is this something I should be worried about, or is this within allowable tolerances?

Best Answer

In the comments you say that you are using an ATmega32U4 with the standard Arduino Wire library. Pullup resistor value for that MCU is specified as 20 - 50k Ω. A value of ~32k would cause the voltage you are seeing.

In twi.c we see:-

void twi_init(void)
{
  ...

  // activate internal pullups for twi.
  digitalWrite(SDA, 1);
  digitalWrite(SCL, 1);

To disable the internal pullups you could comment out those lines in the library code. However then you may have problems with the voltage being too low for reliable operation (ATmega32U4 specifies minimum high level of 0.7 * Vcc, which is 3.5 V at Vcc = 5 V). The proper solution is to use an I2C level shifter circuit like this:-

enter image description here