
Bus I²C: cablaggio, indirizzamento e resistori di pull-up
Realizza un bus I²C affidabile: ruoli di SDA e SCL, indirizzi a 7 bit, velocità, capacità del bus, tempo di salita e dimensionamento dei pull-up.
Redazione e revisione tecnica:Team di ingegneria ElectroDesignForge
Consulta il processo editorialePunto essenziale: l’I²C collega più circuiti integrati tramite due linee condivise:
SDAper i dati eSCLper il clock. Le uscite sono generalmente a drain aperto: un dispositivo porta la linea a livello BASSO, mentre le resistenze di tiraggio la riportano ad ALTO. Il loro dimensionamento deve rispettare sia il limite di corrente assorbita a livello BASSO sia il tempo di salita imposto dalla velocità e dalla capacità totale del bus.
Riferimenti rapidi
| Modalità | Frequenza SCL massima | Tempo di salita t_r massimo (30–70%) | Capacità di riferimento per linea |
|---|---|---|---|
| Modalità standard (Sm) | 100 kHz | 1000 ns | 400 pF |
| Modalità veloce (Fm) | 400 kHz | 300 ns | 400 pF |
| Modalità veloce Plus (Fm+) | 1 MHz | 120 ns | 550 pF |
Questi limiti provengono dalla specifica I²C. Il componente più lento può richiedere una frequenza inferiore. Non scegliere Fm+ solo perché il controllore la supporta: devono supportarla anche tutti i dispositivi destinatari, i traslatori di livello e gli isolatori.
SDA e SCL: linee condivise
SDA trasporta indirizzo, bit di lettura/scrittura, byte di dati e conferme. SCL scandisce il trasferimento. A riposo, entrambe le linee sono ALTE. Una condizione START si verifica quando SDA passa a BASSO mentre SCL è ALTA; una condizione STOP quando SDA passa ad ALTO mentre SCL è ALTA.
Durante il trasferimento dei dati, SDA rimane stabile quando SCL è ALTA. Il controllore invia otto bit e poi rilascia SDA al nono impulso di clock; il ricevitore porta SDA a BASSO per un ACK oppure la lascia ALTA per un NACK.
+3.3 V +3.3 V
| |
[Rp] [Rp]
| |
SDA ──────────────+──── controllore ─ destinatario A ─ destinatario B
SCL ──────────────+──── controllore ─ destinatario A ─ destinatario B
GND ───────────────────── massa comune a tutti i dispositivi
Serve una resistenza di tiraggio equivalente su SDA e una su SCL. Più moduli possono già includerle, collegandole così in parallelo. Due resistenze da 4.7 kΩ equivalgono a 2.35 kΩ; quattro a 1.18 kΩ. Controlla gli schemi dei moduli prima di aggiungere un’altra coppia.
Perché usare uscite a drain aperto?
Un dispositivo non forza mai attivamente il bus ad ALTO: rilascia la linea oppure la porta a BASSO. Se due dispositivi agiscono contemporaneamente, prevale il livello BASSO senza cortocircuitare stadi di uscita contrapposti. Questo comportamento «wired-AND» consente la conferma, l’arbitraggio tra più controllori e l’allungamento del clock.
In un sistema con un solo controllore e senza dispositivi che allungano il clock, talvolta SCL può essere pilotata in push-pull; documenta esplicitamente questa eccezione. Per un bus I²C ampiamente compatibile, mantieni SCL a drain aperto con la sua resistenza di tiraggio.
Cablaggio, massa e livelli di tensione
Collega tutti i dispositivi in parallelo: SDA con SDA, SCL con SCL e massa comune. Evita una topologia a stella con diramazioni lunghe: aumentano capacità, riflessioni e sensibilità al rumore. Su un PCB, mantieni brevi le piste, disponile sopra un piano di massa continuo e lontano dai nodi a commutazione rapida.
L’alimentazione delle resistenze di tiraggio determina il livello ALTO. Deve essere compatibile con tutti gli ingressi e le uscite, compresi quelli di un microcontrollore spento. Non collegare direttamente un componente a 1.8 V a resistenze di tiraggio verso 3.3 V, a meno che il datasheet lo consenta. Usa un traslatore di livello adatto all’I²C, con resistenze di tiraggio su entrambi i lati quando il circuito le richiede.
Le resistenze di tiraggio interne dei microcontrollori sono spesso da 20 a 100 kΩ: talvolta bastano a velocità molto bassa su piste corte, ma normalmente sono troppo deboli per bus a 100/400 kHz con carichi significativi. Verifica il valore effettivo.
Indirizzi a 7 bit, non a 8 bit
La maggior parte dei circuiti usa un indirizzo del destinatario a 7 bit. Il primo byte trasmesso sul bus è:
[ A6 A5 A4 A3 A2 A1 A0 | R/W ]
Il bit R/W viene aggiunto sul bus: non fa parte dell’indirizzo a 7 bit passato alla libreria. Un dispositivo con indirizzo 0x68 compare come 0xD0 in scrittura e 0xD1 in lettura. Un’API che richiede 0xD0 può seguire la convenzione a 8 bit: controlla prima di traslare l’indirizzo due volte.
Su molti sensori, i pin ADDR, SA0 o SDO selezionano l’indirizzo. Collegali a un livello definito e annota gli indirizzi nello schema. Se due dispositivi con indirizzo fisso entrano in conflitto, usa un multiplexer I²C, un altro controllore oppure una variante del componente. Esiste anche l’indirizzamento a dieci bit, ma è raro; un registro interno del sensore non è l’indirizzo I²C.
Velocità, SCL e allungamento del clock
La frequenza SCL è una frequenza massima di temporizzazione, non la velocità garantita dei dati utili: indirizzi, registri, bit ACK/NACK, condizioni START/STOP e ritardi interni riducono il throughput. Un trasferimento di più registri a 400 kHz richiede quindi più tempo di quello ottenuto dividendo il numero di byte per 400 kbit/s.
Un destinatario può mantenere SCL a BASSO dopo che il controllore l’ha rilasciata: è il clock stretching. Il controllore deve leggere SCL e attendere che torni ALTA, rispettando il timeout previsto dal prodotto. Verifica la compatibilità, perché alcuni driver lo gestiscono male. Con più controllori, il dispositivo che rilascia SDA ma legge BASSO perde l’arbitraggio e si ferma.
Capacità del bus e tempo di salita
Ogni linea costituisce un carico RC: si sommano le capacità degli ingressi dei circuiti, delle piste, dei cavi, delle sonde, dei connettori e le capacità parassite. Quando nessun dispositivo forza la linea a BASSO, la resistenza di tiraggio carica gradualmente questa capacità.
Per una misura dal 30% al 70% di VDD:
t_r ≈ 0.8473 × R_p × C_bus
R_p,max ≈ t_r,max / (0.8473 × C_bus)
Usa ohm, farad e secondi. Il risultato è la resistenza di tiraggio massima: oltre questo valore, la salita è troppo lenta. A 400 kHz con C_bus = 100 pF:
R_p,max ≈ 300 ns / (0.8473 × 100 pF) ≈ 3.54 kΩ
Una resistenza da 4.7 kΩ assorbe poca corrente, ma è troppo grande per rispettare 300 ns con 100 pF. 3.3 kΩ è un punto di partenza migliore, da confermare in base ai limiti di corrente allo stato BASSO e alle misure. È preferibile misurare la capacità sul circuito assemblato; altrimenti somma la capacità degli ingressi, quella dei cavi (pF/m), dei connettori e un margine per il PCB. Anche la sonda introduce capacità.
Dimensionamento del tiraggio: un intervallo, non un valore magico
Una resistenza più piccola accelera il fronte, ma aumenta la corrente quando un dispositivo porta la linea a BASSO. Il limite inferiore è:
R_p,min ≈ (VDD − V_OL,max) / I_OL,max
Con VDD = 3.3 V, V_OL,max = 0.4 V e I_OL,max = 3 mA:
R_p,min ≈ (3.3 − 0.4) / 3 mA ≈ 967 Ω
R_p,min ≤ R_p ≤ R_p,max
Il valore scelto è valido solo all’interno di questo intervallo. Se l’intervallo non esiste, riduci la capacità, diminuisci la velocità, usa un buffer I²C adatto oppure un dispositivo Fm+ capace di assorbire più corrente. Non scendere sotto R_p,min solo perché il circuito sembra funzionare: V_OL può diventare ambiguo e la dissipazione aumenta.
| Situazione | Punto di partenza | Da verificare |
|---|---|---|
| PCB compatto, 3.3 V, 100 kHz | 4.7 a 10 kΩ | capacità e resistenze di tiraggio già presenti |
| PCB compatto, 3.3 V, 400 kHz | 2.2 a 4.7 kΩ | t_r e I_OL di ogni dispositivo |
| Cavo o molti moduli | valore calcolato, spesso inferiore | corrente assorbita, compatibilità elettromagnetica, forma d’onda all’estremità del cavo |
Questi intervalli non sostituiscono il calcolo per il circuito effettivo.
Misura e ricerca dei guasti
Osserva SDA e SCL nel punto più lontano dal controllore. Misura t_r dal 30% al 70% di VDD e controlla V_OL, le oscillazioni e la stabilità di SDA quando SCL è ALTA.
| Sintomo | Cause probabili | Interventi |
|---|---|---|
| Nessun dispositivo rilevato | massa mancante, indirizzo errato, SDA/SCL invertiti | verifica continuità, alimentazione e scansione degli indirizzi a 7 bit |
| Linee sempre ALTE | resistenza di tiraggio mancante o alimentazione errata | controlla entrambe le resistenze e la loro alimentazione |
| Linea bloccata a BASSO | dispositivo in reset, guasto di cablaggio, transazione interrotta | isola i moduli e reimposta il segmento |
| NACK casuali | salita lenta, rumore, capacità o velocità eccessive | misura t_r, riduci R_p, rallenta il bus |
| Guasto solo con tutti i moduli | resistenze in parallelo troppo piccole o capacità complessiva eccessiva | calcola resistenza equivalente e capacità totale |
Una procedura di recupero tipica rilascia SDA, genera fino a nove impulsi su SCL e poi una condizione STOP. Usala solo se tutti i datasheet la consentono; reimpostare il segmento può essere più affidabile.
Lista di controllo prima del layout
- Tutti i componenti condividono la massa e una tensione del bus compatibile?
- SDA e SCL hanno ciascuna una resistenza di tiraggio equivalente, senza aggiunte involontarie in parallelo?
- Gli indirizzi sono univoci e riportati nella forma a 7 bit?
- Tutti i dispositivi, traslatori di livello e isolatori supportano la velocità scelta?
- Il valore scelto è compreso fra
R_p,mineR_p,max? - Il tempo di salita è verificato sulla scheda con la capacità reale?
Calcolatore associato
- Apri il calcolatore delle resistenze di pull-up e pull-down per calcolare l’intervallo di resistenza in base a
VDD, corrente GPIO, soglie, capacità della linea e limite del tempo di salita I²C.
Fonti
- NXP Semiconductors, UM10204 — Specifica del bus I²C e manuale d’uso: protocollo, livelli elettrici e temporizzazioni Sm/Fm/Fm+.
- Datasheet dei controllori, dei dispositivi destinatari, dei traslatori di livello, dei buffer e degli isolatori utilizzati: prevalgono per
I_OL,V_OL, capacità d’ingresso e supporto del clock stretching.