i2c-pull-up
An I2C net (SDA/SCL) reaches no rail through a pull-up resistor.
Remedy ¶
Fit a pull-up resistor from each of SDA and SCL to the bus rail, sized from the bus capacitance and the clock rate the design actually runs at rather than from a habitual value.
What it means ¶
Every I2C net (its two lines are SDA and SCL) must have a pull-up resistor to its rail. Open-drain pins can only pull low; the pull-up returns the line high.
Why engineers want it ¶
Open-drain is a shared-bus trick: many parts can pull the line low, and a single pull-up returns it high. The pull-up is external and easy to forget, especially when every chip on the bus has a weak internal pull-up that a designer wrongly assumes is enough. TI and others publish app notes on it precisely because it is a recurring field failure.
Impact ¶
A missing pull-up means the bus is stuck low and no device on it communicates.
Scope note ¶
This is the presence check, which needs no datasheet. The pull-up value being in range is a datasheet-joined rule (a separate, Tier-X check). Resistor identity is the shared component.class fact: the ref-des prefix convention (R, RN) refined by part-type data when the source carries it.
The check follows the resistor’s OTHER end. It is not enough for a resistor to touch the bus, because a series termination or bus-isolation resistor does that and holds nothing high. The rule walks from the bus across resistors, never through ground, and passes only when it arrives at a rail. Until issue 375 it asked the membership question instead, so a bus with a series resistor and no pull-up at all passed at error severity.
The walk is bounded at check.PullUpReachHops crossings. One is a pull-up sitting directly on the
bus. Two is a bus segment separated from its pull-up by a series resistor, which is an ordinary
topology and the reason a one-hop test would report a false positive on it. Past three the
accumulated series resistance is comparable to the pull-up, so the node no longer returns high in
the time the bus needs and there is nothing worth crediting.
Resistors only, and ground is never crossed: a resistor to ground is a pull-DOWN, and counting it would pass exactly the bus this rule exists to catch.
The SDA/SCL name match is at a token boundary, not a substring (WS3-037): SDA, SCL,
I2C_SCL, and SCL0 match; SPI_SCLK (an SPI clock), SCLK, and MCLK do NOT, because SCL
abutting another letter is a different signal. Generalizing this presence check to an
arbitrary profile-declared signal set (CS, reset, boot straps) is the remaining WS3-037 work.
Query structure ¶
select the I2C nets that have no resistor member.
select N in nets where is_i2c(N) and not exists P in N.connections where is_resistor(P)
Reads: net name (pattern), on_net, component.class (resistor). Tier R.