Calcolo delle resistenze di pull-up I2C

L’I2C ha bisogno di una resistenza di pull-up su SDA e di una su SCL. Troppo piccole e i chip non riescono a portare le linee in basso; troppo grandi e le linee salgono troppo lentamente. Inserisci velocità, tensione e capacità del bus per avere l’intervallo che funziona.

Valore minimo ammesso
—
Valore massimo ammesso
—
Valore standard suggerito (tempo di salita)
—

Un suggerimento: qualsiasi valore standard dentro l’intervallo rispetta la specifica.

Tempo di salita con la tua resistenza
—
Limite per questa velocità
—
Giudizio
—

I risultati sono calcoli su formule pubblicate, non misure. Verificali sul tuo hardware. Gratis, senza registrazione

Cos’è una resistenza di pull-up?

I chip I2C non portano mai SDA e SCL in alto. Le loro uscite sono open-drain: possono solo collegare la linea a massa, oppure lasciarla libera. Una resistenza di pull-up verso l’alimentazione riporta su la linea ogni volta che nessun chip la tiene in basso. Ogni bus I2C ne ha bisogno di una su SDA e di una su SCL.

Perché ci sono un minimo e un massimo

Minimo: quando un chip porta la linea in basso, la corrente passa dalla pull-up dentro quel chip. La specifica garantisce solo che un chip assorba 3 mA tenendo la linea a 0,4 V o meno (20 mA in Fast-mode Plus), quindi una resistenza più piccola chiederebbe più corrente di quella che il chip regge.

Massimo: ogni filo e ogni pin di un chip aggiungono capacità, e la resistenza la deve caricare. La linea deve salire dal 30 % al 70 % di VDD entro il tempo di salita ammesso per quella velocità: 1000 ns a 100 kHz, 300 ns a 400 kHz, 120 ns a 1 MHz.

Come stimare la capacità del bus

Ogni pin di un chip aggiunge fino a 10 pF (il limite della specifica) e i collegamenti aggiungono altro: fili corti su breadboard qualche decina di picofarad, un metro di cavo spesso circa 100 pF. Per un piccolo montaggio hobbistico, da 50 a 200 pF è una stima ragionevole. La specifica ammette al massimo 400 pF (550 pF in Fast-mode Plus).

Pull-up che ci sono già

Molte schedine (sensori BME280, display SSD1306, moduli MPU6050) hanno già le pull-up, spesso da 4,7 kΩ o 10 kΩ. Più moduli sullo stesso bus mettono le loro pull-up in parallelo: due da 4,7 kΩ fanno circa 2,35 kΩ. Confronta il risultato con il valore minimo ammesso.

La formula

Rp(min) = (VDD − VOL(max)) / IOL     VOL(max) = 0,4 V, IOL = 3 mA (20 mA in Fast-mode Plus)
Rp(max) = tr / (0,8473 × Cb)         tr = 1000 ns, 300 ns o 120 ns; Cb = capacità del bus
tr      = 0,8473 × Rp × Cb          0,8473 = ln(0,7 / 0,3): il tempo per salire dal 30 % al 70 % di VDD

Fonte: NXP UM10204, specifica e manuale del bus I2C, sezione 7.1 “Pull-up resistor sizing” e tabella 10 (limiti del tempo di salita).

Esempio svolto

Un ESP32 a 3,3 V con un sensore e un display su fili corti, circa 100 pF, a 400 kHz: Rp(min) = (3,3 − 0,4) V / 3 mA = 967 Ω, Rp(max) = 300 ns / (0,8473 × 100 pF) = 3,54 kΩ. Il calcolatore suggerisce 1,8 kΩ (tempo di salita 153 ns).

Una pull-up da 10 kΩ darebbe un tempo di salita di 847 ns: troppo lento per 400 kHz, ma va bene a 100 kHz, dove è ammesso fino a 11,8 kΩ.

Domande e risposte

4,7 kΩ va sempre bene per l’I2C?

È una scelta comune a 100 kHz, a 3,3 V o 5 V con fili corti, e lì di solito funziona. A 400 kHz, o con fili lunghi e tanti dispositivi, può essere troppo debole: confrontala con il valore massimo ammesso per il tuo bus.

Servono le pull-up se il modulo le ha già?

Di solito no. La maggior parte delle schedine ha già le pull-up su SDA e SCL. Controlla lo schema del modulo, oppure misura la resistenza tra SDA e VCC a circuito spento. Con tanti moduli sullo stesso bus, le loro pull-up si sommano in parallelo e possono diventare troppo forti.

Posso usare le pull-up interne del microcontrollore?

Solo per bus corti e lenti. Le pull-up interne sono deboli, di solito da 20 a 80 kΩ a seconda del chip, quindi le linee salgono lentamente. Possono bastare per una prova veloce a 100 kHz con un solo sensore su fili corti; per tutto il resto usa resistenze esterne.

Cosa succede se la pull-up è sbagliata?

Troppo forte (troppo piccola) e un chip non riesce a portare la linea abbastanza in basso, quindi i bit vengono letti male. Troppo debole (troppo grande) e i fronti diventano rampe lente; alle velocità più alte i bit si confondono, i dispositivi smettono di rispondere o il bus si blocca. In entrambi i casi può sembrare un errore “dispositivo non trovato”.

Devo collegare le pull-up a 3,3 V o a 5 V?

All’alimentazione dei chip sul bus. Se sul bus c’è una scheda a 3,3 V come un ESP32 o un Raspberry Pi Pico, collega le pull-up a 3,3 V: portare i suoi pin a 5 V può danneggiarla. Per mescolare dispositivi a 3,3 V e a 5 V usa un traslatore di livello I2C.

Impara le basi

Lezioni gratuite del corso di BoardPilot che spiegano le idee dietro questo calcolatore:

Altri calcolatori

Guardalo su una scheda vera

BoardPilot usa questi stessi calcoli dentro l’app, accanto a una vista 3D dal vivo della tua scheda, dei pin e dei fili, con un debug guidato quando qualcosa non funziona. Provalo nel browser o scaricalo per macOS e Windows.