Perché I2C è progettato per funzionare con resistori pull-up e non pull-down?


22

Comprendo che in I2C, le linee SCL e SDA utilizzano resistori pull-up e i driver dei pin sono dispositivi NPN a collettore aperto che possono guidare i pin a terra. Ciò offre a I2C il vantaggio che ora lo stesso bus può essere condiviso con più slave e anche se due o più slave tentano accidentalmente di guidare il bus contemporaneamente, non causerà alcun danno al sistema.

Ma questo può essere fatto anche usando driver di drain aperti PNP e resistori pull-down su linee SDA e SCL. Anche cose come lo stretching dell'orologio e l'arbitrato multi-master possono essere raggiunti.

L'attuale implementazione del protocollo I2C offre vantaggi rispetto all'implementazione alternativa suggerita sopra?


1
i transistor open collector sembravano essere la maggioranza nei circuiti integrati negli anni '80.
PlasmaHH,

9
@PlasmaHH Penso che la ragione sia stata NPN (per quanto ricordo vagamente) ha una maggiore capacità corrente per area a causa della maggiore mobilità elettronica nel substrato, quindi è più facile costruire stadi di uscita "forti" con quello.
Marcus Müller,

7
@ MarcusMüller In effetti, era (ed è ancora) vero. I NPN e i feti NMOS sono "più forti" quando hanno le stesse dimensioni. Nella CMOS è tipico un fattore da 2 a 3. Per PNP vs NPN dipende dal processo di fabbricazione, ma quasi sempre i PNP sono molto più difficili e complessi rispetto agli NPN. Anche iniziare con un substrato drogato con P (come la maggior parte dei processi) sottolinea questo (NPN migliori).
Bimpelrekkie,

@Bimpelrekkie Ricordo un fattore 2.3 dalla mia lezione di fisica a stato solido fino a questa data :-)
Winny

1
Se il bus I2C esistente viene accidentalmente messo a terra per qualsiasi motivo, allora si assorbirà solo la corrente di resistenza di pull-up. Con la disposizione complementare di driver high-active e resistenze pull-down, danneggeresti driver semplici dagli anni I2C. Quando si passa da una scheda all'altra, è necessario considerare il cortocircuito verso il telaio. Ma è solo uno dei tanti motivi per andare in auto-basso-alto-basso, il resto dei quali altri hanno risposto di seguito.
TonyM,

Risposte:


30

Elettricamente ha senso perché la terra è l'unica connessione comune a tutti i dispositivi su un bus IIC. Questa è una limitazione molto meno che forzare l'alimentazione come connessione comune a tutti i dispositivi IIC, come sarebbe richiesto se le linee fossero spinte in alto e fluttuassero in basso tramite pulldown.

Si noti che non tutti i dispositivi IIC devono essere alimentati dalla stessa rete o dalla stessa tensione. Ciò non sarebbe vero se entrambe le linee di bus dovessero essere guidate alla singola tensione di alimentazione comune.


5
Non il mio downvote, e devi avere tanti anni di esperienza I2C come me, quindi il mio punto qui è probabilmente un malinteso, ma: "I dispositivi IIC non devono tutti essere alimentati dalla [...] stessa tensione " potrebbe essere visto che implica che i dispositivi I2C alimentati a 5 V e 3 V (ad esempio) potrebbero condividere lo stesso bus I2C, senza ulteriori componenti o precauzioni (poiché non hai menzionato i traduttori di livello). E ovviamente non possono farlo, dato che le soglie logiche I2C di ciascun dispositivo sono ora riferite al proprio Vcc. Forse la mancanza di una menzione esplicita dei traduttori di livello ha causato il downvote?
SamGibson,

13
A seconda dei pull-up e dei pin I / O utilizzati, le comunicazioni in stile I2C possono funzionare senza problemi tra dispositivi da 5 V e 3,3 V. L'uso di pull-up da 10 K a 5 V, ad esempio, consentirebbe l'utilizzo di dispositivi a 3,3 V se dispongono di ingressi non serrati con tolleranza a 5 V o se possono tollerare 150uA nei loro diodi di protezione. E l'uso di pullup a 3,3 V funzionerà, almeno a velocità più basse, per l'interfacciamento con dispositivi a 5 V che hanno una soglia di ingresso alta che è di 2,5 V o meno.
supercat

7
@Sam: attualmente i dispositivi IIC 5 V e 3,3 V possono trovarsi sullo stesso bus IIC. I dispositivi con livelli di tensione fissi indipendentemente dalla loro tensione di alimentazione sono specificatamente menzionati e sanzionati nelle specifiche IIC.
Olin Lathrop,

5
Nel vecchio documento "Il bus I2C e come utilizzarlo" di Philips, la sezione 10.0 menziona le soglie di ingresso fisse dei primi dispositivi I2C 5V (tipicamente NMOS). Quindi dice: " I dispositivi I2C-bus con livelli di ingresso relativi a VDD devono avere una linea di alimentazione comune alla quale è collegata anche la resistenza di pull-up " (il mio grassetto). @supercat - hai menzionato: "I dispositivi a 5 V che hanno una soglia di ingresso alta che è di 2,5 V o inferiore " Puoi aiutarmi con un esempio di tale dispositivo? Leggendo vecchi documenti I2C, posso trovare solo menzioni di un minimo I2C Vih fisso 3V, per quei vecchi dispositivi 5V. Grazie.
SamGibson,

2
@SamGibson: i dispositivi con livelli di ingresso correlati a VDD potrebbero dover funzionare con tensioni che si trovano entro un certo intervallo l'uno dall'altro. Quanto devono essere vicini dipende da come le tensioni sono correlate al VDD. La scheda tecnica Microchip per PIC16F877 (una parte a 5 V selezionata arbitrariamente) elenca V (IH) per i suoi pin normali come 0,25 VDD + 0,8 V, sebbene per i suoi ingressi Schmitt Trigger sarebbe molto più alto. A VDD = 5,2 V, un ingresso normale avrebbe un V (IH) specificato di 2,1 volt; Non ho visto una specifica per l'hardware I2C V (IH), sebbene il tipico grafico delle prestazioni suggerisca che sia tra input normali e ST.
supercat

24

Ai vecchi tempi, i conducenti TTL erano molto più bravi a tirare giù un segnale che a tirarlo su. Pertanto, protocolli come I2C, ma anche linee di interruzione, reset e altri, sono stati tutti implementati usando un pull-up con pull-down distribuito.


8
Nei migliori giorni moderni, lo stesso vale ancora poiché è una proprietà intrinseca dei semiconduttori. Oggi non costa tanto ottenere un transistor pull up più robusto per gestire la stessa corrente.
Arsenal,

2
Mi è stato detto che con CMOS è anche molto più facile avvicinarsi alla tensione della rete elettrica. Un altro "problema" in cui il TTL stava lottando. (Forse dovremmo considerarci fortunati per questo in quanto ha permesso all'interfaccia CMOS 3V3 di interfacciarsi con TTL)
Oldfart

14

È più facile utilizzare la terra come riferimento comune tra i sottosistemi che potrebbero avere tensioni di alimentazione variabili. Se si utilizzano transistor PNP per raggiungere una tensione di alimentazione, tutti i sottosistemi dovrebbero essere collegati alla stessa alimentazione.


8

Le buone risposte abbondano qui, ma c'è anche un'altra ragione.

Se lo stato di riposo del bus è a terra, non c'è modo di sapere se il bus è collegato o è semplicemente sospeso nello spazio.

È normale che il pull-up si trovi sul dispositivo master. Gli schiavi di solito non hanno un pull-up. Questo perché la corrente di pull-down che sarebbe richiesta per affermare un livello basso aumenterebbe con il numero di dispositivi collegati al bus.

Uno slave, quando collegato al bus, può quindi rilevare che la linea è alta (supponendo che non venga utilizzata) e sapere che il bus è effettivamente lì e silenzioso. Questo non sarebbe il caso di un bus con polarizzazione a terra.


Per rilevare il bus che viene tirato in alto, uno schiavo deve tirarlo in basso in primo luogo. Non sono sicuro del perché una procedura simile non sarebbe possibile con la polarità opposta.
Dmitry Grigoryev il

@DmitryGrigoryev perché dovrebbe tirare qualcosa che è già molto basso?
Trevor_G,

5

Se capisco correttamente la domanda, un aspetto è:

  • Perché usi resistori pull-up e transistor NPN invece di resistori pull-down e transistor PNP?

Prima di tutto dovresti notare che non usi transistor bipolari (NPN, PNP) ma MOSFET (che esistono in quattro diverse varianti).

I dispositivi che utilizzano la variante " pull-up e NPN " utilizzano un MOSFET di miglioramento n-channel . Poiché la sorgente di questo MOSFET è collegata a terra, la tensione gate-source (che controlla il flusso di corrente) è uguale alla tensione tra gate e terra. Quindi il MOSFET può essere controllato usando una tensione compresa tra 0 e Vdd.

Vi sarebbero tre possibilità per implementare la variante " pull-down e PNP ":

  • Utilizzo di un MOSFET di miglioramento del canale p

    Sui circuiti integrati NMOS o CMOS i MOSFET a canale p con caratteristiche comparabili (resistenza ecc.) Richiedono più spazio dei MOSFET a canale n.

    Nella microelettronica lo spazio è denaro, quindi MOSFET a canale p evitati se possibile.

  • Utilizzo di un MOSFET di miglioramento n-channel

    Ciò richiederebbe che l'uscita del circuito logico che guida il transistor abbia una tensione "BASSA" della tensione di alimentazione (ad es. + 5 V) e una tensione "ALTA" sopra la tensione di alimentazione (ad es. + 10 V quando viene fornito il resto del circuito con + 5V).

    Il motivo: la tensione di terra della sorgente sarà Vdd quando il MOSFET sta conducendo. La tensione gate-source deve essere positiva, quindi la tensione tra gate e terra deve essere anche più alta.

    Avresti bisogno di due alimentatori di tensione - e un circuito che sposta l'uscita del circuito logico da 0 ... + 5V a + 5V ... + 10V ...

  • Utilizzo di un MOSFET a svuotamento del canale n

    Purtroppo non posso dirti molto su questa soluzione. Tuttavia, ho trovato alcune pagine usando Google che affermano che i MOSFET a svuotamento sono più difficili da produrre rispetto ai MOSFET a valorizzazione e sono evitati per questo motivo.

    So dall'elettronica di potenza (non dalla microelettronica) che la variante "due alimentatori" descritta sopra è persino preferita rispetto ai MOSFET a svuotamento. (Ma non posso dirti perché.)

    MODIFICA Usando MOSFET a svuotamento del canale n probabilmente avresti bisogno di una tensione negativa (es. -5 V) quindi avresti anche bisogno di due tensioni di alimentazione ...


0

C'è anche un ulteriore vantaggio in più per avere linee di dati comuni di pull-up (oltre a VCC e pull-down comuni):

Anche se l'intenzione originale era quella di collegare i dispositivi sullo stesso PCB a una distanza di pochi pollici, ha avuto abbastanza successo, quindi ora non è raro avere le linee lunghe coppie di piedini e collegare "dispositivi" che potrebbero essere computer o qualcosa di uguale complessità, con alcuni dispositivi che hanno le proprie fonti di alimentazione (di diversa qualità, diciamo che si collega qualcosa a presa a muro con qualcosa alimentato a batteria). È meglio, se la connessione funziona "almeno bene" anche in condizioni non ideali e fuori specifica.

E molti di questi dispositivi collegati possono essere in qualche modo collegati anche con altri mezzi, quindi solo comunicazione I2C. Di solito quando si collegano dispositivi insieme si connette common ground- a volte come parte di altre funzioni, a volte solo perché è montato su una custodia in metallo e anche i dispositivi sono collegati a terra con la custodia (o con un dispositivo di raffreddamento comune o qualcosa del genere) o potrebbero esserci essere cavo schermato con schermatura messa a terra all'interno - che collega anche i motivi.

Se si collegano anche direttamente le linee elettriche (VCC) di tali dispositivi, si verificheranno problemi quando tali linee sarebbero naturalmente sotto tensione diversa (certo, si potrebbe dire 5 V qua e là, ma a seconda della costruzione e delle tolleranze parziali delle fonti di energia esso potrebbe anche essere 4,9 V o 5,2 V o addirittura cambiare, se è alimentato a batteria e talvolta fa funzionare alcuni motori, facendo scendere e aumentare la potenza nel tempo).

In tal caso esiste effettivamente un cortocircuito tra quelle fonti di energia di una parte a Volt e, a seconda delle fonti (e della resistenza dei modi), potrebbero fluire correnti relativamente elevate con conseguente non solo spreco di energia e aumento di calore, ma forse anche in danno ( o accorciando la vita) di alcune di queste fonti. Che non va bene.

Avere messa a terra comune e pull-up evita tali problemi: la terra è messa a terra e le resistenze pullup consentono solo una corrente incrociata molto piccola anche se il VCC differisce molto sui dispositivi.


1
Questo è essenzialmente lo stesso della risposta di Dave Tweed.
Janka il

-2

Non è necessario inviare così tanta potenza attraverso il chip, se è pull up.

Poiché il chip non guida nulla, sta semplicemente creando un short per portare il bus a 0 e facendo un open per portarlo a 1.

Se fosse abbattuto, dovresti inviare energia attraverso il chip per guidare il bus a 1. Se il bus sembra essere un cortocircuito accidentale, potrebbe essere molta energia che guidi attraverso quel chip per provare a spingerlo fino a 1.

Disclaimer: sono un EE piuttosto schifoso a questo punto.


3
Benvenuti in EE.SE. " Non è necessario inviare così tanta potenza attraverso il chip, se è pull up. " Se le resistenze pull-up e pull-down hanno le stesse dimensioni, le correnti saranno le stesse. Il pull-up richiederà la corrente proveniente dal chip guidato e affondato nel chip di guida. Il pull-down richiederà che la corrente provenga dal chip di guida e venga affondata dal chip di guida. Un corto accidentale potrebbe essere V + o terra.
Transistor,
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.