Not much participants this time -- but interesting comments as usual !
The two pull-ups in my schematic use 1.4mA at worst - and 0.7mA on the average while the bus is active
. As +Patrick Ludwig
suggested this is not that much considering the bus is idle most of the time. And, to cite +Tracy Hall
, consuming "virtually no power" at rest.
Moreover, as Patrick noticed, power
is not the same thing as energy
. And comparing the energy wasted in I2C communication vs energy consumed by the whole system could let one think the former is negligible. Well ... with chips consuming on average
1mA or more certainly. But ... considering for example the Atmel AT24C04C I2C EEPROM. This is not a too _un_common chip having 1mA max consumption while reading (which implies I2C bus activity) -- but with standby+leakage current < 20 µA (I2C bus idle at the same time). Maybe I made a wrong assumption here, but it seems to me that my two pull-ups will count for 30-40% of the whole power consumption.
In order to reduce the overall consumption of the I2C devices, +Bill Sidhipong
came with the interesting idea of using a spare MCU pin as voltage reference
for the pull-ups. This won't help much for the reasons explained by Tracy. But ... it could reduce the whole system consumption if that voltage reference serves as well as power pin for the slave devices. Allowing to shutoff the slave devices while unused. As a matter of fact, I tried this in my latest design -- I will make some measure as soon as the PCB will arrive -- that is after the Chinese new year :D
Anyway, for the sake of this quiz, I don't like pull-ups
. So I searched through the internet a way to replace those used on an I2C bus. And I came to a creative
... well, hacky
solution (where's the limit? ;) . Tracy wasn't far away while speaking of active drives
. The solution I found is to replace each pull-up by two inverters . Those would act as weak bus holders
, keeping the bus at low or high state with a very small current (depending the chip). The main drawback however is this trick can only hold
the bus at a given state, and so require active
transition from low to high. Saying this more clearly, in order the produce a high level on the line, the MCU has to actively output a high state and just after, switch to high impedance. The "active output" will force the bus to high state, which is hold after that by the inverters. Of course, this is no longer genuine
I2C. But in a simple configuration (one master few slaves) and with tolerant chips, this should work.
I liked that idea, that's why I share it here. Unfortunately, I don't have very low consumption inverters at hand to try it. And I guess it will require some minor adjustments (I feel like it needs some current-limiting resistors somewhere). But it definitively worth trying. Any volunteer :D ?