I2C pullup resistor values

fernando_g

Senior Member
A painful learning experience that I would like to share with others.

For a 5 volt supply and running at 100khz, the standard 10k resistors do the job quite nicely.
But on a project which had up to 8 slaveI2C devices which had to be queried constantly I found that I required to run the bus at high speed.

Then recurrent problems appeared: devices would fail to communicate randomly.
To make a loooooong story short, when you have several I2C devices and running them at 400khz, the 10k resistors don't pull the bus fast enough.
Those require to become much lower in value, but if you go too low, the drivers can't pull the bus low enough and the Vol(max) spec is violated, causing similar issues.

What to do? Asking Google 100 persons will give you 100 different values. But the following TI app note does provide the means to calculate solid resistor values.
If you are stuck in a "mysterious" I2C issue, please have a read:
 

Buzby

Senior Member
There is another option for dramatically improving performance of big I2C networks, its called Active Pullups.

A chip sits on the I2C bus and monitors the direction that the signal is moving, either up towards +v or down to 0v. If the bus is moving to +v the chip acivates a high current (5mA) pullup. This has the effect of 'squaring up' the leading edge of the signal.

I first came across this technique years ago on 1-Wire circuits, and as I2C uses the the same Open Drain interface it's no surprise that chips exist for the same purpose on I2C.

Here is one I just found, https://www.analog.com/media/en/technical-documentation/data-sheets/4311fa.pdf

Cheers,

Buzby
 
Top