Frage:
Warum verwenden I2C-Leitungen Open Drain-Treiber anstelle von Tri-State-Treibern?
athedcha
2017-02-15 23:05:32 UTC
view on stackexchange narkive permalink

Meines Wissens nach verwenden I2C-Leitungen Pull-up-Widerstände, um den Bus passiv auf logisch hoch zu bringen, da die auf dem Bus verwendeten Treiber aktive Treiber sind, nämlich Open Collector / Open Drain.Da Open-Collector- / Open-Drain-Treiber die Leitung niedrig, aber nicht hoch fahren können, wird das Problem der Buskonflikte gemindert.

Meine Frage ist jedoch, warum das I2C-Protokoll diese Treiber im Gegensatz zu Tristate-Treibern verwendet.Wenn Sie mehrere Tri-State-Ausgangstreiber an denselben Bus angeschlossen haben, sollten wir uns nicht um Buskonflikte kümmern und im Vergleich dazu schnellere Anstiegszeiten erzielen, solange sich die Aktivierungssignale für die Tri-States gegenseitig ausschließenzu Open-Collector / Open-Drain-Topologien?

Clock-Stretching aus einem Grund.Und wie stellen Sie sicher, dass sich die Tri-State-Freigaben zwischen mehreren verschiedenen Geräten gegenseitig ausschließen?
Alsonote, dass das Problem mit den Anstiegszeiten mit Stromquellen anstelle von einfachen Pull-up-Widerständen etwas gelöst werden kann.
Sechs antworten:
The Photon
2017-02-15 23:35:58 UTC
view on stackexchange narkive permalink

... solange sich die Freigabesignale für die Tri-States gegenseitig ausschließen ...

Der Trick besteht darin, dies zu tun, ohne ein weiteres Kabel oder mehrere Kabel hinzuzufügen, um jedem Peripheriegerät mitzuteilen, wann es den Bus fahren darf.

Der Hauptvorteil von I2C besteht darin, dass nur zwei Drähte und zwei Pins auf jedem mit dem Bus verbundenen Chip verwendet werden.

Wenn Sie bereit sind, Pins gegen Geschwindigkeit zu tauschen, sollten Sie SPI verwenden, das im Allgemeinen eine höhere Geschwindigkeit als I2C erreichen kann, jedoch 3 oder 4 Pins pro Gerät benötigt.

+ Auch die Multi-Master-Aushandlung ist bei kabelgebundenen ODER-Bussen ziemlich transparent (zu @athedcha:, das einen offenen Kollektor hochgezogen hat, gehört dazu).
@Asmyldof, stimmt, aber wie viel Prozent der I2C-Anwendungen verwenden Ihrer Meinung nach tatsächlich Multi-Master?
Viel zu wenig.Multi-Master ist cool.Aber es ist ein anständiger Teil der Spezifikation, daher ist es als Grund für "warum nicht anders" ziemlich relevant.
@Asmyldof: Multi-Master verfügt über einige coole Funktionen, bietet jedoch keine saubere Möglichkeit, bestimmte Szenarien zu handhaben.Wenn beispielsweise zwei Master gleichzeitig eine "Inkrementzähler" -Anforderung an einen Slave senden, kann jeder denken, dass seine Anforderung erfolgreich war, aber der Zähler wird nur um eins anstatt um zwei vorgerückt.
@supercat, in dem dieser "Inkrementzähler" eine Form eines Befehls ist, den jemand darauf implementiert hat.Befehle und Transaktionen können ganz einfach so gestaltet werden, dass diese Vorkommnisse die Befehlsprotokollschicht eines der beiden Masters nicht beeinträchtigen.
@Asmyldof: Viele Geräte verfügen über Befehle, die nicht idempotent sind."Inkrementzähler" ist nur am einfachsten zu beschreiben (zwei Wörter).Wenn die Befehlsstruktur eines Geräts nicht von unten nach oben für die Verwendung mit mehreren Mastern ausgelegt ist, kann es zu Problemen kommen.Darüber hinaus kann sogar ein Single-Master-Two-Slave ohne Taktdehnung in einen nicht wiederherstellbaren Zustand geraten, wenn ein Slave keinen Taktimpuls sieht.Ich würde denken, Multi-Master würde noch problematischere Zustände hinzufügen.
Adam Haun
2017-02-16 00:01:21 UTC
view on stackexchange narkive permalink

Es gibt zwei spezifische Merkmale, die offene Abflussleitungen erfordern.Die erste ist die Taktdehnung, bei der ein Slave die Uhr (SCL) niedrig halten kann, um die Transaktion zu verzögern, während er Daten verarbeitet.Die zweite ist die Multi-Master-Arbitrierung, bei der zwei oder mehr Master gleichzeitig versuchen zu senden.Die Arbitrierung wird durchgeführt, indem ein Master die Übertragung stoppt, wenn er sieht, dass die Datenleitung von einem anderen Master niedrig gehalten wird.

Das Schiedsverfahren ist das große, denke ich.Sie könnten wahrscheinlich Clock-Stretching durch etwas Protokollbasiertes ersetzen, aber wenn Sie mehrere Master auf demselben Bus haben möchten, müssen Sie Konflikte irgendwie vermeiden.Wenn Sie keinen weiteren Draht hinzufügen können, stecken Sie mit offenem Abfluss fest.(Siehe auch: die physikalische CAN-Schicht, die ein ähnliches Arbitrierungsschema verwendet.)

pipe
2017-02-15 23:36:11 UTC
view on stackexchange narkive permalink

solange sich die Freigabesignale für die Tri-States gegenseitig ausschließen

In I2C gibt es keine Möglichkeit, dies sicherzustellen.Sie benötigen ein Aktivierungssignal pro Gerät - jetzt haben Sie einen Cousin für SPI erfunden.

Nicht erfunden, umgesetzt.Es existiert bereits und wird von allen, die es implementieren, unterschiedlich verwendet.
supercat
2017-02-16 03:01:57 UTC
view on stackexchange narkive permalink

Protokolle, bei denen mehrere Geräte mit Drei-Status-Treibern auf einem gemeinsamen Bus kommunizieren, erfordern im Allgemeinen entweder die Hinzufügung eines externen Steuerkabels, um Buskonflikte zu vermeiden, oder strombegrenzende Treiber, um Schäden zu vermeiden, wenn Buskonflikte auftreten. Während das Niveau des Fehlerstroms, das man im Falle eines Buskonflikts tolerieren kann, höher sein kann als das Niveau des Stroms, das man tolerieren kann, wenn eine Leitung niedrig ist, sind bidirektionale strombegrenzte Treiber komplizierter als Open-Collector-Treiber in Kombination mit passiven Pull-ups .

Wenn man bereit ist, die zusätzlichen Kosten für aktuell begrenzte Treiber zu akzeptieren, können Protokolle entworfen werden, die schneller und robuster als I2C sind. Andererseits kann das Hinzufügen von Aktiv-Hoch-Treibern zu einem I2C-Master ähnliche Vorteile ermöglichen, selbst mit I2C. Um solche Vorteile sicher zu erzielen, müssen möglicherweise Serienwiderstände auf der SDA-Leitung zwischen dem Master und den Slaves hinzugefügt werden. Wenn jedoch ein separater Widerstand zwischen dem Master und jedem Slave verwendet wird, kann der Master die SDA-Leitung hoch ansteuern Jeder Slave, der ihn nicht aktiv auf Low treibt, kann es dem Master ermöglichen, sich von Szenarien zu erholen, die andernfalls dazu führen könnten, dass der Bus dauerhaft blockiert (kein einzelnes Gerät kann SCL für mehr als 9 SCL-Zyklen kontinuierlich niedrig halten Ein Master wäre in der Lage, innerhalb von 9 Zyklen eine Stoppbedingung für jedes Gerät zu generieren. Wenn jedoch zwei Geräte die von einander gesehene SCL-Leitung gedrückt halten könnten, könnten sie in einen Zustand geraten, in dem sie abwechselnd die SCL so herunterziehen würden, dass dies der Fall wäre Werden Sie niemals freigegeben, sodass der Master keine Stoppbedingung generieren kann.

Milliways
2017-02-16 12:30:43 UTC
view on stackexchange narkive permalink

Die WIRKLICHE Antwort auf diese Frage ist, wie bei den meisten ähnlichen Fragen, weil sie so entworfen wurde.Clock-Stretching und Bus-Arbitrierung sind sicherlich gültig, aber die Lösung ist für den Entwurfszweck angemessen, bei dem es sich um eine Kurzstreckenkommunikation mit geringer Geschwindigkeit (häufig an Bord) handelt.

Es gibt viele neuere, schnellere Protokolle, die eine gewisse Komplexität in Bezug auf Geschwindigkeit und Entfernung abwägen.Wenn Sie dies benötigen, verwenden Sie eines dieser Protokolle.

Während I²C ein relativ modernes Protokoll (~ 1982) ist, verwendeten die frühen ICs vor Tri-State oder TTL (~ 1963) RTL, und Open-Collector war das Standard-Busdesign für frühe Computer.(Und ich könnte Designern eine echte Herausforderung hinzufügen.)

dannyf
2017-02-15 23:20:02 UTC
view on stackexchange narkive permalink

Open Drain ist eine Form des erprobten Zustandstreibers.Es wird hier benötigt, um logische Konflikte zu vermeiden - zum Beispiel den Slave, der am Bus festhält.

Open-Drain hat zwei Zustände.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...