Cosa succede se ometto le resistenze pullup su linee I2C?


33

Proprio ora mi sono reso conto che i dati I 2 C e le linee di clock (SDA e SCL) devono avere resistori pullup.

Bene, ho costruito un paio di orologi usando il DS1307 RTC (vedi scheda tecnica ) secondo lo schema seguente. Si noti che ho omesso entrambi i resistori pullup.

Schema del mio orologio senza resistori pullup su linee I2C

Entrambi gli orologi funzionano bene, uno di questi funziona da più di 3 mesi. Come è possibile? In ogni caso, volevo sapere:

  1. Cosa succede quando si omettono i pullup I 2 C?

  2. È probabile che la mancanza di pullup danneggi qualcuno di quei due circuiti integrati nella mia scheda?

Sto cercando risposte che affrontino il mio caso specifico di connessione di ATmega328P a un DS1307 RTC come negli schemi che ho fornito, ma se la domanda non diventa troppo ampia, sarebbe utile sapere cosa succede quando i pullup vengono omessi in generale , cioè in altri scenari di operazione I 2 C.

PS. Ho cercato in rete per trovare la risposta, ma sono riuscito a trovare articoli sul dimensionamento dei pullup.

Aggiornamento: sto usando Arduino IDE 1.03 e il mio firmware gestisce l'RTC utilizzando la libreria Arduino DS1307RTC (tramite le sue funzioni RTC.read()e RTC.write()). Quella lib a sua volta usa Wire.hper parlare con RTC.

Aggiornamento 2: Di seguito sono riportate una serie di riprese dell'oscilloscopio che ho scattato per spiegare come funziona l'I 2 C senza i pullup esterni.

Scope shot 1 Scope shot 2

Aggiornamento 3 (dopo l' aggiunta dei pullup I 2 C): Di seguito è un'altra serie di scatti dell'oscilloscopio che ho fatto dopo aver aggiunto le resistenze pullup (4K7) appropriate alle linee I 2 C (sulla stessa scheda). I tempi di salita sono scesi da circa 5 µs a 290 ns. I 2 C è molto più felice ora.

Scope shot 3 Scope shot 4


2
Il tuo codice disabilita i pullup su quei pin?
Ignacio Vazquez-Abrams,

@ IgnacioVazquez-Abrams Nel mio codice non vi è alcuna menzione diretta ai pin SDA e SCD (18 e 19). Gestisco RTC usando la lib DS1307RTC Arduino lib e le sue funzioni RTC.read () e RTC.write ().
Ricardo,

Quella lib a sua volta usa Wire.h per parlare con RTC.
Ricardo,

3
Sì, sicuramente usando i pullup interni. Nota le curve invece di spigoli vivi.
Ignacio Vazquez-Abrams,

Risposte:


28

1) Cosa succede quando si omettono i pullup I2C?

Non ci sarà comunicazione sul bus I 2 C. Affatto. L'MCU non sarà in grado di generare la condizione di avvio I 2 C. L'MCU non sarà in grado di trasmettere l' indirizzo I 2 C.

Ti chiedi perché ha funzionato per 3 mesi? Continuare a leggere.

2) È probabile che la mancanza di pullup danneggi qualcuno di quei due circuiti integrati nella mia scheda?

Probabilmente no. In questo caso particolare (MCU, RTC, nient'altro), sicuramente no.

3) Perché l'MCU è stato in grado di comunicare con il dispositivo slave I 2 C in primo luogo? I 2 C richiede resistori pull-up. Ma non erano inclusi nello schema.

Probabilmente, i pull-up interni sono abilitati su ATmega. Da quello che ho letto 1 , ATmega ha pull-up interni da 20kΩ, che possono essere abilitati o disabilitati dal firmware. 20kΩ è troppo debole per il pull-up I 2 C. Ma se il bus ha una bassa capacità (fisicamente piccola) e la comunicazione è abbastanza lenta, allora 20kΩ può ancora far funzionare il bus. Tuttavia, questo non è un buon design affidabile, rispetto all'utilizzo di resistenze pull-up discrete.

1 Non un ragazzo ATmega me stesso.

aggiornamento: in risposta I 2 C forme d'onda, che sono state aggiunte all'OP
Le forme d'onda nell'OP hanno una costante di tempo di salita molto lunga. Ecco come appaiono in genere le forme d'onda I 2 C.

inserisci qui la descrizione dell'immagine

PIC18F4550, Vcc = + 5V, pull up 2.2kΩ. La forma d'onda mostra SCL. Il tempo di salita su SDA è più o meno lo stesso. Le dimensioni fisiche del bus sono moderate: 2 dispositivi slave, lunghezza PCB ≈100mm.


Grazie per la tua risposta! Sì, ATmega ha dei pull-up che devono essere abilitati nel mio caso. Controllerò il codice e le librerie che sto usando e metterò la scheda attraverso l'ambito. Spero che chiarisca un po 'le cose.
Ricardo,

1
Si consiglia di verificare prima con il foglio dati del dispositivo slave. Se ricordo bene, i pullup su ATMega possono essere ovunque da 30k-60k (dipende da Vcc, temperatura e una serie di altri fattori; non puoi davvero dipendere da loro per una resistenza affidabile). Vuoi assicurarti di inviare abbastanza corrente allo slave per garantire una logica corretta 1. Se la resistenza è troppo grande, il tuo dispositivo slave non riceverà abbastanza corrente e ti troverai nello stesso punto in cui ti trovi adesso.
audiFanatic

4
@audiFanatic +1. A proposito, IMO, compresi i resistori di pull-up nelle schede breakout e installarli di default è un errore. Immagina cosa succede se qualcuno ha più schede breakout su un bus I2C. Ogni pull-up è di solito 2,2kΩ o giù di lì. Le resistenze pull-up su tutte le schede breakout appaiono in parallelo. Il pull-up combinato diventa troppo rigido per I2C. [Maggiori informazioni su questo potenziale problema qui e qui .]
Nick Alexeev

2
@Ricardo Non è un felice bus I2C per i tuoi scatti dell'oscilloscopio [prima serie di scatti dell'oscilloscopio nell'OP]. Ho aggiunto anche uno scatto di portata alla mia risposta.
Nick Alexeev

3
Questo articolo ha alcune forme d'onda di segnali i2c buoni e cattivi: dsscircuits.com/index.php/articles/…
ford

16

La libreria utilizzata e le librerie da cui dipende (Wire) abilitano i pull-up interni di ATMega. Questi sono pull-up deboli e, nell'uso normale, integrano qualsiasi pull-up esterno (due resistori in parallelo). A causa della resistenza relativamente alta da 20k a 70k, non causano molto se problemi con quelli esterni in uso.

Cosa succede quando i pullup I2C vengono omessi?

Ora senza resistori esterni, i deboli pull-up interni sono l'unica cosa che fa salire la linea. A seconda del layout della scheda, della velocità della linea i2c, della frequenza con cui si accede ad essa, delle interferenze esterne, ecc., Potrebbero non funzionare. Sei stato fortunato. Hai dei pull-up, ma non quelli che ti aspettavi.

La mancanza di pullup rischia di danneggiare uno di quei due circuiti integrati nella mia scheda?

Anche senza i pull-up interni, la mancanza di pull-up non danneggerà entrambi i circuiti integrati. La build interna delle linee SCl e SDA del dispositivo i2c è come i transistor NPN. Sono Open Collector , essenzialmente diodi controllati / commutati in corrente.

L'ultima cosa da notare, se i pull-up interni sono attivi, quando ATMega è a 5v e il dispositivo i2c è un dispositivo solo a 3.3v, può causare problemi. Oppure, se i pull-up interni sono attivi e le resistenze esterne collegate a una tensione di 3,3 V o altra tensione, possono anche causare problemi. In sostanza, è un bug intenzionalmente ignorato nella libreria Wire.


4
+1 - You do have pull-ups, just not ones you expected.- Immagino tu l'abbia inchiodato. Grazie!
Ricardo,

Solo così sai che ho aggiunto alcuni scatti di portata per chiarire cosa sta succedendo con la mia configurazione.
Ricardo,

2
@Ricardo sì, vedendo quelli, a 33khz. Un terzo della più bassa velocità specificata da i2c e il segnale è ancora molto cattivo. A 100 khz o 400 khz, non avresti comunicazioni di lavoro. La cosa grandiosa è che molti dispositivi i2c funzionano a una frazione delle velocità massime. Ricorda, i pullup interni possono arrivare a 70k ohm, una tipica resistenza i2c è 4,7k
Passerby

8

In genere è necessario disporre delle resistenze pullup per un circuito di interfaccia I 2 C. Se l'interfaccia è veramente una specifica completa I 2 C su entrambe le estremità dei fili, le linee di segnale senza i resistori non saranno mai in grado di passare al livello alto. Possono rimanere bassi o raggiungere un livello intermedio determinato dalla corrente di dispersione nelle parti a ciascuna estremità. La ragione di ciò è perché vero I 2 C è un bus di drenaggio aperto.

Alcuni dispositivi potrebbero effettivamente avere resistori di pullup su chip nella gamma da 20K a 100K ohm solo per mantenere i pin dell'interfaccia a un livello elevato inattivo quando l' interfaccia I 2 C sulla parte non è in uso. Per interfacce semplici e brevi, questi resistori pullup possono essere sufficienti per fornire la corrente necessaria per tirare in alto le linee mentre vengono segnalati orologi e / o dati.

È difficile capire dal tuo schema, ma in alcuni casi le interfacce I 2 C sono implementate usando pin della porta I / O per uso generale e quindi vengono sbattute nel software. A volte l'implementatore potrebbe non far funzionare i pin I / O in questa configurazione usando una metodologia di drain aperta e questo può giocare un fattore sul motivo per cui un'interfaccia senza resistori pullup può sembrare funzionare.

Alla fine della giornata probabilmente lo devi a te stesso per controllare la segnalazione su uno dei tuoi primi orologi usando un oscilloscopio per vedere se gli 1 e gli 0 sull'interfaccia funzionano entro i livelli di tensione specificati. Quindi saprai per certo se sei stato incredibilmente fortunato con quella implementazione o se uno dei fattori che ho menzionato sopra è in gioco.


4

Che cosa succede quando i pullup I2C sono preferiti?

Molto probabilmente, il bus I2C semplicemente non funzionerà.

La mancanza di pullup rischia di danneggiare uno di quei due circuiti integrati nella mia scheda?

Molto probabilmente no.


3

Le tue linee I2C non funzioneranno affatto. Se non sbaglio, I2C afferma solo segnali bassi, ma non li riporta in uno stato alto, motivo per cui hai bisogno di quei resistori.

Qualsiasi mancanza di pull-up non dovrebbe danneggiare alcun IC.


I pin I2C sono a drain aperto.
Matt Young,

1

I2C è un protocollo logico TTL; quindi i tuoi dati e le linee di clock sono open-drain. In altre parole, l'hardware I2C può solo abbassare queste linee; vengono lasciati fluttuanti quando non sono zero. È qui che entrano in gioco i resistori pull-up. Questo è uno schema semplificato, ma lavora con me per un secondo.

schematico

simula questo circuito - Schema creato usando CircuitLab


Come potete vedere; il resistore di pull-up è necessario per garantire che sull'uscita sia visibile una logica 1 quando la logica TTL non sta abbassando l'uscita. La logica TTL non può guidare le linee in alto, come ho già detto. Se questo non fosse presente, l'uscita sarebbe lasciata fluttuare ed è imprevedibile ciò che potresti vedere all'uscita (per quanto ne sai, il tuo forno a microonde o le disfunzioni intestinali dei tuoi colleghi causate da un certo orso gommoso senza zucchero potrebbero causare il valore da fluttuare).

Ora, se dovessi implementare I2C nel software con un microcontrollore, questo probabilmente non sarebbe un grosso problema in quanto molto probabilmente userà la logica CMOS, che può guidare gli output sia alti che bassi.


1
Sono contento che abbia aiutato.
audiFanatic

2
Non importa se i dispositivi utilizzano la logica TTL o CMOS non importa: le normali uscite TTL e CMOS normali invieranno il segnale sia verso l'alto che verso il basso. I segnali I2C sono TTL a collettore aperto o (più probabilmente) CMOS a drain aperto - in entrambi i casi, il transistor che tirerebbe il segnale in alto manca dallo stadio di uscita della sorgente, quindi sono necessarie resistenze di pull-up tirare in alto i segnali. È possibile che il microcontrollore abbia pull-up interni su quelle pinte.
Peter Bennett,

3
-1 Come ha detto Peter Bennett, molte di queste risposte sono sbagliate. Chiamare segnali TTL "open-drain" è l'omaggio.
Joe Hass,

Si noti che ci sono vantaggi nel fare I2C con TTL, vale a dire che spesso non sono necessari traduttori di livello per gestire componenti con tensioni di alimentazione diverse collegate allo stesso bus. La semplice impostazione della tensione di pullup sulla massima tensione di ingresso accettabile del chip di tensione più bassa è molte volte sufficiente con gli stadi di ingresso TTL . Su CMOS, ciò non funzionerebbe.
Ben Voigt,

@BenVoigt: No - la chiamata della configurazione "richiede una resistenza di pull-up" "TTL" è errata, poiché questa disposizione può essere fatta con CMOS o TTL e DS1307 è una parte CMOS. Il foglio dati Maxim indica chiaramente che le uscite sono a drain aperto e lo schema a blocchi mostra un FET per un'uscita.
Peter Bennett,

0

Quando ho masterizzato I2C con un micro come master che fornisce l'orologio, sono stato in grado di guidare SCL senza pullup.

Tuttavia, SDA deve essere OC con pullup in modo che il dispositivo slave possa abbattere e rispondere correttamente.

Saluti

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.