How should the external pull-up value for SMBus pins be calculated?
I2C/SMBus pull-up size affects the maximum speed of the bus as well as the amount current consumed during a transfer. Larger resistances reduce current draw, while smaller ones allow for higher speed data transfer.
Values can range from 1K to 50K depending on the application.
The current drawn by each pin while signaling a 0 can be calculated as I = Vio / Rpull-up. Typically Vio will be 5V or 3.3V. Note that for the purposes of this article Vio refers to the supply powering the SMBus pullups, NOT the device Vio supply which may be a different level.
The maximum frequency at which the bus can run is limited by an RC filter formed by the pull-up resistor and the capacitance of the net carrying the signal. The effective cutoff can be calculated as approximately 1 / (2 * Pi * Rpull-up * Ctrace), where Ctrace is the capacitance of the net carrying the SMBus signal. In a typical design this will be on the order of 5pF, but can vary widely from board to board.
Example: Let us assume a system with 10pF of capacitance on the SCL net and a 5V Vio supply. If a 1K resistor is chosen as a pull-up the bus will dissipate 5mA when SCL drives low and be able to operate at a maximum of 16 Mhz. If a 50K resistor is chosen as a pull-up the bus will dissipate 0.1mA when SCL drives low and be able to operate at a maximum of 300 KHz.
In applications where the bus power budget is known it is recommended that the smallest resistor which meets the power constraints be used. R = Vio/Imax.
In applications where the lowest power possible is desired it is recommended that the resistor be as large as possible while still meeting the maximum speed requirements.R = 1 / (2 * Pi * Ctrace * Fmax)