Warum hat I²C nur Pull-up-Widerstände (Interviewfrage)?


15

Der Interviewer wollte wissen, warum Pull-up-Widerstände bei SDA und SCL verwendet werden, wenn auch die entgegengesetzte Logik implementiert werden kann. Gibt es eine Erklärung dafür, warum die Verwendung von Pull-up-Widerständen das gewählte Design ist?



Nur als Kommentar: Das Ultra-Fast-Mode-I2C-Bus-Protokoll funktioniert als Push-Pull-Konfiguration, siehe nxp.com/documents/user_manual/UM10204.pdf , Abschnitt 3.2 Ultra-Fast-Mode-I2C-Bus-Protokoll
Kvegaoro,

Ich frage mich, warum NXP kein ultraschnelles I2C-Protokoll spezifiziert hat, das bidirektionales SDA und unidirektionales SCK verwendet, bei dem das Master-Laufwerk SDA hart war, als es ein High ausgeben wollte, und der Master lange genug warten musste, bis die Leitung hochgezogen wurde in fällen wo es egal wäre was ein sklave zu sagen hat?
Supercat

Hat der Interviewer seine Version einer Antwort gegeben?
Kupfer.hat

Antworten:


14

Um Jons Antwort ein wenig zu erweitern:

Ja, es hängt alles davon ab, welche MOSFETs Sie verwenden möchten.

N-Kanal-MOSFETs sind für die Schaltlogik viel besser als P-Kanal, weil:

  • Sie haben im Allgemeinen einen viel geringeren Widerstand ( )RDSÖN
  • Sie schalten sich schneller ein und aus

Daher ist es für eine Open-Drain-Konfiguration (was I2C ist) viel billiger und einfacher, sie mit einer "Idle-High" -Anordnung mit N-Kanal-MOSFETs zu erstellen, als mit P-Kanal-MOSFETs "Idle-Low".

Eine dritte Option wäre "Leerlauf niedrig" mit N-Kanal-MOSFETs, aber dafür benötigen Sie einen Hochspannungs-Gate-Treiber, um die Gate-Spannung weit genug über die Source-Spannung anzuheben, damit der MOSFET einschaltet. Nicht praktisch für kleine Kommunikationsbusse, aber diese Anordnung wird häufig für H-Brücken zum Antreiben von Motoren verwendet, bei denen Sie das gleiche (oder ein ähnliches) Verhalten zwischen der hohen und der niedrigen Seite der H-Brücke wünschen. Die Verwendung von P-Kanal- und N-Kanal-Paaren in einer H-Brücke bedeutet in der Regel, dass Sie eine Totzone zwischen dem Ausschalten des P-Kanals und dem Einschalten des N-Kanals einschließen müssen, da dies sehr viel länger dauert. Dies verringert Ihre Energieeffizienz .

Für kleine Kommunikationsbusse wie I2C, bei denen hohe Geschwindigkeit, niedrige Kosten und einfache Verwendung erforderlich sind, ist der "Idle High" mit N-Kanal-MOSFETs und Pull-up-Widerständen bei weitem der kostengünstigste.


Ich bin nicht einverstanden damit, dass "hohe Geschwindigkeit" bei I2C eine Rolle spielt (zumindest in der ursprünglichen Konzeption). Resistive Klimmzüge sind kaum der Weg, um eine hohe Geschwindigkeit zu erreichen, wenn dies das Ziel ist.
Das Photon

1
Verwechseln Sie das Umschalten mit höherer Geschwindigkeit nicht mit höherer Bandbreite. High-Speed-Switching sorgt für deutlich schärfere Kanten und damit für eine zuverlässigere Kommunikation.
Majenko

1
Resistive Klimmzüge sind auch nicht der Weg, um eine höhere Schaltgeschwindigkeit zu erreichen.
Das Photon

Dies ist der Grund, warum die Auswahl der richtigen Widerstandswerte für I2C wichtig ist und warum Arduino die internen Pullups standardmäßig nicht verwendet.
Majenko

Ja, Sie können Ihre Widerstände auswählen, um bessere Anstiegszeiten zu erzielen. Das gesamte System ist jedoch immer noch langsamer und / oder verbraucht mehr Strom als bei Totempfahl-Treibern (was natürlich weitere Kosten verursachen würde).
Das Photon

12

Ein weiterer Vorteil des passiven Hochziehens / aktiven Herunterziehens besteht darin, dass es mit einem Bereich von Leistungsspannungen arbeiten kann. Beachten Sie, dass die digitalen High- und Low-Pegel bei IIC explizit angegeben werden. Diese Pegel sind niedrig genug, um mit 3,3-V-Pullups zu arbeiten. Es können daher Geräte gebaut werden, die sowohl mit 5 V als auch mit 3,3 V Spannung arbeiten. Tatsächlich können die IIC-Busleitungen auf 3,3 V hochgezogen werden, und dies funktioniert mit einer Mischung von Geräten am Bus, die separat mit unterschiedlichen Spannungen versorgt werden.


Ich bin fast zu 100% das ist die Antwort, nach der sie gesucht haben. Ich habe einen Freund, der das bei einem Interview für eine große CPU-Herstellerfirma gefragt hat (rate welche) und das war die Antwort, nach der sie gesucht haben.
user34920

6

NMOS hat zwar einen Vorteil gegenüber PMOS in Bezug auf Geschwindigkeit / Fläche, aber dieser Unterschied ist sehr gering, wenn Sie von einem Treiber mit einem oder zwei Pins sprechen. Schließlich handelt es sich bei den meisten Ausgabetreibern tatsächlich um Totempfahltypen, für die sowohl NMOS als auch PMOS erforderlich sind. Unabhängig davon, ob sie sich für eine Pulldown- oder eine Pullup-Konfiguration entschieden hätten, wäre am Ende ein kleinerer Ausgabetreiber als ein Totempfahltreiber vorhanden gewesen. Pole Fahrer.

NMOS-Open-Drain-Ausgänge bieten jedoch einen Vorteil gegenüber PMOS-Open-Drain-Ausgängen, der nicht direkt für I2C gilt: Wenn VCC positiv ist, können mit NMOS-Open-Drain-Ausgängen Chips mit unterschiedlichen VCC-Pegeln miteinander verbunden werden. Dies ist (ein Teil davon), warum zahlreiche diskrete NMOS-Open-Drain-Logik-ICs verfügbar sind.

Andererseits sind mir keine verfügbaren PMOS-Open-Drain-Chips auf dem Markt bekannt. Tatsächlich glaube ich nicht, dass ich jemals auf einem Chip auf einen PMOS-Open-Drain-Ausgang gestoßen bin. (Ich habe ECL oft verwendet, das einen NPN-Open-Emitter-Ausgang mit ähnlichem Verhalten wie PMOS-Open-Drain hat.)

Die Verfügbarkeit von diskreten NMOS-Open-Drain-Logikchips macht NMOS-Open-Drain für Elektronikdesigner weitaus bekannter als PMOS-Open-Drain.

Sowohl die Vertrautheit als auch die Verfügbarkeit der diskreten Chips (zum Beispiel für das Prototyping) haben die Entwickler von I2C wahrscheinlich dazu veranlasst, die NMOS-Open-Drain-Konfiguration zu wählen.


6

Ich denke, die Antwort geht darauf zurück, warum wir überhaupt eine negative Grundkonvention verwenden (und diese war vor der Halbleiterzeit mit Sicherheit nicht allgegenwärtig). Der Grund dafür ist, dass N-Kanal-Geräte aufgrund der Physik der in ihnen verwendeten Typen von Mehrheits-Trägern eine bessere Leistung als P-Kanal-Geräte aufweisen.

In den Anfängen von integrierten Schaltkreisen war dies eine ziemlich schwerwiegende Einschränkung, und so wurde die Verwendung von N-Kanal- (oder NPN-) Transistoren bevorzugt, um die höchstmögliche Leistung zu erzielen. Daraus haben wir ein negatives Massesystem und Open-Collector-Ausgänge, die die Verwendung von Pull-Up-Widerständen anstelle von Pull-Downs erforderten.

Natürlich ist der I2C-Bus nicht sehr schnell, daher gibt es keinen Grund, warum er nicht mit Pulldown-Widerständen implementiert werden könnte, aber auch keinen Vorteil. Also halten wir uns an die Konvention und verwenden Klimmzüge.


2

Hier sind einige (historisch begründete) Spekulationen ...

Wenn Sie Pullup (anstatt Push-Pull) verwenden, können Sie offensichtlich mehrere Geräte für den Bus in Konflikt bringen, ohne dass übermäßige Ströme fließen (eine gute Sache - aber Sie könnten dasselbe mit einem Pulldown erreichen).

In den "alten Tagen" der Bipolartransistoren verwendete die einfachste TTL-Logik offene Kollektoren mit NPN-Transistoren - alles ist auf Masse bezogen, wodurch die Triggerpegel unabhängig von der Busspannung einfach zu definieren sind. NPN war auch schneller als PNP.

Wenn mehrere Geräte mit ihrer eigenen Versorgungsspannung arbeiten und diese Versorgungsspannung nicht konstant ist, ist ein Pull-up und kein Pull-down unabdingbar . Wenn mehrere Geräte versuchen, den Bus auf ihre jeweiligen Versorgungsschienen zu ziehen, ist der Stromfluss nicht eingeschränkt und es kann etwas braten. Zumindest sind sich alle über den Wert des Bodens einig, so dass dieses Problem nicht auftritt.

Mit CMOS ändert sich die Geschichte - jetzt ist der Trigger-Level Mid Rail. Aber EEs können ein traditioneller Haufen sein. Natürlich habe ich aus den frühen Transistortagen die Wahl der Klimmzüge aus den oben genannten Gründen nie in Frage gestellt .

Wie gesagt, das ist nur Spekulation.


1

Dies kann eine historische Sache sein.

Alte Transistoren und integrierte Schaltkreise verbrauchten bei 5 V tatsächlich weniger Strom als bei 0 V. Da es einen signifikanten Unterschied zwischen den beiden Pegeln gab, entschieden sich die Entwickler, den Ruhezustand auf 5 V zu setzen. Mit der Zeit verbesserten sich dann die Transistoren und ICs, sodass beide Zustände ungefähr die gleiche Menge an Leistung verbrauchten, aber es gab keinen wirklichen Grund, die Standards zu ändern.

Jetzt sehen Sie viele Dinge wie diese - wo der Leerlauf 5 V beträgt - nur weil sich die Standards nie geändert haben.


Es ist immer noch wahr, dass die meisten ICs mehr Strom verbrauchen können als sie verbrauchen können, daher ist es immer noch anwendbar.
Joel B

1

Es ist viele Jahre her, dass ich die I2C-Spezifikation gelesen habe, aber ich erinnere mich, als sie zum ersten Mal verwendet wurde, wurde sie oft als 2-Draht-Open-Collector-Bus bezeichnet. Es machte die Verbindungen und die Kollisionserkennung super einfach, auch wenn sie etwas durchschlagen mussten. Noch vor 20 Jahren galt er nicht als Hochleistungsbus, nur billig und einfach.


1

Ich würde sagen, das liegt daran, dass I2C als ein Bus definiert ist, bei dem alle angeschlossenen Einheiten Open-Drain- oder Open-Collector-Einheiten sein sollten. Dies bedeutet, dass der Bus nur niedrig und nicht hoch fahren kann. (Wenn der Ausgangstreibertransistor ausgeschaltet ist, befindet sich der Pin in einem hochohmigen Zustand.)

Dieses Schema bietet einige nette Vorteile, zum Beispiel, dass Sie Geräte mit unterschiedlichen Signalspannungen anschließen können und der Bus sich von Kommunikationsfehlern selbst heilt.

Offensichtlich hätte der Standard auch andersherum definiert werden können, als eine Konfiguration im Leerlauf-Niedrig- / Aktiv-Hoch-Modus, und die anderen Antworten hier berühren dieses Element ziemlich gut.

Quelle: LabWorX 1, Mastering the I2C Bus, von Vincent Himpe. Ein wirklich gutes Buch über I2C, seinen historischen Hintergrund, wie man es in Hardware implementiert und wie man es in Software- und Debug-Implementierungen verwendet.


1

Die eigentliche Antwort, die noch niemand angemessen angesprochen hat, ist, dass Sie damit Geräte anschließen können, die mit unterschiedlichen Spannungen versorgt werden (solange die E / A-Pins tolerant sind). Beispielsweise kann ein 3,3-V-Gerät mit einem Gerät kommunizieren, das auf 1,8 V abgeschaltet ist, solange die E / A des 1,8-V-Geräts Spannungen bis zu 3,3 V tolerieren. Natürlich kann jedes Gerät 0 V treiben, aber möglicherweise kann nicht jedes Gerät die Spannung an Ihren Pull-up-Widerständen erreichen.

Darüber hinaus können die meisten ICs mehr Strom verbrauchen als sie liefern können. Dies liegt an der Wärmeabfuhr. Daher ist es für das Teil einfacher, Strom (Erdung) aus Pull-ups abzuleiten, als Strom (Hochspannung) in die Pull-Downs zu leiten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.