Warum I2C so konzipiert ist, dass es mit Pull-up-Widerständen und nicht mit Pull-down-Widerständen arbeitet?

Ich verstehe, dass in I2C-, SCL- und SDA-Leitungen Pull-up-Widerstände verwendet werden und die Pin-Treiber NPN-Geräte mit offenem Kollektor sind, die Pins auf Masse treiben können. Dies gibt I2C den Vorteil, dass derselbe Bus jetzt mit mehreren Slaves geteilt werden kann, und selbst wenn zwei oder mehr Slaves versehentlich versuchen, den Bus gleichzeitig zu fahren, wird das dem System keinen Schaden zufügen.

Dies kann aber auch mit PNP-Open-Drain-Treibern und Pull-Down-Widerständen auf SDA- und SCL-Leitungen erfolgen. Auch Dinge wie Clock-Stretching und Multi-Master-Arbitrierung lassen sich damit realisieren.

Bietet die aktuelle Implementierung des I2C-Protokolls Vorteile gegenüber der oben vorgeschlagenen alternativen Implementierung?

Open-Collector-Transistoren schienen in den 80er Jahren in ICs in der Mehrheit zu sein.
@PlasmaHH Ich denke, der Grund war, dass NPN (soweit ich mich vage erinnere) aufgrund der höheren Elektronenmobilität im Substrat mehr Stromkapazität pro Fläche hat, sodass es einfacher ist, damit "starke" Ausgangsstufen zu bauen.
@MarcusMüller In der Tat, das war (und ist) wahr. NPNs und NMOS-Fets sind bei gleicher Größe "stärker". Bei CMOS ist ein Faktor 2 bis 3 typisch. Für PNP vs. NPN hängt es vom Herstellungsprozess ab, aber fast immer sind PNPs weitaus schwieriger und komplexer als die NPNs. Auch das Starten mit einem P-dotierten Substrat (wie es die meisten Prozesse tun) betont dies (bessere NPNs).
@Bimpelrekkie Ich erinnere mich an einen Faktor von 2,3 aus meinem Festkörperphysikunterricht bis heute :-)
Wenn der vorhandene I2C-Bus aus irgendeinem Grund versehentlich gegen Masse kurzgeschlossen wird, ziehen Sie nur Pull-up-Widerstandsstrom. Mit der komplementären Anordnung von Active-High-Treibern und Pull-Down-Widerständen würden Sie einfache Treiber aus den I2C-Startjahren beschädigen. Beim Wechseln zwischen Platinen ist ein Kurzschluss zum Chassis zu berücksichtigen. Aber es ist nur einer von vielen Gründen, Drive-Low-Pull-High zu fahren, den Rest haben andere unten beantwortet.
Ich glaube nicht, dass dies unten erwähnt wird - Sie sollten auch bedenken, dass in den alten TTL 7400-Tagen Systeme im Allgemeinen mit Active-Low-Steuersignalen ausgelegt waren, da dies eine bessere Störfestigkeit ergab (TTL-Eingangsschwellen machten es weniger wahrscheinlich, dass ein inaktiver Signal könnte ungewollt aktiv werden). Die allgemeine Denkweise lautete also: „Make it active low“.

Antworten (7)

Elektrisch ist es sinnvoll, weil Masse die eine gemeinsame Verbindung zu allen Geräten auf einem IIC-Bus ist. Das ist eine weitaus geringere Einschränkung, als zu erzwingen, dass die Stromversorgung die gemeinsame Verbindung zu allen IIC-Geräten ist, wie dies erforderlich wäre, wenn die Leitungen hochgefahren und über Pulldowns niedrig gefloatet wären.

Beachten Sie, dass IIC-Geräte nicht alle aus demselben Netz oder derselben Spannung versorgt werden müssen. Dies würde nicht zutreffen, wenn beide Busleitungen auf die einzige gemeinsame Versorgungsspannung getrieben werden müssten.

Wer auch immer das abgelehnt hat, was ist Ihrer Meinung nach falsch?
Nicht meine Ablehnung, und Sie müssen über so viele Jahre I2C-Erfahrung verfügen wie ich, daher ist mein Punkt hier wahrscheinlich ein Missverständnis, aber: „ IIC-Geräte müssen nicht alle mit der gleichen Spannung betrieben werden “ könnte sein als implizierend angesehen werden, dass 5-V- und 3-V-betriebene I2C-Geräte (zum Beispiel) denselben I2C-Bus ohne zusätzliche Komponenten oder Vorsichtsmaßnahmen teilen könnten (da Sie Pegelumsetzer nicht erwähnt haben). Und das können sie natürlich nicht, da die I2C-Logikschwellen jedes Geräts jetzt auf ihre eigene Vcc verwiesen werden. Vielleicht hat das Fehlen einer expliziten Erwähnung von Level-Übersetzern die Ablehnung verursacht?
Abhängig von den verwendeten Pull-Ups und I/O-Pins kann die Kommunikation im I2C-Stil reibungslos zwischen 5-V- und 3,3-V-Geräten funktionieren. Die Verwendung von 10K-Pullups auf 5 V würde beispielsweise die Verwendung von 3,3-V-Geräten ermöglichen, wenn sie 5-V-tolerante ungeklemmte Eingänge haben oder wenn sie 150 uA in ihren Schutzdioden tolerieren können. Und die Verwendung von Pullups auf 3,3 V funktioniert zumindest bei langsameren Geschwindigkeiten für die Verbindung mit 5-V-Geräten, die eine hohe Eingangsschwelle von 2,5 V oder weniger haben.
@Sam: Tatsächlich können sich 5-V- und 3,3-V-IIC-Geräte auf demselben IIC-Bus befinden. Geräte mit festen Spannungspegeln unabhängig von ihrer Versorgungsspannung werden in der IIC-Spezifikation ausdrücklich erwähnt und sanktioniert.
Und unterschiedliche Versorgungsnetze bedeuten nicht zwangsläufig, dass die nominale Versorgungsspannung unterschiedlich ist, aber aufgrund von Komponententoleranzen gibt es dennoch leichte Abweichungen. Diese Unterschiede wirken sich auf die Rauschgrenze aus, wenn eines der Versorgungsnetze als Referenz verwendet wird.
@Olin - Das hängt von den spezifischen Geräten ab. Ich erinnere mich, dass die I2C-Spezifikation vor einigen Versionen der Spezifikation von Empfangsschwellenwerten mit festem Pegel auf % Vcc-Schwellenwerte geändert wurde (ich gehe aus dem Gedächtnis - ich werde es nachschlagen, wenn wir immer noch nicht einverstanden sind, dass dies eine Änderung ist, einige Zeit vor). Wenn sich Ihre Antwort auf Geräte mit festen Empfangsschwellen bezieht, ist es meiner Meinung nach wichtig, dies zu erwähnen. Keines der (modernen) I2C-Geräte, mit denen ich in letzter Zeit gearbeitet habe, hat feste Schwellen für die Empfangslogik.
@supercat - " Abhängig von den verwendeten Pull-ups und E / A-Pins kann die Kommunikation im I2C-Stil zwischen 5-V- und 3,3-V-Geräten reibungslos funktionieren. " Bitte beachten Sie, dass ich ausdrücklich nicht 3,3-V-Geräte gesagt habe - ich habe mein 3-V-Beispiel gewählt vorsichtig (wie ich es derzeit auf meiner Bank verwende). :-) Außerdem habe ich hier schon einmal eine Frage gelöst, bei der das Mischen von 5 V und einem I2C-Gerät mit niedrigerer Spannung auf demselben Bus mit diesem Strom in den Schutzdioden zu Fehlfunktionen führte . Sich darauf zu verlassen, dass dies in Ordnung ist, ist ein Risiko und sollte meiner Meinung nach ausdrücklich erwähnt werden, da es erwiesenermaßen manchmal zu Problemen führt.
Ich fasse noch einmal zusammen, dass die Antwort, wie geschrieben, einige Konfigurationen vorzuschlagen scheint, die möglicherweise nicht richtig funktionieren. Sowohl Olin als auch Supercat haben spezifische Beispiele erwähnt, bei denen sie in Ordnung wären, aber die Antwort erwähnt diese Einschränkungen nicht. Ich habe gerade versucht, Olins Frage zur Ablehnung zu beantworten, indem ich einen möglichen Bereich der Besorgnis vorgeschlagen habe. Das ist alles. Es macht mir nichts aus, wenn die Antwort "wie sie ist" bleibt, da ich die bereits erwähnten Einschränkungen kenne - andere Leser möglicherweise nicht. Natürlich könnte meine Vermutung für die Ablehnung falsch sein - ich versuche nur zu helfen :-)
@SamGibson: Ich habe Geräte gesehen, deren Schutzdioden als Transistoren fungierten, daher ist es wichtig, sich solcher Möglichkeiten bewusst zu sein. Auf der anderen Seite ermöglicht die Verwendung von I2C-Pulldowns die Verwendung, um Geräte mit unterschiedlichen Versorgungsspannungen viel einfacher anzuschließen, als dies mit aktiven High-Side-Treibern möglich wäre.
@supercat - Alle einverstanden :-) Wie ich oben zusammengefasst habe, habe ich nur versucht zu helfen, indem ich darauf hinwies, dass gemischte Vcc-Konfigurationen Einschränkungen darüber haben, was funktioniert und was nicht, dass die Antwort (in ihrem aktuellen Zustand) dies tut nicht erwähnen. Dies könnte jemanden genug beunruhigt haben, um abzustimmen. Aus dem Gedächtnis war das Gerät, das in einer vorherigen Frage auf seltsame Weise eine Fehlfunktion hatte (es schien wie ein teilweises Latch-up einiger GPIO-Pins), eine PIC-MCU (PIC16?) Mit 3,3 V Vcc, die an einen auf 5 V hochgezogenen I2C-Bus angeschlossen war . Nach der I2C-Bus-E/A würden einige GPIO-Pins, die physisch in der Nähe der I2C-Pins auf dem PIC liegen, falsche Werte lesen!
Im alten Dokument "The I2C-bus and how to use it" von Philips erwähnt Abschnitt 10.0 die festen Eingangsschwellen der frühen (typischerweise NMOS) 5V I2C-Geräte. Dort heißt es dann: " I2C-Bus-Geräte mit Eingangspegeln bezogen auf VDD müssen eine gemeinsame Versorgungsleitung haben, an der auch der Pull-up-Widerstand angeschlossen ist " (mein Fettdruck). @supercat - Sie haben erwähnt: "5-V-Geräte mit einer hohen Eingangsschwelle von 2,5 V oder weniger ". Können Sie mir helfen, indem Sie ein Beispiel für ein solches Gerät geben? Beim Lesen alter I2C-Dokumente kann ich nur Erwähnungen eines festen 3-V-I2C-Vih-Minimums für diese alten 5-V-Geräte finden. Danke.
Diese Antwort erscheint mir sehr seltsam, insbesondere der Teil "Wenn die Linien hoch schwebten". Ich verstehe nicht, was das bedeutet, da Floating normalerweise nicht verbunden bedeutet, aber im vorgeschlagenen Schema würden die Leitungen von den Transistoren hochgezogen. Ich sehe auch nicht, wie das VCC dazu zwingen würde, die gemeinsame Verbindung zu sein, es ist genauso einfach, 1/0 gegen GND zu erkennen.
@jpa: Ich meine Linien, die über den Pullup hoch schweben, im Gegensatz dazu, aktiv hoch getrieben zu werden.
@SamGibson: Geräte mit Eingangspegeln in Bezug auf VDD müssen möglicherweise mit Spannungen betrieben werden, die innerhalb eines bestimmten Bereichs voneinander liegen. Wie nahe sie sein müssen, hängt davon ab, wie die Spannungen mit VDD zusammenhängen. Das Microchip-Datenblatt für den PIC16F877 (ein willkürlich ausgewähltes 5-V-Teil) listet V (IH) für seine normalen Pins als 0,25 VDD + 0,8 V auf, obwohl es für seine Schmitt-Trigger-Eingänge viel höher wäre. Bei VDD = 5,2 V hätte ein normaler Eingang eine spezifizierte V(IH) von 2,1 Volt; Ich habe keine Spezifikation für die Hardware I2C V (IH) gesehen, obwohl das typische Leistungsdiagramm darauf hindeutet, dass es zwischen normalen und ST-Eingängen liegt.
@supercat - Danke, ich sehe jetzt die verschiedenen Interpretationen. Der PIC16F877 ist nicht das, was ich mit einem 5-V-Gerät gemeint habe - in diesem Teil der I2C-Spezifikation waren die 5-V-Geräte mit festen Schwellenwerten nicht wie der PIC16F877, der, wie Sie sagten, abhängig von seiner VDD ein variables Vih hat . Sie waren Geräte mit einer festen VDD (die 5 V oder 12 V usw. sein konnte, aber es war eine feste Spannung für ein bestimmtes Gerät). Ich habe noch nie einen dieser Gerätetypen (normalerweise NMOS) mit einem anderen I2C-Vih als 3 V gesehen. Also, alles klar - wir haben über verschiedene Geräte bei 5 V gesprochen (feste 5 V VDD vs. variable VDD, die 5 V sein könnte ).
@SamGibson: Die V (IH) des PIC ist etwas abhängig von VDD, aber sie ist nie hoch genug, dass sie bei einem einigermaßen langsamen Bus mit einigermaßen steifen Klimmzügen auf 3 Volt ein Problem verursachen sollte.
@OlinLathrop Dann verstehe ich noch weniger, " wenn die Linien hoch schwebten". Aber genau so funktioniert I2C, die Linien gehen durch Pullups hoch.
@jpa: Ah, ich verstehe jetzt, was du meinst. Fest.
Stellen Sie sich vor, wenn ein Auto mit +12 und Masse und einer "Signalleitung" in jedem Gerät einen 12-V-zu-5-V-DC-zu-DC-Wandler enthält. I2C wurde von Autoherstellern entwickelt.....

In der guten alten Zeit waren TTL-Treiber viel besser darin, ein Signal nach unten zu ziehen als es nach oben zu ziehen. Daher wurden Protokolle wie I2C, aber auch Interrupt-Leitungen, Reset und andere alle mit einem Pull-up mit verteiltem Pull-down implementiert.

In der besseren modernen Zeit gilt das Gleiche immer noch, da es eine intrinsische Eigenschaft der Halbleiter ist. Heutzutage kostet es einfach nicht mehr so ​​viel, einen kräftigeren Pull-Up-Transistor zu bekommen, der den gleichen Strom verarbeiten kann.
Mir wurde gesagt, dass es mit CMOS auch viel einfacher ist, sich der Stromschienenspannung anzunähern. Ein weiteres „Problem“, bei dem TTL zu kämpfen hatte. (Vielleicht sollten wir uns glücklich schätzen, da es 3V3 CMOS erlaubte, mit TTL zu kommunizieren)

Es ist einfacher, Masse als gemeinsame Referenz zwischen Subsystemen zu verwenden, die möglicherweise unterschiedliche Versorgungsspannungen haben. Wenn Sie PNP-Transistoren verwenden, um auf eine Versorgungsspannung hochzuziehen, müssten alle Subsysteme an die gleiche Versorgung angeschlossen werden.

Hier gibt es viele gute Antworten, aber es gibt noch einen anderen Grund.

Wenn der Ruhezustand des Busses Masse ist, gibt es keine Möglichkeit festzustellen, ob der Bus angeschlossen ist oder nur im Raum hängt.

Es ist normal, dass sich der Pull-up am Master-Gerät befindet. Sklaven haben normalerweise keinen Klimmzug. Dies liegt daran, dass der Pull-down-Strom, der erforderlich wäre, um einen niedrigen Pegel geltend zu machen, mit der Anzahl der an den Bus angeschlossenen Geräte zunehmen würde.

Wenn ein Slave an den Bus angeschlossen ist, kann er dann erkennen, dass die Leitung hochgezogen ist (vorausgesetzt, sie wird nicht verwendet) und wissen, dass der Bus tatsächlich vorhanden und ruhig ist. Das wäre bei einem massevorgespannten Bus nicht der Fall.

Um zu erkennen, dass der Bus auf High gezogen wird, muss ein Slave ihn zuerst auf Low ziehen. Ich bin mir nicht sicher, warum ein ähnliches Verfahren mit der entgegengesetzten Polarität nicht möglich wäre.
@DmitryGrigoryev warum sollte es etwas ziehen müssen, das bereits hoch ist?

Wenn ich die Frage richtig verstehe ist ein Aspekt:

  • Warum verwenden Sie Pull-up-Widerstände und NPN-Transistoren anstelle von Pull-down-Widerständen und PNP-Transistoren?

Zunächst einmal sollte man beachten, dass man keine Bipolartransistoren (NPN, PNP) verwendet, sondern MOSFETs (die es in vier verschiedenen Varianten gibt).

Geräte, die die Variante „ Pull-up und NPN “ verwenden, verwenden einen n-Kanal-Enhancement- MOSFET. Da die Source dieses MOSFET mit Masse verbunden ist, ist die Gate-Source-Spannung (die den Stromfluss steuert) gleich der Spannung zwischen Gate und Masse. Der MOSFET kann also mit einer Spannung zwischen 0 und Vdd gesteuert werden.

Es gäbe drei Möglichkeiten, die Variante „ Pull-Down und PNP “ zu realisieren:

  • Verwendung eines p-Kanal- Enhancement-MOSFET

    Auf einem NMOS- oder CMOS-IC benötigen p-Kanal-MOSFETs mit vergleichbaren Eigenschaften (Widerstand usw.) mehr Platz als n-Kanal-MOSFETs.

    In der Mikroelektronik ist Platz für Geld, daher werden p-Kanal-MOSFETs möglichst vermieden.

  • Verwendung eines n-Kanal-Enhancement- MOSFET

    Dies würde erfordern, dass der Ausgang der Logikschaltung, die den Transistor ansteuert, eine "LOW"-Spannung der Versorgungsspannung (z. B. +5 V) und eine "HIGH"-Spannung über der Versorgungsspannung (z. B. +10 V) hat, wenn der Rest der Schaltung versorgt wird mit +5V).

    Der Grund: Die Source-Masse-Spannung ist Vdd, wenn der MOSFET leitet. Die Gate-Source-Spannung muss positiv sein, also muss die Spannung zwischen Gate und Masse noch höher sein.

    Sie würden zwei Spannungsversorgungen benötigen - und eine Schaltung, die den Ausgang der Logikschaltung von 0 ... + 5 V auf + 5 V ... + 10 V verschiebt ...

  • Verwendung eines n-Kanal-Verarmungs- MOSFET

    Zu dieser Lösung kann ich leider nicht viel sagen. Ich habe jedoch eine Seite mit Google gefunden, auf der steht, dass Verarmungs-MOSFETs schwieriger herzustellen sind als Anreicherungs-MOSFETs und aus diesem Grund vermieden werden.

    Aus der Leistungselektronik (nicht Mikroelektronik) weiß ich, dass die oben beschriebene Variante mit "zwei Stromversorgungen" sogar gegenüber Verarmungs-MOSFETs bevorzugt wird. (Aber ich kann dir nicht sagen warum.)

    BEARBEITEN Bei Verwendung von n-Kanal-Verarmungs-MOSFETs benötigen Sie wahrscheinlich eine negative Spannung (z. B. -5 V), sodass Sie auch zwei Versorgungsspannungen benötigen ...

Es gibt auch einen weiteren zusätzlichen Vorteil für gemeinsame Masse- und Pull-up-Datenleitungen (gegenüber gemeinsamem VCC und Pull-down):

Selbst wenn die ursprüngliche Absicht darin bestand, Geräte auf derselben Leiterplatte mit einer Spannweite von nur wenigen Zoll zu verbinden, war dies erfolgreich genug, sodass es jetzt nicht ungewöhnlich ist, dass die Leitungen einige Fuß lang sind und „Geräte“ angeschlossen werden, bei denen es sich um Computer oder ähnliches handeln könnte Komplexität, da einige Geräte über eigene Stromquellen verfügen (von unterschiedlicher Qualität, sagen Sie, Sie verbinden etwas mit Netzstecker mit etwas Batteriebetriebenem). Besser ist es, wenn die Verbindung auch unter nicht idealen und nicht spezifikationsgerechten Bedingungen "mindestens gut" funktioniert.

Und viele solcher angeschlossenen Geräte können auch auf andere Weise verbunden sein, dann nur durch I2C-Kommunikation. Wenn Sie Geräte miteinander verbinden, verbinden Sie es normalerweise mit common ground- manchmal als Teil anderer Funktionen, manchmal nur, weil es auf einem Metallgehäuse montiert ist und die Geräte auch mit dem Gehäuse geerdet sind (oder mit einem gemeinsamen Kühler oder ähnlichem) oder möglicherweise geschirmtes Kabel mit geerdetem Schirm innen sein - das auch die Erdung verbindet.

Wenn Sie auch Stromleitungen (VCC) solcher Geräte direkt anschließen, werden Sie Probleme bekommen, wenn diese Leitungen natürlich auf einer anderen Spannung liegen würden (sicher, es kann hier und da 5 V heißen, aber je nach Konstruktion und Teiltoleranzen von Stromquellen es könnte auch 4,9 V oder 5,2 V betragen oder sich sogar ändern, wenn es batteriebetrieben ist und manchmal einige Motoren laufen lässt, wodurch die Leistung mit der Zeit abfällt und ansteigt).

In einem solchen Fall gibt es effektiv einen Kurzschluss zwischen diesen Stromquellen von einem Teil eines Volts und abhängig von den Quellen (und dem Widerstand der Wege) können relativ hohe Ströme fließen, was nicht nur zu Energieverschwendung und Wärmeanstieg, sondern möglicherweise sogar zu Schäden führt ( oder Verkürzung der Lebensdauer) einiger dieser Quellen. Was nicht gut ist.

Durch gemeinsame Masse und Pull-Ups werden solche Probleme vermieden - Masse ist Masse und Pullup-Widerstände lassen nur sehr geringe Querströme zu, selbst wenn sich die VCC zwischen den Geräten stark unterscheidet.

Dies ist im Wesentlichen die gleiche wie die Antwort von Dave Tweed.

Sie müssen nicht so viel Strom durch den Chip schicken, wenn er hochgezogen ist.

Da der Chip nichts antreibt, erzeugt er nur einen Kurzschluss, um den Bus auf 0 zu bringen, und macht ein Open, um ihn auf 1 zu bringen.

Wenn es heruntergezogen wäre, müssten Sie Strom durch den Chip schicken, um den Bus auf 1 zu fahren. Wenn der Bus zufällig kurz ist, könnte das viel Strom sein, den Sie durch diesen Chip treiben, um zu versuchen, ihn zu drücken bis 1.

Haftungsausschluss: Ich bin an dieser Stelle ein ziemlich mieser EE.

Willkommen bei EE.SE. " Sie müssen nicht so viel Strom durch den Chip schicken, wenn er hochzieht. " Wenn die Pull-up- und Pull-down-Widerstände gleich groß sind, sind die Ströme gleich. Pull-up erfordert, dass Strom von dem angesteuerten Chip bezogen und in den ansteuernden Chip eingesenkt wird. Pull-down erfordert, dass Strom vom ansteuernden Chip bezogen und vom angesteuerten Chip abgeführt wird. Ein versehentlicher Kurzschluss könnte zu V+ oder Masse führen.