Esiste un valore di resistenza corretto per i resistori pull-up I2C?


72

Il foglio dati della EEPROM 24LC256 afferma che:

Il bus SDA richiede un resistore pull-up a VCC (tipico 10 kΩ per 100 kHz, 2 kΩ per 400 kHz e 1 MHz).

Ho pensato che qualsiasi resistore con un valore di kΩ avrebbe fatto il lavoro (e sembra che la mia EEPROM funzioni bene a frequenze diverse con un resistore da 10 kΩ).

Le mie domande sono:

  • esiste un valore corretto per le resistenze pull-up?
  • esiste una legge / regola per determinare questo valore?
  • in che modo diversi valori di resistenza influiscono sul bus dati I²C?

Risposte:


66

La resistenza di pullup corretta per il bus I 2 C dipende dalla capacità totale sul bus e dalla frequenza con cui si desidera far funzionare il bus.

La formula dalla scheda tecnica ATmega168 (che credo provenga dalle specifiche ufficiali I 2 C) è -

Freq<100kHzRmin=Vcc-0.4V3mA,Rmax=1000nsCautobus

Freq>100kHzRmin=Vcc-0.4V3mA,Rmax=300nsCautobus

Il Microchip 24LC256 specifica una capacità massima dei pin di 10pF (che è abbastanza tipica). Contare il numero di dispositivi in ​​parallelo sul bus e utilizzare la formula sopra per calcolare un intervallo di valori che funzionerà.

Se si spengono le batterie, utilizzare i valori che si trovano nella fascia alta dell'intervallo. Se non ci sono limiti di potenza sulla fonte di alimentazione o problemi di dissipazione di potenza nei circuiti integrati, utilizzerei i valori nella parte inferiore dell'intervallo.

Vendo alcuni kit con un I 2 C RTC (DS1337). Includo resistori 4K7 nel kit che sembra un ragionevole compromesso per la maggior parte degli utenti.


In genere immagino che il bus sia inattivo (disasserito) la maggior parte delle volte, quindi per un'applicazione a batteria ci sono problemi più importanti da affrontare rispetto al tentativo di ottimizzare i pullup I2C proprio così: P
Nick T

5
l'unica cosa che aggiungerei è un buffer sopra la capacità sommata dei dispositivi sul bus. Anche la traccia stessa e i giunti di saldatura dai cuscinetti ai perni avranno una certa impedenza. Su bus più lunghi la capacità della traccia / filo può essere maggiore della capacità dei pin dei dispositivi. Quando si progettano schede di produzione, di solito non determino il valore di pull up finale fino a quando non ho un prototipo in mano e non posso usare il bus con vari valori.
Segna il

14

È logico che frequenze più alte richiedano pull-up di resistenza inferiori: una resistenza inferiore caricherà / scaricherà più rapidamente la capacità del cavo, il che si traduce in bordi più ripidi. Con gli impulsi più ampi di frequenze più basse un bordo meno ripido non influenzerà altrettanto la forma dell'impulso.

Pertanto, la specifica I2C fornisce i valori massimi per le resistenze di pull-up in funzione della capacità del bus per tre classi di velocità:

inserisci qui la descrizione dell'immagine

I valori minimi sono definiti in funzione della tensione del bus e dovrebbero limitare la corrente attraverso i driver.


3
3 anni dopo Texas Instruments ha scritto una nota applicativa che ha un significato molto vicino a questa risposta.
Nick Alexeev

Articolo EDN: calcoli di progettazione per comunicazioni I2C solide . [Sto solo accumulando materiale di riferimento.]
Nick Alexeev

11

Esiste un intervallo di valori corretto, tuttavia è difficile descrivere esattamente quale sia tale intervallo. Generalmente, 10k funziona.

Le uscite digitali hanno una capacità specifica di generare o assorbire corrente. Se la tua uscita è in grado di assorbire 5 mA e l'uscita è stata collegata tramite un pull-up a 5 V e quindi impostata su 0, avrai bisogno di una resistenza minima di 1k. Se si utilizza meno di 1k, l'uscita non sarà in grado di assorbire abbastanza corrente per portare il pin fino a 0 V. Se usi un valore più grande, come 10k, il pin deve solo scendere di 0,5 mA, che è molto inferiore alla sua valutazione.

Gli ingressi digitali hanno una corrente di dispersione specificata. Questo è un po 'come la quantità di corrente necessaria per "mantenere" uno 0 o 1 in un ingresso. Se la resistenza di pull-up è troppo grande, non sarà in grado di superare la corrente di dispersione. Se supera appena la corrente di dispersione, qualsiasi rumore nel circuito potrebbe essere sufficiente per modificare l'ingresso.

Quando si utilizzano uscite digitali che possono assorbire e generare corrente ("driver totem pole", "driver push-pull"), si potrebbe essere tentati di non utilizzare resistori pull-up o pull-down. Tuttavia, è molto importante che gli ingressi CMOS non possano fluttuare o che possano estrarre corrente eccessiva ... ed è molto facile dimenticare che i pin MCU bidirezionali di solito si presentano come ingressi!


I2C e altri protocolli simili usano uscite "open drain" (o "open collector"). Invece di avere uscite che possono tirare su e giù, e le uscite di scarico aperte possono solo tirare verso il basso. Ecco perché è necessaria la resistenza di pull-up esterna. Esistono ora ulteriori restrizioni sulla gamma di resistori pull-up; il valore di pull-up formerà un circuito RC con la capacità del bus. Un valore troppo piccolo impedisce ancora una volta ai driver di uscita di assorbire abbastanza corrente per portare il pin fino a zero. Tuttavia, un valore troppo grande impiegherà troppo tempo a caricare la capacità del bus.

Se ci sono tempi di setup / hold che non ti è permesso violare, questi ti aiuteranno a determinare una costante di tempo RC. La capacità del bus è in gran parte determinata dal layout del PCB, quindi è possibile scegliere un valore R che si combina con il C per fornire un valore che sia comodamente entro il tempo di configurazione / attesa per l'ingresso digitale.


7

Valori di pull-up bassi (resistenza inferiore) possono migliorare i bordi delle transizioni del segnale ma a volte possono essere troppo rigidi: se i dispositivi sul bus non riescono ad affondare la corrente di pull-up, si ottiene una logica "bassa" che non è poi così bassa , che può causare errori di comunicazione (e molto dolore).

Andrei con la massima resistenza al pull-up che ti dà comunicazioni affidabili.


5

Per le basse frequenze il valore non ha molta importanza, ma per le alte frequenze può avere un effetto di filtraggio sul segnale, in combinazione con altre capacità nel circuito, motivo per cui raccomandano valori diversi per velocità diverse.


2

Un problema che non ho ancora menzionato è il consumo di energia. Se si utilizza un'alimentazione a 3,3 volt, una resistenza da 3,3 K a terra sprecherà 1 mA di corrente (3,3 mW di potenza) ogni volta che un'uscita è bassa. L'uso di una resistenza da 10 K ridurrebbe sia la corrente che la potenza di un fattore tre. Se ci sarà molta comunicazione sul bus I2C, quel consumo di energia potrebbe finire per essere una porzione significativa del consumo totale di energia, specialmente se il bus potrebbe rimanere basso per lunghi periodi di tempo. Ad esempio, se uno sta leggendo 100 byte / secondo ma dopo aver letto ogni byte il bus viene lasciato con il dispositivo che emette il primo bit del byte successivo e la maggior parte di questi byte ha l'MSB azzerato, il bus può spendere il 90% di il tempo con SCL e SDA basso. A seconda di cos'altro sta facendo il sistema, ciò potrebbe aumentare enormemente il consumo di energia.

Per risparmiare energia, può essere utile disporre di un resistore "pull-up" collegato a un pin I / O anziché a VDD. Anche se non ho visto implementazioni hardware I2C che offrono supporto per questo, avere i dati di uscita master su un pin I / O separato collegato al bus tramite un resistore anziché utilizzare un driver open-collector e un resistore pull-up fisso eviterà spreco di corrente quando il master vuole emettere uno "0". Inoltre, se il master lascerà SCK basso per un po 'senza preoccuparsi di cosa c'è su SDA, il master potrebbe disabilitare il pull-up fino a quando non è pronto per qualche altra comunicazione. Se nessuno dei dispositivi deve utilizzare il clock stretching, il master può semplicemente utilizzare un'uscita diretta per SCK e non preoccuparsi di alcun pull-up su quel filo.

Se si utilizza il software bit-banging con un processore veloce e si desidera ottenere buone prestazioni nonostante l'elevata capacità del bus, l'approccio di cui sopra può essere combinato con l'uso di pull-up deboli integrati nel processore. Durante la lettura dei dati, attivare un pull-up molto forte, brevemente, immediatamente dopo ogni fronte di discesa di SCK, quindi passare a un pull-up debole. Il forte pull-up tirerà la linea in alto nonostante la capacità, e una volta che la linea sarà tirata in alto, il pull-up debole sarà in grado di mantenerla alta. Anche se un dispositivo avrebbe problemi a tirare la linea in basso contro il forte pull-up, sarebbe in grado di farlo una volta spento il forte pull-up.



-1

Ecco le forme d'onda, per 400kiloBits / secondo (200KHz 101010 forma d'onda). RC è 4.7K ohm e 212pF. Il valore RC consente l'assestamento di 2 TAU.

inserisci qui la descrizione dell'immagine


Questa risposta è sbagliata. L'orologio a 200 kHz fornisce 200 kb / s, non 400. Solo la fronte di salita è influenzata dalla resistenza al pull-up. Le trame sembrano confuse, quasi come se ci fosse una sorta di modulazione in atto. Le quantità fisiche e le loro unità sono scritte con spazio (o spazio sottile) in mezzo. Tau è un simbolo, non un'abbreviazione.
venny,

@venny Queste sono le forme d'onda tipiche per un bus che corre troppo veloce per il tempo di assestamento. Con solo 2 TAU di assestamento, non vi è alcuna cima piatta per le forme d'onda, quindi "una sorta di modulazione"; se questo fosse uno schema pseudo-casuale, la variabilità dell'insediamento sarebbe molto evidente; leggere su "occhio dati". Infine, l'orologio a 200 KHz ha un valore alto per 2,5 uS, quindi basso per 2,5 uS; il periodo di 2,5 uS è esattamente i dati a 400 KHz che ho citato.
analogsystemsrf,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.