Electronic – arduino – Properly isolating I2C for powered off MCU

arduinoi2cisolationmosfetrtc

What is the proper way to isolate the I2C lines of two devices where one is powered on and the other can be powered down? I'm not 100% sure if isolation is even necessary, but I suspect it is.

Here is a simplified explanation of what I am doing: I have a MCU and an RTC connected to each other via I2C. The MCU can be powered down while the RTC continues to be powered (the same 5v supply). The MCU and the RTC remain connected via I2C. Here is a rough diagram:

MCU and RTC connected via I2C

The first thought that came to mind was that I could use a MOSFET on each I2C line so that when the power is cut to the MCU, it severs the connection on SCL/SDA. Then I googled a bit and discovered TCA4311 which looks like it is basically built for this purpose. TCA4311 looks pretty interesting. I think pulling the EN pin to ground on the TCA4311 is all that is needed to sever the I2C lines.

I was hoping to get some feedback since I am a newbie. Does the TCA4311 sound like a good strategy? Or am I way off? Thanks in advance!

Best Answer

What is the proper way to isolate the I2C lines of two devices where one is powered on and the other can be powered down? I'm not 100% sure if isolation is even necessary, but I suspect it is.

It usually isn't. You'd keep the MCU powered, but put it into "STOP" mode or similar, at which point it consumes no power (but for some nA or less for static leakage, just as your MOSFET would have some leakage).

But: you're using an Arduino, and neither is that even remotely a power-efficient platform, nor does the Arduino UNO specifically support much different power modi.

The main problem is that the arduino can't be "powered off" in the strict sense of the word: there's regulators wasting power as long as it's connected to supply voltage.

The solution on how to build a energy-saving circuit hence is, sadly, dropping your central component, the arduino, and replacing it with something that isn't as bad as an Arduino UNO for this.

While doing that: you could drop the separate RTC and just buy a microcontroller with a built-in RTC. It's really just the same: you connect a coin cell to the VBAT pin of the MCU and that's what you need to power the RTC when there's no main VCC. Modern MCUs use really little current in STOP modes, and quite possible negligibly little even in SLEEP modes¹, so the problems you're trying to solve here simply don't exist. Waking up the MCU from standby mode is something that the RTC can do without any special connections, and thus saves you space, components, probably power and almost certainly cost.


For example, my STM32F030xx here uses about 3 µA in sleep mode, which is about 1/50 of your RTC's standby current usage. You're really barking up the wrong power saving tree as long as you're using an Arduino.