L'intervistatore voleva sapere perché le resistenze pull-up vengono utilizzate su SDA e SCL quando è possibile implementare anche la logica opposta. C'è una spiegazione del perché l'utilizzo del resistore pull-up è il design scelto?
L'intervistatore voleva sapere perché le resistenze pull-up vengono utilizzate su SDA e SCL quando è possibile implementare anche la logica opposta. C'è una spiegazione del perché l'utilizzo del resistore pull-up è il design scelto?
Risposte:
Per espandere un po 'la risposta di Jon:
Sì, ha tutto a che fare con i MOSFET che si desidera utilizzare.
I MOSFET a canale N sono molto migliori per la logica di commutazione rispetto al canale P perché:
Quindi per una configurazione open-drain (che è I2C) è molto più economico e più semplice crearlo usando una disposizione "inattivo" con MOSFET a canale N anziché "inattivo basso" con MOSFET a canale P.
Una terza opzione sarebbe "idle low" utilizzando MOSFET a canale N, ma per questo è necessario un driver di gate ad alta tensione per aumentare la tensione di gate abbastanza al di sopra della tensione di sorgente per l'accensione del MOSFET. Non pratico per i bus di comunicazione di piccole dimensioni, ma questa disposizione è effettivamente utilizzata abbastanza comunemente nei ponti H per la guida a motore in cui si desidera avere la stessa (o simile) risposta tra il lato superiore e il lato inferiore del ponte H. L'uso di coppie di canali P e N in un ponte H in genere significa che è necessario incorporare una zona morta tra lo spegnimento del canale P e l'accensione del canale N poiché impiega molto più tempo e ciò riduce l'efficienza energetica .
Ma per i bus di comunicazione di piccole dimensioni come I2C in cui sono necessari alta velocità, basso costo e semplicità d'uso, il "minimo alto" con MOSFET a canale N e resistenze pull-up è di gran lunga il più conveniente.
Un altro vantaggio di pull up passivo / pull down attivo è che può funzionare con una gamma di tensioni di alimentazione. Si noti che i livelli digitale alto e basso sono esplicitamente specificati con IIC. Quei livelli sono abbastanza bassi da funzionare con pullup da 3,3 V. È quindi possibile realizzare dispositivi che funzionano con un'alimentazione di 5 V e 3,3 V. In effetti, le linee del bus IIC possono essere tirate fino a 3,3 V, e questo funzionerà con un mix di dispositivi sul bus che sono alimentati separatamente a diverse tensioni.
Mentre NMOS ha un vantaggio rispetto a PMOS in termini di velocità / area, questa differenza è davvero minima quando si parla di un driver su uno o due pin. Dopotutto, la maggior parte dei driver di output sono in realtà tipi di totem che richiedono sia NMOS che PMOS, quindi se avessero scelto una configurazione pull-down o pull-up, avrebbero finito con un driver di output più piccolo di un totem- pilota polare.
Ma c'è un vantaggio delle uscite NMOS a drain aperto su PMOS open drain che non si applica direttamente a I2C: quando VCC è positivo, NMOS open drain consente a chip con livelli VCC diversi di essere collegati tra loro. Questo è (parte del) motivo per cui sono disponibili numerosi CI logici discreti a drain aperto NMOS.
D'altra parte, non sono a conoscenza di QUALSIASI chip PMOS open-drain disponibile sul mercato. In realtà non credo di aver mai incontrato un output PMOS open-drain su qualsiasi chip. (Ho usato ECL molte volte, che ha un output NPN a emettitore aperto con un comportamento simile al drain aperto PMOS)
La disponibilità di chip logici discreti NMOS open drain rende NMOS open drain molto più familiare ai progettisti elettronici rispetto a PMOS open drain.
Sia la familiarità che la disponibilità dei chip discreti (ad esempio per la prototipazione) hanno probabilmente influenzato i progettisti di I2C a scegliere la configurazione NMOS open-drain.
Immagino che la risposta risalga al motivo per cui in primo luogo usiamo una convenzione di base negativa (e questo sicuramente non era onnipresente prima dell'era dei semiconduttori). La ragione di ciò è che i dispositivi N-Channel hanno prestazioni migliori rispetto ai dispositivi P-Channel a causa della fisica dei tipi di portatori di maggioranza utilizzati in essi.
All'inizio dei circuiti integrati, questa era una limitazione piuttosto grave e quindi c'era una preferenza per l'uso di transistor N-Channel (o NPN) per ottenere le massime prestazioni possibili. Da questo abbiamo ottenuto un sistema di messa a terra negativo e uscite open collector che hanno reso necessario l'uso di resistori pull-up anziché pull-down.
Ovviamente il bus I2C non è quasi ad alta velocità, quindi non c'è motivo per cui non possa essere implementato utilizzando resistori pull-down, ma anche alcun vantaggio. Quindi rimaniamo fedeli alla convenzione e usa i pull-up.
Ecco alcune speculazioni (storicamente fondate) ...
Quando hai pullup (piuttosto che push-pull) puoi ovviamente avere più dispositivi in contesa per il bus senza correnti eccessive (una buona cosa - ma potresti ottenere lo stesso con un pulldown).
Ai vecchi tempi dei transistor bipolari, la più semplice logica TTL utilizzava collettori aperti con transistor NPN: tutto è riferito a terra, il che rende semplice definire i livelli di trigger indipendentemente dalla tensione del bus. Inoltre, NPN era più veloce di PNP.
Se ho più dispositivi che funzionano con la propria tensione di alimentazione e che la tensione di alimentazione non è costante, è indispensabile disporre di un pull-up anziché di un pull-down . Se più dispositivi provassero a trascinare il bus nei rispettivi binari di alimentazione, il flusso di corrente sarebbe illimitato e qualcosa potrebbe friggere. Almeno sono tutti d'accordo sul valore del terreno, quindi questo problema non si pone.
Con CMOS, la storia cambia: ora il livello di trigger è a metà binario. Ma gli EE possono essere un gruppo tradizionale. Certamente, a partire dai primi giorni di transistor non ho mai nemmeno messo in dubbio la scelta dei pull-up, per i motivi di cui sopra.
Come ho già detto, questa è solo una speculazione.
Questa potrebbe essere una cosa storica.
I vecchi transistor e circuiti integrati consumavano effettivamente meno energia quando erano a 5 V che a 0 V. Poiché c'era una differenza significativa tra i due livelli, i progettisti hanno scelto di rendere lo stato "inattivo" di 5 V. Quindi, col passare del tempo, i transistor e i circuiti integrati sono migliorati, facendo consumare all'incirca la stessa quantità di energia di entrambi gli stati, ma non vi era alcuna ragione reale per cambiare gli standard.
Ora vedi molte cose come questa - dove il minimo è di 5 V - solo perché gli standard non sono mai cambiati.
Sono passati molti anni da quando ho letto le specifiche I2C, ma ricordo che quando è stato usato per la prima volta le persone spesso lo chiamavano bus a 2 fili con collettore aperto. Ha reso le connessioni e il rilevamento delle collisioni super facili anche per il bit banging. Anche 20 anni fa non era considerato un autobus ad alte prestazioni, solo economico e facile.
Direi che è perché I2C è definito come un bus in cui tutte le unità collegate dovrebbero essere open-drain o open-collector. Ciò significa che può solo guidare il bus in basso, non in alto. (Quando il transistor del drive di uscita è spento, il pin è in uno stato di alta impedenza.)
Questo schema offre alcuni vantaggi, ad esempio che è possibile collegare dispositivi con diverse tensioni di segnalazione e che il bus si auto-guarisce da errori di comunicazione.
Ovviamente, lo standard avrebbe potuto essere definito al contrario, come una configurazione idle-low / active-high, e le altre risposte qui toccano abbastanza bene quell'elemento.
Fonte: LabWorX 1, Mastering I2C Bus, di Vincent Himpe. Un ottimo libro su I2C, il suo background storico, come implementarlo nell'hardware e come usarlo nelle implementazioni di software e debug.
La vera risposta che nessuno ha ancora toccato adeguatamente è che ti consente di collegare dispositivi alimentati da tensioni diverse (purché i pin I / O siano tolleranti). Ad esempio, un dispositivo da 3,3 V può comunicare con un dispositivo spento da 1,8 V, purché l'IO del dispositivo da 1,8 V tolleri tensioni fino a 3,3. Naturalmente ogni dispositivo può pilotare 0 V, ma non tutti i dispositivi potrebbero essere in grado di guidare fino alla tensione dei resistori di pull-up.
Inoltre, la maggior parte dei circuiti integrati possono assorbire più corrente di quanta ne possano reperire. Ciò è dovuto alla dissipazione del calore. Quindi l'affondamento di corrente (terra motrice) dai pull-up è più facile per la parte rispetto all'approvvigionamento di corrente (guida di alta tensione) nei pull-down.