ElectroDesignForgeElectroDesignForge
Segnali e interfacceComponentiProgettazione PCB

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 editoriale

Punto essenziale: l’I²C collega più circuiti integrati tramite due linee condivise: SDA per i dati e SCL per 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 massimaTempo di salita t_r massimo (30–70%)Capacità di riferimento per linea
Modalità standard (Sm)100 kHz1000 ns400 pF
Modalità veloce (Fm)400 kHz300 ns400 pF
Modalità veloce Plus (Fm+)1 MHz120 ns550 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.

SituazionePunto di partenzaDa verificare
PCB compatto, 3.3 V, 100 kHz4.7 a 10 kΩcapacità e resistenze di tiraggio già presenti
PCB compatto, 3.3 V, 400 kHz2.2 a 4.7 kΩt_r e I_OL di ogni dispositivo
Cavo o molti modulivalore calcolato, spesso inferiorecorrente 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.

SintomoCause probabiliInterventi
Nessun dispositivo rilevatomassa mancante, indirizzo errato, SDA/SCL invertitiverifica continuità, alimentazione e scansione degli indirizzi a 7 bit
Linee sempre ALTEresistenza di tiraggio mancante o alimentazione erratacontrolla entrambe le resistenze e la loro alimentazione
Linea bloccata a BASSOdispositivo in reset, guasto di cablaggio, transazione interrottaisola i moduli e reimposta il segmento
NACK casualisalita lenta, rumore, capacità o velocità eccessivemisura t_r, riduci R_p, rallenta il bus
Guasto solo con tutti i moduliresistenze in parallelo troppo piccole o capacità complessiva eccessivacalcola 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

  1. Tutti i componenti condividono la massa e una tensione del bus compatibile?
  2. SDA e SCL hanno ciascuna una resistenza di tiraggio equivalente, senza aggiunte involontarie in parallelo?
  3. Gli indirizzi sono univoci e riportati nella forma a 7 bit?
  4. Tutti i dispositivi, traslatori di livello e isolatori supportano la velocità scelta?
  5. Il valore scelto è compreso fra R_p,min e R_p,max?
  6. Il tempo di salita è verificato sulla scheda con la capacità reale?

Calcolatore associato

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.