0

I have an Arduino Micro connected to two I2C devices. An MPU-6050 that is powered by 5V (though it has its own voltage regulator on it) and a Altimeter that is powered by 3.3V. They are both connected to the SDA and SCL.

I noticed that when I have the MPU powered on but don't power the 3.3V altimeter, the MPU does not communicate with the Arduino. I need to have the 3.3V power on to just communicate with the MPU through I2C. Why does this happen?

Then unfortunately, I believe I may have shorted the 3.3V rail and broke the altimeter. When I remove the MPU from the equation and try to just communicate with the Altimeter, I get nothing. Does this mean that I did short the device, or is there something else going on with I2C that I don't understand?

I have attached a schematic below of how the devices are connected.

enter image description here

4
  • so ... you connect the scl/sda on the "pressure sensor" to the MPU6050 using 1k resistors? why? and how are these two components connected to the arduino? as a schematic, that leaves a lot of unanswered questions Commented Dec 20, 2018 at 3:47
  • They are connected to the Arduino Micros SCL and SDA pins. I did have both devices working before I shorted the device. I would like to know why when one device is bad (or not powered) on I2C, it screws up the other devices. Commented Dec 20, 2018 at 3:50
  • because they're connected Commented Dec 20, 2018 at 3:57
  • Do all devices use 3.3 V or all 5V for I2C communication? You will get problems when connecting a 3.3V device to a 5V bus or vice versa. At that point you would need a level shifter.
    – chrisl
    Commented Dec 20, 2018 at 8:00

2 Answers 2

1

I would like to know why when one device is bad (or not powered) on I2C, it screws up the other devices.

The I2C lines need to have a pull up resistor to provide the high. The master device, and the slave devices, ground the line to provide a low, but they release the line, and not drive it at all, in order to provide the high.

enter image description here

Consider switches a and b to be inside the I2C device. When the switch a is open point A will be at 5 volts. When switch a is closed, point A will be at 0 volts.

Now if you had a second set of R resistors on the same line, but powered from their own 5 volt power supply, the same voltages will be seen at A when switch a is open (5 volts) and switch a is closed (0 volts).

But now if we kill the supply feeding the second set of R resistors (sorry that I can't show them in a picture) instead of pulling up to 5 volts (because we killed the 5 volts) the resistors will be pulling down due to whatever other loads there are on the killed 5 volt supply. And just for argument sake, let's say the killed 5 volt supply was at 0 volts.

So if one set of resistors is pulling up to 5 volts (the still powered pair) and one pulling down (the killed pair) then the voltage at points A and B will not be as high as the 5 volts we would see when the switches are open. If all the resistors R were the same value, and the killed supply was at 0 volts, then the highest voltage at A or B would be 2.5 volts. And that is not a good high.

So the additional device, that is not being powered, has disrupted the communitations, preventing true highs. Lows are not affected as the switch will pull the line low.

I don't know the values of all your pull up resistors, and don't know how low the dead supply goes, so I can't say what the new lower highest voltage is. But it seems that it is low enough to make the communications stop working.

And the resistor are not the only thing that can be disgusting the high. The unpowered chip can be providing unexpected current paths. Most port pins have an internal diode to Vcc. And since the chip has no power on Vcc the current on the I2C lines can follow that path to ground.

Also, I think you have drawn the resistors wrong. If they were in series with the SDA and the SCL pins there would be no communications because the 1k resistors doesn't allow the SDA line to be pulled low enough. I think those resistors are pull up resistors. Maybe you can take another look and confirm the connection.

1
  • Thanks for the reply!! So the pull up resistors for the I2C line are on the breakout board for the MPU. They are 4.7kohm resistors and are pulled high to 3.3V. Commented Dec 20, 2018 at 5:55
1

When a device is unpowered any voltage placed on an IO pin is leeched off and fed to the VCC pin through the internal ESD protection diodes. On a bus like I2C this then cripples the bus. (Note: even if there are no intentional protection diodes the MOSFETs that drive the lines have diodes built into them and these act as protection diodes, but they are very weak and can be easily broken).

You cannot have an unpowered device on an I2C bus and doing so risks damaging the unpowered device (although the limited current provided by the pullup resistors should mitigate this).

If you want to have an unpowered device on the bus you must isolate it from the bus. I use the PCA9306 as in this answer, but other devices are available.

Did you kill the device by shorting it out? Possibly. It depends what you shorted to where. 3.3V directly onto the SDA or SCL pin while the device is unpowered may well have killed that pin.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.