I²C - I²C

Ich 2 C-Bus
I²C-Bus logo.svg
Typ Serielle Kommunikation Bus
Designer Philips Semiconductor , heute bekannt als NXP Semiconductors
Entworfen 1982 ; Vor 39 Jahren ( 1982 )
Datensignal Open-Collector oder Open-Drain
Breite 1-Bit (SDA) mit separatem Takt (SCL)
Bitrate 0,1, 0,4, 1,0, 3,4 oder 5,0  Mbit/s je nach Modus
Protokoll Seriell , Halbduplex

I 2 C ( Inter-Integrated Circuit , Augen squared- C ), alternativ bekannt als I2C oder IIC , ist ein synchroner , Multi-Master - Multi-Slave , paketvermitteltes , unsymmetrischen , serieller Kommunikation - Bus 1982 erfunden von Philips Halbleiter . Es wird häufig zum Anschließen von Peripherie- ICs mit niedrigerer Geschwindigkeit an Prozessoren und Mikrocontroller in der platineninternen Kommunikation über kurze Distanzen verwendet.

Mehrere Wettbewerber wie Siemens , NEC , Texas Instruments , STMicroelectronics , Motorola , Nordic Semiconductor und Intersil haben seit Mitte der 1990er Jahre kompatible I 2 C-Produkte auf den Markt gebracht.

Der System Management Bus (SMBus), der 1995 von Intel definiert wurde, ist eine Untermenge von I 2 C und definiert eine strengere Verwendung. Ein Zweck von SMBus besteht darin, Robustheit und Interoperabilität zu fördern. Dementsprechend enthalten moderne I 2 C-Systeme einige Richtlinien und Regeln von SMBus, die manchmal sowohl I 2 C als auch SMBus unterstützen, was nur eine minimale Neukonfiguration entweder durch Befehlen oder Verwendung von Ausgangspins erfordert.

Anwendungen

Microchip MCP23008 8-Bit I 2 C I/O-Expander im DIP-18-Gehäuse

I 2 C ist für Peripheriegeräte geeignet, bei denen Einfachheit und niedrige Herstellungskosten wichtiger sind als Geschwindigkeit. Häufige Anwendungen des I 2 C-Busses sind:

Eine besondere Stärke von I 2 C ist die Fähigkeit eines Mikrocontrollers , ein Netzwerk von Gerätechips mit nur zwei universellen I/O- Pins und Software zu steuern . Viele andere Bustechnologien, die in ähnlichen Anwendungen verwendet werden, wie der Serial Peripheral Interface Bus (SPI), erfordern mehr Pins und Signale, um mehrere Geräte zu verbinden.

Überarbeitungen

Geschichte der Veröffentlichungen der I 2 C-Spezifikationen
Jahr Ausführung Anmerkungen Referenzen
1981 Patent US-Patent 4,689,740, eingereicht am 2. November 1981 von der US Philips Corporation.
1982 Original Das 100 kbit/s I 2 C System wurde als einfaches internes Bussystem für die Gebäudeleitelektronik mit verschiedenen Philips Chips erstellt. N / A
1992 1 400 kbit/s Fast-Mode (Fm) und ein 10-bit-Adressierungsmodus hinzugefügt , um die Kapazität auf 1008 Knoten zu erhöhen. Dies war die erste standardisierte Version. N / A
1998 2 3,4 Mbit/s High-Speed-Modus (Hs) mit Energiesparanforderungen für elektrische Spannung und Strom hinzugefügt . N / A
2000 2.1 Geklärte Version 2, ohne wesentliche funktionale Änderungen.
2007 3 1 Mbit/s Fast-Mode plus (Fm+) (mit 20-mA-Treibern) und ein Geräte-ID-Mechanismus hinzugefügt .
2012 4 Hinzugefügt 5 Mbit / s Ultra Fast-Modus (UFM) für neue USDA (Daten) und USCL (Takt) Linien mit Push-Pull - Logik ohne Pull-up - Widerstände ,
und hinzugefügt Tabelle einer zugeordneten Hersteller - ID. Es ist nur ein unidirektionaler Bus.
2012 5 Korrigierte Fehler.
2014 6 Zwei Grafiken korrigiert. Dies ist der aktuelle Standard.

Entwurf

Ein Beispielschema mit einem Master (einem Mikrocontroller ), drei Slave-Knoten (einem ADC , einem DAC und einem Mikrocontroller) und Pull-up-Widerständen R p

I 2 C verwendet nur zwei bidirektionale Open-Collector- oder Open-Drain- Leitungen: serielle Datenleitung (SDA) und serielle Taktleitung (SCL), hochgezogen mit Widerständen . Typische verwendete Spannungen sind +5 V oder +3,3 V, obwohl Systeme mit anderen Spannungen zulässig sind.

Das I 2 C- Referenzdesign hat einen 7-Bit- Adressraum mit einer selten verwendeten 10-Bit-Erweiterung. Übliche I 2 C-Busgeschwindigkeiten sind der 100  kbit/s Standardmodus und der 400 kbit/s Fastmodus . Es gibt auch einen 10 kbit/s Low-Speed-Modus , aber auch beliebig niedrige Taktfrequenzen sind erlaubt. Spätere Versionen von I 2 C können mehr Knoten hosten und mit höheren Geschwindigkeiten laufen (400 kbit/s Fast Mode , 1 Mbit/s Fast Mode plus , 3,4  Mbit/s High Speed ​​Mode und 5  Mbit/s Ultra-Fast Mode ) . Diese Geschwindigkeiten werden auf eingebetteten Systemen häufiger verwendet als auf PCs.

Beachten Sie, dass die Bitraten für die Übertragungen zwischen Master und Slave ohne Clock-Stretching oder anderen Hardware-Overhead angegeben sind. Protokoll-Overheads umfassen eine Slave-Adresse und möglicherweise eine Registeradresse innerhalb des Slave-Geräts sowie ACK/NACK-Bits pro Byte. Somit ist die tatsächliche Übertragungsrate von Benutzerdaten niedriger, als diese Spitzenbitraten allein implizieren würden. Wenn beispielsweise jede Interaktion mit einem Slave ineffizient nur die Übertragung von 1 Byte an Daten zulässt, beträgt die Datenrate weniger als die Hälfte der Spitzenbitrate.

Die Anzahl der Knoten, die auf einem gegebenen I 2 C-Bus existieren können, ist durch den Adressraum und auch durch die Gesamtbuskapazität von 400  pF begrenzt , was die praktischen Kommunikationsentfernungen auf wenige Meter beschränkt. Die relativ hohe Impedanz und die geringe Störfestigkeit erfordern ein gemeinsames Erdpotential, was wiederum den praktischen Einsatz auf die Kommunikation innerhalb derselben PC-Platine oder eines kleinen Platinensystems beschränkt.

I 2 C-Modi
Modus maximale
Geschwindigkeit
Maximale
Kapazität
Fahrt Richtung
Standardmodus (Sm) 100 kbit/s 400 pF Offener Abfluss * Bidirektional
Schnellmodus (FM) 400 kbit/s 400 pF Offener Abfluss* Bidirektional
Schnellmodus plus (FM+) 1 Mbit/s 550 pF Offener Abfluss* Bidirektional
Hochgeschwindigkeitsmodus (Hs) 1,7 Mbit/s 400 pF Offener Abfluss* Bidirektional
Hochgeschwindigkeitsmodus (Hs) 3,4 Mbit/s 100 pF Offener Abfluss* Bidirektional
Ultraschneller Modus (UFm) 5 Mbit/s ? Drücken ziehen Unidirektional
  • Hinweis: Open-Drain bedeutet auch Open-Collector.

Referenzdesign

Das oben erwähnte Referenzdesign ist ein Bus mit Takt- (SCL) und Datenleitungen (SDA) mit 7-Bit-Adressierung. Der Bus hat zwei Rollen für Knoten: Master und Slave:

  • Master-Knoten – Knoten, der die Uhr generiert und die Kommunikation mit Slaves initiiert.
  • Slave-Knoten – Knoten, der die Uhr empfängt und antwortet, wenn er vom Master angesprochen wird.

Der Bus ist ein Multi-Master-Bus , dh es können beliebig viele Master-Knoten vorhanden sein. Außerdem können Master- und Slave-Rollen zwischen Nachrichten geändert werden (nachdem ein STOP gesendet wurde).

Es kann vier mögliche Betriebsmodi für ein bestimmtes Busgerät geben, obwohl die meisten Geräte nur eine einzige Rolle und ihre beiden Modi verwenden:

  • Master Transmit – Master-Knoten sendet Daten an einen Slave,
  • Master-Empfang – Master-Knoten empfängt Daten von einem Slave,
  • Slave-Senden – Slave-Knoten sendet Daten an den Master,
  • Slave-Empfang – Der Slave-Knoten empfängt Daten vom Master.

Zusätzlich zu den 0- und 1-Datenbits erlaubt der I 2 C-Bus spezielle START- und STOP-Signale, die als Nachrichtenbegrenzer wirken und sich von den Datenbits unterscheiden. (Dies steht im Gegensatz zu den bei der asynchronen seriellen Kommunikation verwendeten Start- und Stoppbits , die sich nur durch ihr Timing von Datenbits unterscheiden.)

Der Master befindet sich anfänglich im Master-Sendemodus, indem er ein START sendet, gefolgt von der 7-Bit-Adresse des Slaves, mit dem er kommunizieren möchte, gefolgt von einem einzelnen Bit, das angibt, ob er schreiben (0) oder lesen möchte (1 ) vom Sklaven.

Wenn der Slave am Bus vorhanden ist, antwortet er mit einem ACK- Bit (aktiv niedrig für bestätigt) für diese Adresse. Der Master fährt dann entweder im Sende- oder Empfangsmodus fort (je nach dem von ihm gesendeten Lese-/Schreibbit), und der Slave fährt im Komplementärmodus fort (jeweils Empfangen oder Senden).

Die Adresse und die Datenbytes werden zuerst mit dem höchstwertigen Bit gesendet . Die Startbedingung wird durch einen High-to-Low-Übergang von SDA mit SCL High angezeigt; die Stoppbedingung wird durch einen Low-to-High-Übergang von SDA mit SCL-High angezeigt. Alle anderen Übergänge von SDA erfolgen mit SCL low.

Will der Master auf den Slave schreiben, dann sendet er wiederholt ein Byte mit dem Slave ein ACK-Bit. (In dieser Situation befindet sich der Master im Master-Sendemodus und der Slave im Slave-Empfangsmodus.)

Will der Master vom Slave lesen, so erhält er wiederholt ein Byte vom Slave, wobei der Master nach jedem Byte außer dem letzten ein ACK-Bit sendet. (In dieser Situation befindet sich der Master im Master-Empfangsmodus und der Slave im Slave-Sendemodus.)

Eine I 2 C-Transaktion kann aus mehreren Nachrichten bestehen. Der Master beendet eine Nachricht mit einer STOP-Bedingung, wenn dies das Ende der Transaktion ist, oder er kann eine weitere START-Bedingung senden, um die Kontrolle über den Bus für eine andere Nachricht zu behalten (eine Transaktion im "kombinierten Format").

Nachrichtenprotokolle

I 2 C definiert grundlegende Arten von Transaktionen, die jeweils mit einem START beginnen und mit einem STOP enden:

  • Einzelnachricht, bei der ein Master Daten an einen Slave schreibt.
  • Einzelnachricht, bei der ein Master Daten von einem Slave liest.
  • Kombiniertes Format, bei dem ein Master mindestens zwei Lese- oder Schreibvorgänge an einen oder mehrere Slaves ausgibt.

In einer kombinierten Transaktion beginnt jeder Lese- oder Schreibvorgang mit einem START und der Slave-Adresse. Die START-Bedingungen nach der ersten werden auch als wiederholte START- Bits bezeichnet. Wiederholten STARTs gehen keine STOP-Bedingungen voraus, wodurch Slaves wissen, dass die nächste Nachricht Teil derselben Transaktion ist.

Jeder gegebene Slave antwortet nur auf bestimmte Nachrichten, die in seiner Produktdokumentation angegeben sind.

Reine I 2 C-Systeme unterstützen beliebige Nachrichtenstrukturen. SMBus ist auf neun diese Strukturen beschränkt, wie Lesewort N und Schreibwort N , einen einzelnen Slave beteiligt ist . PMBus erweitert SMBus um ein Gruppenprotokoll , das das Senden mehrerer solcher SMBus-Transaktionen in einer kombinierten Nachricht ermöglicht. Das abschließende STOP zeigt an, wann diese gruppierten Aktionen wirksam werden sollen. Zum Beispiel könnte eine PMBus-Operation drei Stromversorgungen rekonfigurieren (unter Verwendung von drei verschiedenen I 2 C-Slave-Adressen), und ihre neuen Konfigurationen würden gleichzeitig wirksam: wenn sie diesen STOP erhalten.

Mit wenigen Ausnahmen definieren weder I 2 C noch SMBus eine Nachrichtensemantik, wie beispielsweise die Bedeutung von Datenbytes in Nachrichten. Die Nachrichtensemantik ist ansonsten produktspezifisch. Diese Ausnahmen umfassen Nachrichten, die an die allgemeine I 2 C- Anrufadresse (0x00) oder an die SMBus- Warnungsantwortadresse adressiert sind ; und Nachrichten, die in das SMBus- Adressauflösungsprotokoll (ARP) für die dynamische Adresszuweisung und -verwaltung eingebunden sind .

In der Praxis verwenden die meisten Slaves Anforderungs-Antwort-Steuerungsmodelle, bei denen ein oder mehrere Bytes nach einem Schreibbefehl als Befehl oder Adresse behandelt werden. Diese Bytes bestimmen, wie nachfolgend geschriebene Bytes behandelt werden oder wie der Slave auf nachfolgende Lesevorgänge reagiert. Die meisten SMBus-Operationen beinhalten Einzelbyte-Befehle.

Nachrichtenbeispiel: 24C32 EEPROM

STMicroelectronics 24C08: serielles EEPROM mit I 2 C-Bus

Ein spezifisches Beispiel ist das EEPROM vom Typ 24C32 , das zwei Anforderungsbytes verwendet, die als Adresse High und Adresse Low bezeichnet werden. (Demnach können diese EEPROMs nicht von reinen SMBus-Hosts verwendet werden, die nur Einzelbyte-Befehle oder -Adressen unterstützen.) Diese Bytes werden zum Adressieren von Bytes innerhalb des 32-  kbit- (oder 4-  kB- ) EEPROM-Adressraums verwendet. Dieselbe Zwei-Byte-Adressierung wird auch von größeren EEPROMs verwendet, wie dem 24C512, der 512 kBit (oder 64 kB) speichert. Das Schreiben und Lesen von Daten in diese EEPROMs verwendet ein einfaches Protokoll: Die Adresse wird geschrieben und dann werden die Daten bis zum Ende der Nachricht übertragen. Der Datenübertragungsteil des Protokolls kann auf dem SMBus zu Problemen führen, da den Datenbytes kein Zählwert vorangestellt ist und mehr als 32 Bytes gleichzeitig übertragen werden können. I 2 C EEPROMs kleiner als 32 kbit, wie das 2 kbit 24C02, werden oft auf dem SMBus mit ineffizienten Einzelbyte-Datenübertragungen verwendet, um dieses Problem zu lösen.

Eine einzelne Nachricht schreibt in das EEPROM. Nach dem START sendet der Master die Busadresse des Chips mit dem Richtungsbit clear ( write ), dann die 2-Byte-Adresse der Daten innerhalb des EEPROMs und dann die zu schreibenden Datenbytes ab dieser Adresse, gefolgt von einem STOP. Beim Schreiben mehrerer Bytes müssen sich alle Bytes in derselben 32-Byte-Seite befinden. Während er damit beschäftigt ist, diese Bytes im Speicher zu speichern, antwortet das EEPROM nicht auf weitere I 2 C-Anforderungen. (Das ist eine weitere Inkompatibilität mit SMBus: SMBus-Geräte müssen immer auf ihre Busadressen antworten.)

Um ab einer bestimmten Adresse im EEPROM zu lesen, wird eine kombinierte Nachricht verwendet. Nach einem START schreibt der Master zuerst die Busadresse dieses Chips mit dem Richtungsbit clear ( write ) und dann die zwei Bytes der EEPROM-Datenadresse. Es sendet dann einen (wiederholten) START und die Busadresse des EEPROM mit gesetztem Richtungsbit ( read ). Das EEPROM antwortet dann mit den Datenbytes beginnend bei der angegebenen EEPROM-Datenadresse — eine kombinierte Nachricht: zuerst ein Schreiben, dann ein Lesen. Der Master gibt nach jedem gelesenen Byte außer dem letzten Byte ein ACK aus und gibt dann ein STOP aus. Das EEPROM inkrementiert die Adresse nach jedem übertragenen Datenbyte; Multi-Byte-Lesevorgänge können den gesamten Inhalt des EEPROM unter Verwendung einer kombinierten Nachricht abrufen.

Physikalische Schicht

I 2 C-Bus: R p sind Pull-Up-Widerstände, R s sind optionale Reihenwiderstände.

Auf der physikalischen Schicht sind sowohl SCL- als auch SDA-Leitungen ein Open-Drain- ( MOSFET ) oder Open-Collector- ( BJT ) Busdesign , daher wird für jede Leitung ein Pull-Up-Widerstand benötigt. Eine logische "0" wird ausgegeben, indem die Leitung auf Masse gezogen wird, und eine logische "1" wird ausgegeben, indem die Leitung schweben lässt ( hohe Ausgangsimpedanz ), so dass der Pull-up-Widerstand sie hoch zieht. Eine Linie wird nie aktiv hochgefahren. Diese Verdrahtung ermöglicht es mehreren Knoten, sich ohne Kurzschlüsse durch Signalkonflikte mit dem Bus zu verbinden. Hochgeschwindigkeitssysteme (und einige andere) können eine Stromquelle anstelle eines Widerstands verwenden, um nur SCL oder sowohl SCL als auch SDA hochzuziehen, um eine höhere Buskapazität aufzunehmen und schnellere Anstiegszeiten zu ermöglichen.

Eine wichtige Folge davon ist, dass mehrere Knoten die Leitungen gleichzeitig ansteuern können. Wenn irgendein Knoten die Leitung auf Low treibt, wird sie auf Low sein. Knoten, die versuchen, eine logische Eins zu übertragen (dh die Leitung hoch schweben lassen), können dies erkennen und daraus schließen, dass gleichzeitig ein anderer Knoten aktiv ist.

Bei SCL wird dies als Clock-Stretching bezeichnet und ist ein Mechanismus zur Flusskontrolle für Slaves. Bei Verwendung auf SDA wird dies als Arbitrierung bezeichnet und stellt sicher, dass immer nur ein Sender gleichzeitig vorhanden ist.

Im Leerlauf sind beide Leitungen high. Um eine Transaktion zu starten, wird SDA auf Low gezogen, während SCL auf High bleibt. Es ist illegal, einen Stop-Marker zu senden, indem SDA wieder hochfloat (obwohl eine solche "Void-Nachricht" normalerweise harmlos ist), also ist der nächste Schritt, SCL auf niedrig zu ziehen.

Mit Ausnahme der Start- und Stoppsignale ändert sich die SDA-Leitung nur, wenn der Takt niedrig ist; Das Übertragen eines Datenbits besteht darin, die Taktleitung hoch zu pulsieren, während die Datenleitung stabil auf dem gewünschten Pegel gehalten wird.

Während SCL niedrig ist, setzt der Sender (zunächst der Master) SDA auf den gewünschten Wert und lässt SCL (nach einer kleinen Verzögerung, damit sich der Wert ausbreiten kann) hoch schweben. Der Master wartet dann, bis SCL tatsächlich hoch geht; dies wird durch die endliche Anstiegszeit des SCL-Signals (die RC-Zeitkonstante des Pull-Up-Widerstands und die parasitäre Kapazität des Busses) verzögert und kann zusätzlich durch eine Taktdehnung eines Slaves verzögert werden.

Sobald SCL High ist, wartet der Master eine Mindestzeit (4 µs für Standard-Speed-I 2 C), um sicherzustellen, dass der Empfänger das Bit gesehen hat, und zieht es dann wieder auf Low. Damit ist die Übertragung eines Bits abgeschlossen.

Nach jeweils 8 Datenbits in eine Richtung wird ein "Acknowledge"-Bit in die andere Richtung übertragen. Der Sender und der Empfänger schalten für ein Bit um, und der ursprüngliche Empfänger sendet ein einzelnes "0"-Bit (ACK) zurück. Wenn der Sender stattdessen ein "1"-Bit (NACK) sieht, lernt er Folgendes:

  • (Wenn Master an Slave sendet) Der Slave kann die Daten nicht annehmen. Kein solcher Slave, Befehl nicht verstanden oder keine Daten mehr annehmen können.
  • (Wenn Slave zum Master sendet) Der Master wünscht, dass die Übertragung nach diesem Datenbyte stoppt.

Nur die SDA-Leitung ändert die Richtung während der Bestätigungsbits; der SCL wird immer vom Master gesteuert.

Nach dem Bestätigungsbit ist die Taktleitung niedrig und der Master kann eines von drei Dingen tun:

  • Beginnen Sie mit der Übertragung eines weiteren Datenbytes: Der Sender setzt SDA und der Master pulsiert SCL auf High.
  • Senden Sie einen "Stop": Setzen Sie SDA auf niedrig, lassen Sie SCL auf hoch und lassen Sie dann SDA auf hoch gehen. Dadurch wird der I 2 C-Bus freigegeben.
  • Senden Sie einen "Wiederholten Start": SDA hoch setzen, SCL hoch gehen lassen, dann SDA wieder niedrig ziehen. Dadurch wird eine neue I 2 C-Bus-Nachricht gestartet, ohne den Bus freizugeben.

Clock-Stretching mit SCL

Eines der wichtigsten Merkmale des I 2 C-Protokolls ist die Taktdehnung. Ein adressiertes Slave-Gerät kann die Taktleitung (SCL) niedrig halten, nachdem es ein Byte empfangen (oder gesendet) hat, was anzeigt, dass es noch nicht bereit ist, weitere Daten zu verarbeiten. Der mit dem Slave kommunizierende Master darf die Übertragung des aktuellen Bits nicht beenden, sondern muss warten, bis die Taktleitung tatsächlich hoch geht. Wenn der Slave Clock-Stretching betreibt, ist die Clock-Leitung immer noch niedrig (da die Verbindungen Open-Drain sind ). Das gleiche gilt, wenn ein zweiter, langsamerer Master gleichzeitig versucht, die Uhr zu steuern. (Wenn es mehr als einen Master gibt, verlieren normalerweise alle außer einem die Arbitration.)

Der Master muss warten, bis er beobachtet, dass die Taktleitung hoch wird, und eine zusätzliche minimale Zeit (4 μs für Standard 100 kbit/s I 2 C), bevor er den Takt wieder niedrig zieht.

Obwohl der Master die SCL-Leitung auch so lange niedrig halten kann, wie er möchte (dies ist in der neuesten Rev. 6 des Protokolls – Unterabschnitt 3.1.1) nicht erlaubt, wird der Begriff "Clock-Stretching" normalerweise nur verwendet, wenn Slaves dies tun . Obwohl theoretisch jeder Taktimpuls gestreckt werden kann, werden im Allgemeinen die Intervalle vor oder nach dem Bestätigungsbit verwendet. Wenn der Slave beispielsweise ein Mikrocontroller ist , könnte seine I 2 C-Schnittstelle den Takt nach jedem Byte dehnen, bis die Software entscheidet, ob eine positive Bestätigung oder eine NACK gesendet wird.

Clock-Stretching ist das einzige Mal in I 2 C, bei dem der Slave SCL ansteuert. Viele Slaves brauchen kein Clock-Stretching und behandeln SCL daher als reinen Eingang ohne Schaltung, um ihn zu steuern. Einige Master, wie sie in benutzerdefinierten ASICs zu finden sind, unterstützen möglicherweise kein Clock-Stretching; oft werden diese Geräte als "Zwei-Draht-Schnittstelle" und nicht als I 2 C bezeichnet.

Um einen minimalen Bus zu gewährleisten Durchsatz , SMBus legt Grenzen, wie weit Uhren können gestreckt werden. Hosts und Slaves, die diese Grenzwerte einhalten, können den Buszugriff nicht länger als kurzzeitig blockieren, was bei reinen I 2 C-Systemen keine Garantie ist.

Schiedsverfahren mit SDA

Jeder Master überwacht den Bus auf Start- und Stoppbits und startet keine Nachricht, während ein anderer Master den Bus beschäftigt. Jedoch können zwei Master etwa gleichzeitig mit der Übertragung beginnen; in diesem Fall findet eine Schlichtung statt. Der Slave-Sendemodus kann auch arbitriert werden, wenn ein Master mehrere Slaves anspricht, dies ist jedoch weniger üblich. Im Gegensatz zu Protokollen (wie Ethernet ), die zufällige Backoff-Verzögerungen verwenden, bevor sie einen Wiederholungsversuch ausgeben, hat I 2 C eine deterministische Arbitrierungsrichtlinie. Jeder Sender prüft den Pegel der Datenleitung (SDA) und vergleicht ihn mit den erwarteten Pegeln; wenn sie nicht übereinstimmen, hat dieser Sender die Arbitrierung verloren und fällt aus dieser Protokollinteraktion aus.

Wenn ein Sender SDA auf 1 setzt (kein Signal ansteuern) und ein zweiter Sender auf 0 setzt (auf Masse ziehen), ist das Ergebnis, dass die Leitung niedrig ist. Der erste Sender stellt dann fest, dass sich der Pegel der Leitung von dem erwarteten unterscheidet und schließt daraus, dass ein anderer Knoten sendet. Der erste Knoten, der einen solchen Unterschied bemerkt, ist derjenige, der die Arbitrierung verliert: Er hört auf, SDA zu steuern. Wenn es ein Master ist, hört es auch auf, SCL zu steuern und wartet auf STOP; dann kann es versuchen, seine gesamte Nachricht erneut auszugeben. In der Zwischenzeit hat der andere Knoten keinen Unterschied zwischen den erwarteten und den tatsächlichen Pegeln auf SDA bemerkt und setzt daher die Übertragung fort. Dies kann ohne Probleme geschehen, da das Signal bisher genau so war, wie es erwartet wurde; kein anderer Sender hat seine Nachricht gestört.

Wenn die beiden Master eine Nachricht an zwei verschiedene Slaves senden, "gewinnt" immer derjenige, der die niedrigere Slave-Adresse sendet, die Arbitrierung in der Adressstufe. Da die beiden Master Nachrichten an dieselbe Slave-Adresse senden können und sich Adressen manchmal auf mehrere Slaves beziehen, muss die Arbitrierung manchmal bis in die Datenstufen fortgesetzt werden.

Schlichtung findet sehr selten statt, ist aber für eine ordnungsgemäße Multi-Master-Unterstützung notwendig. Wie beim Clock-Stretching unterstützen nicht alle Geräte die Arbitrierung. Diejenigen, die dies tun, bezeichnen sich im Allgemeinen als unterstützende "Multi-Master"-Kommunikation.

Ein Fall, der bei Multi-Master-I 2 C-Implementierungen sorgfältig gehandhabt werden muss, ist der, dass die Master miteinander sprechen. Ein Master kann die Arbitrierung für eine eingehende Nachricht verlieren und muss seine Rolle rechtzeitig vom Master zum Slave ändern, um seine eigene Adresse zu bestätigen.

In dem äußerst seltenen Fall, dass zwei Master gleichzeitig identische Nachrichten senden, sehen beide die Kommunikation als erfolgreich an, der Slave sieht jedoch nur eine Nachricht. Aus diesem Grund muss, wenn auf einen Slave von mehreren Mastern zugegriffen werden kann, jeder vom Slave erkannte Befehl entweder idempotent sein oder es muss garantiert sein, dass er niemals von zwei Mastern gleichzeitig ausgegeben wird. (Zum Beispiel muss ein Befehl, der nur von einem Master ausgegeben wird, nicht idempotent sein, noch muss ein bestimmter Befehl idempotent sein, wenn ein Mechanismus zum gegenseitigen Ausschluss sicherstellt, dass zu einem bestimmten Zeitpunkt nur ein Master veranlasst werden kann, diesen Befehl auszugeben .)

Schiedsverfahren im SMBus

Während I 2 C nur zwischen Mastern arbitriert, verwendet SMBus die Arbitrierung in drei zusätzlichen Kontexten, bei denen mehrere Slaves auf den Master antworten und einer seine Nachricht durchlässt.

  • Obwohl konzeptionell ein Single-Master-Bus, fungiert ein Slave-Gerät, das das "Host-Benachrichtigungsprotokoll" unterstützt, als Master, um die Benachrichtigung durchzuführen. Er belegt den Bus und schreibt eine 3-Byte-Nachricht an die reservierte "SMBus-Host"-Adresse (0x08) und übergibt seine Adresse und zwei Datenbytes. Wenn zwei Slaves gleichzeitig versuchen, den Host zu benachrichtigen, verliert einer von ihnen die Arbitrierung und muss es erneut versuchen.
  • Ein alternatives Slave-Benachrichtigungssystem verwendet das separate SMBALERT#-Signal, um Aufmerksamkeit anzufordern. In diesem Fall führt der Host einen 1-Byte-Lesevorgang von der reservierten "SMBus Alert Response Address" (0x0C) durch, die eine Art Broadcast-Adresse ist. Alle alarmierenden Slaves antworten mit einem Datenbyte, das ihre eigene Adresse enthält. Wenn der Slave seine eigene Adresse erfolgreich überträgt (wodurch die Arbitrierung gegen andere gewonnen wird), hört er auf, diesen Interrupt auszulösen. Sowohl in diesem als auch im vorhergehenden Fall stellt die Arbitrierung sicher, dass die Nachricht eines Slaves empfangen wird und die anderen wissen, dass sie es erneut versuchen müssen.
  • SMBus unterstützt auch ein "Adressauflösungsprotokoll", bei dem Geräte eine 16-Byte-"universelle Geräte-ID" ( UDID ) zurückgeben. Mehrere Geräte können reagieren; derjenige mit der niedrigsten UDID gewinnt das Schiedsverfahren und wird anerkannt.

Schiedsverfahren im PMBus

PMBus Version 1.3 erweitert das SMBus-Alert-Response-Protokoll in seinem "Zone Read"-Protokoll. Slaves können in "Zonen" gruppiert werden, und alle Slaves in einer Zone können adressiert werden, um zu antworten, wobei ihre Antworten maskiert (ohne unerwünschte Informationen), invertiert (so werden die gewünschten Informationen als 0 Bits gesendet, die die Arbitrierung gewinnen) oder neu geordnet ( daher werden die wichtigsten Informationen zuerst gesendet). Die Arbitrierung stellt sicher, dass die Antwort mit der höchsten Priorität diejenige ist, die zuerst an den Master zurückgegeben wird.

PMBus reserviert die I 2 C-Adressen 0x28 und 0x37 für Zonen-Lese- bzw. -Schreibvorgänge.

Unterschiede zwischen den Modi

Für die I 2 C-Kommunikation gibt es mehrere mögliche Betriebsarten . Alle sind insofern kompatibel, als der 100-kbit/s- Standardmodus immer verwendet werden kann, aber die Kombination von Geräten mit unterschiedlichen Fähigkeiten auf demselben Bus kann folgende Probleme verursachen:

  • Der Fast-Modus ist hochkompatibel und verschärft einfach einige der Timing-Parameter, um eine Geschwindigkeit von 400 kbit/s zu erreichen. Der schnelle Modus wird von I 2 C-Slave-Geräten weitgehend unterstützt , daher kann ein Master ihn verwenden, solange er weiß, dass die Buskapazität und die Pullup-Stärke dies zulassen.
  • Fast Mode Plus erreicht bis zu 1 Mbit/s mit leistungsstärkeren (20 mA) Treibern und Pull-Ups, um schnellere Anstiegs- und Abfallzeiten zu erreichen. Kompatibilität mit Standard- und Fast-Mode- Geräten (mit 3 mA Pull-Down-Fähigkeit) kann erreicht werden, wenn es eine Möglichkeit gibt, die Stärke der Klimmzüge beim Sprechen mit ihnen zu reduzieren.
  • Der Hochgeschwindigkeitsmodus (3,4 Mbit/s) ist mit normalen I 2 C-Geräten auf demselben Bus kompatibel , erfordert jedoch, dass der Master einen aktiven Pullup auf der Taktleitung hat, der während Hochgeschwindigkeitsübertragungen aktiviert ist. Das erste Datenbit wird mit einer normalen steigenden Open-Drain-Taktflanke übertragen, die gestreckt werden kann. Für die verbleibenden sieben Datenbits und das ACK treibt der Master den Takt zum geeigneten Zeitpunkt hoch und der Slave darf ihn nicht strecken. Allen Hochgeschwindigkeitsübertragungen geht ein Einzelbyte-"Mastercode" mit schneller oder Standardgeschwindigkeit voraus. Dieser Code dient drei Zwecken:
    1. es weist Hochgeschwindigkeits-Slave-Geräte an, zu Hochgeschwindigkeits-Timing-Regeln zu wechseln,
    2. es stellt sicher, dass Geräte mit schneller oder normaler Geschwindigkeit nicht versuchen, an der Übertragung teilzunehmen (weil es nicht mit ihrer Adresse übereinstimmt), und
    3. weil es den Master identifiziert (es gibt acht Mastercodes, und jeder Master muss einen anderen verwenden), stellt es sicher, dass die Arbitrierung vor dem Hochgeschwindigkeitsteil der Übertragung abgeschlossen ist, und daher muss der Hochgeschwindigkeitsteil keine Rücksicht auf diese Fähigkeit.
  • Der ultraschnelle Modus ist im Wesentlichen eine schreibgeschützte I 2 C-Untermenge, die mit anderen Modi inkompatibel ist, außer dass es einfach ist, Unterstützung dafür zu einem vorhandenen I 2 C-Schnittstellen-Hardwaredesign hinzuzufügen . Es ist nur ein Master zulässig, der die Datenleitungen jederzeit aktiv ansteuert, um eine Übertragungsrate von 5 Mbit/s zu erreichen. Taktdehnung, Arbitrierung, Leseübertragungen und Bestätigungen werden alle weggelassen. Es ist vor allem für animierten bestimmt LED - Anzeigen , wo ein Übertragungsfehler würde einen belanglosen kurzen visuellen nur dazu führen , Glitch . Die Ähnlichkeit mit anderen I 2 C-Bus-Modi beschränkt sich auf:
    • die Start- und Stoppbedingungen werden verwendet, um Transfers abzugrenzen,
    • Die I 2 C-Adressierung ermöglicht es mehreren Slave-Geräten, den Bus ohne SPI-Bus- Stil-Slave-Auswahlsignale zu teilen , und
    • Pro übertragenem Byte wird ein neunter Takt gesendet, der die Position der ungenutzten Quittungsbits markiert.

Einige Anbieter bieten einen sogenannten Nicht-Standard- Turbo-Modus mit einer Geschwindigkeit von bis zu 1,4 Mbit/s an.

In allen Betriebsarten wird die Taktfrequenz durch den Master (s) gesteuert wird , und eine längere als normale Bus kann durch an einer langsamer als Nenndrehzahl betrieben werden Untertakten .

Stromkreisverbindungen

Ein 16-Bit- ADC- Board mit I 2 C-Schnittstelle

I 2 C ist beliebt, um Peripherieschaltungen mit Prototyping-Systemen wie dem Arduino und Raspberry Pi zu verbinden . I 2 C verwendet keinen standardisierten Verbinder, jedoch haben Platinendesigner verschiedene Verdrahtungsschemata für I 2 C-Verbindungen erstellt. Um mögliche Schäden durch das verkehrte Einstecken von 0,1-Zoll-Stiftleisten zu minimieren, haben einige Entwickler vorgeschlagen, abwechselnde Signal- und Stromanschlüsse der folgenden Verdrahtungsschemata zu verwenden: (GND, SCL, VCC, SDA) oder (VCC, SDA, GND, SCL) .

Die überwiegende Mehrheit der Anwendungen verwendet I 2 C so, wie es ursprünglich entwickelt wurde – Peripherie-ICs, die direkt mit einem Prozessor auf derselben Leiterplatte verdrahtet sind, und daher über relativ kurze Entfernungen von weniger als 30 cm ohne Stecker . Bei Verwendung eines Differenzialtreibers kann eine alternative Version von I 2 C jedoch bis zu 20 Meter (möglicherweise über 100 Meter) über CAT5 oder ein anderes Kabel kommunizieren .

Mehrere Standardsteckverbinder führen I 2 C-Signale. Der UEXT- Anschluss trägt beispielsweise I 2 C; der 10-polige iPack-Anschluss trägt I 2 C; der 6P6C Lego Mindstorms NXT-Anschluss trägt I 2 C; einige Leute verwenden die 8P8C-Anschlüsse und das CAT5-Kabel, die normalerweise für die Ethernet-Physical-Layer verwendet werden, um stattdessen differentiell codierte I 2 C-Signale oder verstärkte Single-Ended-I 2 C-Signale zu übertragen; und jeder HDMI- und die meisten DVI- und VGA-Anschlüsse übertragen DDC2- Daten über I 2 C.

Puffern und Multiplexen

Wenn in einem System viele I 2 C-Geräte vorhanden sind, kann es erforderlich sein, Buspuffer oder Multiplexer einzuschließen , um große Bussegmente in kleinere aufzuteilen. Dies kann erforderlich sein, um die Kapazität eines Bussegments unter dem zulässigen Wert zu halten oder mehrere Geräte mit derselben Adresse durch einen Multiplexer zu trennen. Es gibt viele Arten von Multiplexern und Puffern, und alle müssen die Tatsache berücksichtigen, dass I 2 C-Leitungen als bidirektional spezifiziert sind. Multiplexer können mit analogen Schaltern implementiert werden, die ein Segment mit einem anderen verbinden können. Analogschalter behalten die bidirektionale Natur der Leitungen bei, isolieren jedoch nicht die Kapazität eines Segments von einem anderen und bieten keine Pufferfähigkeit.

Puffer können verwendet werden, um die Kapazität eines Segments von einem anderen zu isolieren und/oder zu ermöglichen, dass I 2 C über längere Kabel oder Leiterbahnen gesendet wird. Puffer für bidirektionale Leitungen wie I 2 C müssen eines von mehreren Schemata zum Verhindern von Latch-up verwenden. I 2 C ist Open-Drain, also müssen Puffer auf einer Seite ein Low fahren, wenn sie auf der anderen ein Low sehen. Ein Verfahren zum Verhindern von Latch-up besteht darin, dass ein Puffer sorgfältig ausgewählte Eingangs- und Ausgangspegel aufweist, so dass der Ausgangspegel seines Treibers höher als sein Eingangsschwellenwert ist, wodurch verhindert wird, dass er sich selbst triggert. Zum Beispiel kann ein Puffer einen Eingangsschwellenwert von 0,4 V zum Erkennen eines niedrigen Pegels haben, aber einen niedrigen Ausgangspegel von 0,5 V. Diese Methode erfordert, dass alle anderen Geräte auf dem Bus über kompatible Schwellenwerte verfügen und bedeutet oft, dass mehrere Puffer dies implementieren Schema können nicht in Reihe geschaltet werden.

Alternativ existieren andere Arten von Puffern, die Stromverstärker implementieren oder den Zustand verfolgen (dh welche Seite den Bus niedrig gefahren hat), um ein Latch-up zu verhindern. Die Zustandsmethode bedeutet typischerweise, dass während einer Übergabe ein unbeabsichtigter Impuls erzeugt wird, wenn eine Seite den Bus auf Low treibt, dann die andere ihn auf Low treibt und dann die erste Seite freigibt (dies ist bei einer I 2 C-Bestätigung üblich).

Teilen von SCL zwischen mehreren Bussen

Bei einem einzelnen Master ist es möglich, dass sich mehrere I 2 C-Busse dieselbe SCL-Leitung teilen. Die Pakete auf jedem Bus werden entweder nacheinander oder gleichzeitig gesendet. Dies ist möglich, da die Kommunikation auf jedem Bus in abwechselnd kurze Perioden mit hohem SCL gefolgt von kurzen Perioden mit niedrigem SCL unterteilt werden kann. Und die Uhr kann gestreckt werden, wenn ein Bus in einem Bundesland mehr Zeit braucht.

Vorteile sind die gleichzeitige Verwendung von Slave-Geräten mit derselben Adresse und die Einsparung von Verbindungen oder ein schnellerer Durchsatz durch die gleichzeitige Verwendung mehrerer Datenleitungen.

Linienzustandstabelle

Diese Tabellen zeigen die verschiedenen atomaren Zustände und Bitoperationen, die während einer I 2 C-Nachricht auftreten können.

Leitungsstatus
Typ Inaktiver Bus

(N)

Start

(S)

Leerlauf

(ich)

Halt

(P)

Uhrdehnung

(CS)

Notiz Frei, ein Schiedsverfahren zu beanspruchen Busreklamation (Master) Bus beansprucht (Master) Busbefreiung (Master) Von Sklave angehalten
SDA Passiver Klimmzug Fallende Flanke (Master) Tief gehalten (Meister) Steigende Flanke (Master) Egal
SCL Passiver Klimmzug Passiver Klimmzug Passiver Klimmzug Passiver Klimmzug Niedrig gehalten (Sklave)
Leitungsstatus
Typ Senden eines Datenbits (1) (0)

(SDA wird nach SCL gesetzt/abgetastet, um eine falsche Zustandserkennung zu vermeiden)

Empfängerantwort mit ACK-Bit

(Byte vom Sender empfangen)

Empfängerantwort mit NACK-Bit

(Byte nicht vom Sender empfangen)

Bit-Setup (Bs) Bemusterungsbereit (Bx) Bit-Setup (Bs) ACK (A) Bit-Setup (Bs) NACK (A')
Notiz Sender gesetztes Bit (Master/Slave) Sample-Bit des Empfängers (Master/Slave) Sender Sender hi-Z Absender sieht, dass SDA niedrig ist Sender Sender hi-Z Absender sieht, dass SDA hoch ist
SDA Bit setzen (nach SCL fällt) Capture-Bit (nach Anstieg von SCL) Vom Empfänger niedrig gehalten (nachdem SCL gefallen ist) Wird vom Empfänger hoch (oder passiv hoch) getrieben (nachdem SCL fällt)
SCL Fallende Flanke (Master) Steigende Flanke (Master) Fallende Flanke (Master) Steigende Flanke (Master) Fallende Flanke (Master) Steigende Flanke (Master)
Leitungszustand (wiederholter Start)
Typ Einrichten für ein (Sr)-Signal nach einem ACK/NACK Wiederholter Start (Sr)
Notiz Starten Sie hier von ACK Vermeidung des Stoppzustands (P) Starten Sie hier von NACK Wie Startsignal (S)
SDA Wurde für ACK niedrig gehalten Steigende Flanke Passiv hoch Passiv hoch Fallende Flanke (Master)
SCL Fallende Flanke (Master) Tief gehalten Steigende Flanke (Master) Passiv hoch Passiver Klimmzug

Adressierungsstruktur

7-Bit-Adressierung

Gebiet: S I 2 C Adressfeld R/W' EIN I 2 C Nachrichtensequenzen... P
Typ Start Byte 1 ACK Byte X usw...

Rest des Lesens oder Schreibens

Nachricht geht hier

Halt
Bitposition im Byte X 7 6 5 4 3 2 1 0
7-Bit-Adressposition 7 6 5 4 3 2 1
Notiz MSB LSB 1 = Lesen
0 = Schreiben

10-Bit-Adressierung

Gebiet: S 10-Bit-Modusanzeige Obere Adresse R/W' EIN Unteres Adressfeld I 2 C Nachrichtensequenzen P
Typ Start Byte 1 ACK Byte 2 Byte X usw.

Rest des Lesens oder Schreibens

Nachricht geht hier

Halt
Bitposition im Byte X 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
Bitwert 1 1 1 1 0 x x x x x x x x x x x
10-Bit-Adresspos 10 9 8 7 6 5 4 3 2 1
Notiz Zeigt 10-Bit-Modus an MSB 1 = Lesen LSB
0 = Schreiben

Reservierte Adressen im 7-Bit-Adressraum

Für Sonderfunktionen sind zwei Gruppen von Adressen reserviert:

  • 0000 XXX
  • 1111 XXX
Reserviert
Adresse
Index
8-Bit-Byte Beschreibung
7-Bit-Adresse R/W-Wert
MSB
(4-Bit)
LSB
(3-Bit)
1-Bit
1 0000 000 0 Allgemeiner Anruf
2 0000 000 1 Startbyte
3 0000 001 x CBUS-Adresse
4 0000 010 x Reserviert für verschiedene Busformate
5 0000 011 x Für zukünftige Zwecke reserviert
6 0000 1XX x HS-Modus-Mastercode
7 1111 1XX 1 Geräte ID
8 1111 0XX x 10-Bit-Slave-Adressierung

SMBus reserviert einige zusätzliche Adressen. Insbesondere 0001 000ist für den SMBus-Host reserviert, der von Master-fähigen Geräten verwendet werden kann, 0001 100die "SMBus-Alert-Antwortadresse", die vom Host nach einem Out-of-Band-Interrupt abgefragt wird, und 1100 001ist die Standardadresse, die ursprünglich von Geräten verwendet, die eine dynamische Adressvergabe durchführen können.

Nicht reservierte Adressen im 7-Bit-Adressraum

MSB (4-Bit) Typische Verwendung
0001 Digitalempfänger, SMBus
0010 TV-Videozeilen-Decoder, IPMB
0011 AV- Codecs
0100 Video-Encoder, GPIO- Expander
0101 ACCESS-Bus , PMBus
0110 VESA DDC , PMBus
0111 Display-Controller
1000 TV-Signalverarbeitung, Audioverarbeitung, SMBus
1001 AV-Umschaltung, ADCs und DACs , IPMB , SMBus
1010 Speicher, Echtzeituhr
1011 AV-Prozessoren
1100 PLLs und Tuner, Modulatoren und Demodulatoren, SMBus
1101 AV-Prozessoren und -Decoder, Audio-Leistungsverstärker, SMBus
1110 AV - Farbraum - Wandler

Obwohl MSB 1111 für die Geräte-ID- und 10-Bit-Slave-Adressierung reserviert ist, wird es auch von VESA- DDC- Display-abhängigen Geräten wie Zeigegeräten verwendet .

Transaktionsformat

Eine I 2 C- Transaktion besteht aus einer oder mehreren Nachrichten . Jede Nachricht beginnt mit einem Startsymbol und die Transaktion endet mit einem Stoppsymbol. Startsymbole nach dem ersten, die eine Nachricht, aber keine Transaktion beginnen, werden als wiederholte Startsymbole bezeichnet.

Jede Nachricht ist ein Lesen oder Schreiben. Eine Transaktion, die aus einer einzelnen Nachricht besteht, wird entweder als Lese- oder Schreibtransaktion bezeichnet. Eine Transaktion, die aus mehreren Nachrichten besteht, wird als kombinierte Transaktion bezeichnet. Die gebräuchlichste Form der letzteren ist eine Schreibnachricht, die geräteinterne Adressinformationen bereitstellt, gefolgt von einer Lesenachricht.

Viele I 2 C-Geräte unterscheiden nicht zwischen einer kombinierten Transaktion und denselben Nachrichten, die als separate Transaktionen gesendet werden, aber nicht alle. Das Geräte-ID-Protokoll erfordert eine einzige Transaktion; Slaves dürfen nicht antworten, wenn sie ein Stoppsymbol beachten. Auch Konfigurations-, Kalibrier- oder Selbsttestmodi, die zu ungewöhnlichen Reaktionen des Slaves führen, werden am Ende einer Transaktion oft automatisch beendet.

Zeitdiagramm

Datenübertragungssequenz
  1. Die Datenübertragung erfolgt mit einer eingeleiteten Startbedingung (S) signalisiert durch SDA Low gezogen wird , während SCL hoch bleibt.
  2. SCL wird niedrig gezogen und SDA setzt den ersten Datenbitpegel, während SCL niedrig gehalten wird (während der Zeit des blauen Balkens).
  3. Die Daten werden abgetastet (empfangen), wenn SCL für das erste Bit (B1) ansteigt. Damit ein Bit gültig ist, darf sich SDA zwischen einer steigenden Flanke von SCL und der darauffolgenden fallenden Flanke (die gesamte grüne Balkenzeit) nicht ändern.
  4. Dieser Prozess wiederholt sich, wobei SDA übergeht, während SCL niedrig ist, und die Daten gelesen werden, während SCL hoch ist (B2 bis Bn).
  5. Auf das letzte Bit folgt ein Taktimpuls, während dessen SDA als Vorbereitung auf das Stoppbit auf Low gezogen wird .
  6. Eine Stoppbedingung (P) wird signalisiert, wenn SCL ansteigt, gefolgt von einem SDA-Ansteigen.

Um eine falsche Markierungserkennung zu vermeiden, gibt es eine minimale Verzögerung zwischen der abfallenden SCL-Flanke und der SDA-Änderung und zwischen der SDA-Änderung und der steigenden SCL-Flanke. Beachten Sie, dass eine I 2 C-Nachricht mit n Datenbits (einschließlich Bestätigungen) n + 1 Taktimpulse enthält .

Beispiel für das Bit-Banging des I 2 C-Master-Protokolls

Unten ist ein Beispiel für das Bit-Banging des I 2 C-Protokolls als I 2 C-Master. Das Beispiel ist in Pseudo- C geschrieben . Es veranschaulicht alle zuvor beschriebenen I 2 C-Merkmale (Clock-Stretching, Arbitrierung, Start/Stop-Bit, Ack/Nack).

// Hardware-specific support functions that MUST be customized:
#define I2CSPEED 100
void I2C_delay(void);
bool read_SCL(void);  // Return current level of SCL line, 0 or 1
bool read_SDA(void);  // Return current level of SDA line, 0 or 1
void set_SCL(void);   // Do not drive SCL (set pin high-impedance)
void clear_SCL(void); // Actively drive SCL signal low
void set_SDA(void);   // Do not drive SDA (set pin high-impedance)
void clear_SDA(void); // Actively drive SDA signal low
void arbitration_lost(void);

bool started = false; // global data

void i2c_start_cond(void) {
  if (started) { 
    // if started, do a restart condition
    // set SDA to 1
    set_SDA();
    I2C_delay();
    set_SCL();
    while (read_SCL() == 0) { // Clock stretching
      // You should add timeout to this loop
    }

    // Repeated start setup time, minimum 4.7us
    I2C_delay();
  }

  if (read_SDA() == 0) {
    arbitration_lost();
  }

  // SCL is high, set SDA from 1 to 0.
  clear_SDA();
  I2C_delay();
  clear_SCL();
  started = true;
}

void i2c_stop_cond(void) {
  // set SDA to 0
  clear_SDA();
  I2C_delay();

  set_SCL();
  // Clock stretching
  while (read_SCL() == 0) {
    // add timeout to this loop.
  }

  // Stop bit setup time, minimum 4us
  I2C_delay();

  // SCL is high, set SDA from 0 to 1
  set_SDA();
  I2C_delay();

  if (read_SDA() == 0) {
    arbitration_lost();
  }

  started = false;
}

// Write a bit to I2C bus
void i2c_write_bit(bool bit) {
  if (bit) {
    set_SDA();
  } else {
    clear_SDA();
  }

  // SDA change propagation delay
  I2C_delay();

  // Set SCL high to indicate a new valid SDA value is available
  set_SCL();

  // Wait for SDA value to be read by slave, minimum of 4us for standard mode
  I2C_delay();

  while (read_SCL() == 0) { // Clock stretching
    // You should add timeout to this loop
  }

  // SCL is high, now data is valid
  // If SDA is high, check that nobody else is driving SDA
  if (bit && (read_SDA() == 0)) {
    arbitration_lost();
  }

  // Clear the SCL to low in preparation for next change
  clear_SCL();
}

// Read a bit from I2C bus
bool i2c_read_bit(void) {
  bool bit;

  // Let the slave drive data
  set_SDA();

  // Wait for SDA value to be written by slave, minimum of 4us for standard mode
  I2C_delay();

  // Set SCL high to indicate a new valid SDA value is available
  set_SCL();

  while (read_SCL() == 0) { // Clock stretching
    // You should add timeout to this loop
  }

  // Wait for SDA value to be written by slave, minimum of 4us for standard mode
  I2C_delay();

  // SCL is high, read out bit
  bit = read_SDA();

  // Set SCL low in preparation for next operation
  clear_SCL();

  return bit;
}

// Write a byte to I2C bus. Return 0 if ack by the slave.
bool i2c_write_byte(bool send_start,
                    bool send_stop,
                    unsigned char byte) {
  unsigned bit;
  bool     nack;

  if (send_start) {
    i2c_start_cond();
  }

  for (bit = 0; bit < 8; ++bit) {
    i2c_write_bit((byte & 0x80) != 0);
    byte <<= 1;
  }

  nack = i2c_read_bit();

  if (send_stop) {
    i2c_stop_cond();
  }

  return nack;
}

// Read a byte from I2C bus
unsigned char i2c_read_byte(bool nack, bool send_stop) {
  unsigned char byte = 0;
  unsigned char bit;

  for (bit = 0; bit < 8; ++bit) {
    byte = (byte << 1) | i2c_read_bit();
  }

  i2c_write_bit(nack);

  if (send_stop) {
    i2c_stop_cond();
  }

  return byte;
}

void I2C_delay(void) { 
  volatile int v;
  int i;

  for (i = 0; i < I2CSPEED / 2; ++i) {
    v;
  }
}

Betriebssystemunterstützung

  • Unter AmigaOS kann man die Komponente i2c.resource für AmigaOS 4.x und MorphOS 3.x oder die Shared Library i2c.library von Wilhelm Noeker für ältere Systeme verwenden.
  • Arduino- Entwickler können die Bibliothek "Wire" verwenden.
  • Maximite unterstützt nativ die I 2 C-Kommunikation als Teil seines MMBasic.
  • PICAXE verwendet die Befehle i2c und hi2c.
  • eCos unterstützt I 2 C für mehrere Hardwarearchitekturen.
  • ChibiOS/RT unterstützt I 2 C für mehrere Hardwarearchitekturen.
  • FreeBSD , NetBSD und OpenBSD bieten auch ein I 2 C-Framework mit Unterstützung für eine Reihe gängiger Master-Controller und Sensoren.
    • Seit OpenBSD 3.9 (veröffentlicht am 1. Mai 2006 ; vor 15 Jahren ) prüft ein zentrales i2c_scan- Subsystem während des Bootens alle möglichen Sensorchips auf einmal, wobei ein Ad-hoc- Gewichtungsschema und eine lokale Caching-Funktion zum Lesen von Registerwerten von den I 2 C-Slaves verwendet werden; dies ermöglicht das Testen von Sensoren auf handelsüblicher i386/amd64 -Allzweckhardware während des Bootens ohne jegliche Konfiguration durch den Benutzer oder eine merkliche Testverzögerung; die Matching-Prozeduren der einzelnen Treiber müssen sich dann nur noch auf einen string-basierten "Friendly-Name" zum Matching verlassen; Infolgedessen werden die meisten I 2 C-Sensortreiber in anwendbaren Architekturen standardmäßig automatisch aktiviert, ohne dass die Stabilität beeinträchtigt wird; einzelne Sensoren, sowohl I 2 C als auch andere, werden über das sysctl hw.sensors- Framework in das Userland exportiert . Im März 2019 hat OpenBSD über zwei Dutzend Gerätetreiber auf I 2 C, die eine Art Sensor über das hw.sensors- Framework exportieren , und die meisten dieser Treiber sind standardmäßig in den i386/amd64- Kerneln von OpenBSD vollständig aktiviert . ( 2006-05-01 ) GENERIC
    • In NetBSD existieren über zwei Dutzend I 2 C-Slave-Geräte mit Hardware-Monitoring-Sensoren, auf die über das sysmon envsys- Framework als Eigenschaftslisten zugegriffen werden kann . Auf Allzweck-Hardware muss jeder Treiber seine eigenen Tests durchführen, daher sind alle Treiber für die I 2 C-Slaves standardmäßig in NetBSD in GENERICi386/amd64-Builds deaktiviert .
  • Unter Linux wird I 2 C mit einem Gerätetreiber für das jeweilige Gerät und einem anderen für den I 2 C (oder SMBus ) Adapter behandelt, an den es angeschlossen ist. Hunderte solcher Treiber sind Teil aktueller Linux-Kernel-Releases.
  • In Mac OS X gibt es etwa zwei Dutzend I 2 C-Kernel-Erweiterungen, die mit Sensoren kommunizieren, um Spannung, Strom, Temperatur, Bewegung und andere physikalische Zustände abzulesen.
  • In Microsoft Windows wird I 2 C durch die jeweiligen Gerätetreiber eines Großteils der in der Branche verfügbaren Hardware implementiert. Für HID- Embedded/ SoC- Geräte verfügen Windows 8 und höher über einen integrierten I²C-Bustreiber.
  • In Windows CE wird I 2 C durch die entsprechenden Gerätetreiber eines Großteils der in der Industrie verfügbaren Hardware implementiert.
  • Unison OS , ein POSIX RTOS für IoT, unterstützt I 2 C für mehrere MCU- und MPU-Hardwarearchitekturen.
  • In RISC OS wird I 2 C mit einer generischen I 2 C-Schnittstelle vom IO-Controller bereitgestellt und vom OS-Modulsystem unterstützt
  • In den Betriebssystemen Sinclair QDOS und Minerva QL wird I 2 C von einer Reihe von Erweiterungen unterstützt, die von TF Services bereitgestellt werden .

Entwicklungswerkzeuge

Bei der Entwicklung oder Fehlerbehebung von Systemen, die I 2 C verwenden, kann die Sichtbarkeit auf der Ebene der Hardwaresignale wichtig sein.

Hostadapter

Es gibt eine Reihe von I 2 C-Hostadapter-Hardwarelösungen, um eine I 2 C-Master- oder Slave-Verbindung zu Hostcomputern herzustellen, auf denen Linux , Mac oder Windows ausgeführt wird . Die meisten Optionen sind USB- to-I 2 C-Adapter. Nicht alle erfordern proprietäre Treiber oder APIs .

Protokollanalysatoren

I 2 C-Protokollanalysatoren sind Werkzeuge, die einen I 2 C-Bus abtasten und die elektrischen Signale decodieren, um eine übergeordnete Ansicht der auf dem Bus übertragenen Daten zu erhalten.

Logikanalysatoren

Bei der Entwicklung und/oder Fehlersuche am I 2 C-Bus kann die Untersuchung von Hardwaresignalen sehr wichtig sein. Logikanalysatoren sind Werkzeuge zum Sammeln, Analysieren, Dekodieren und Speichern von Signalen, sodass Benutzer die Hochgeschwindigkeitswellenformen in Ruhe anzeigen können. Logikanalysatoren zeigen Zeitstempel jeder Signalpegeländerung an, die helfen können, Protokollprobleme zu finden. Die meisten Logikanalysatoren können Bussignale in High-Level-Protokolldaten decodieren und ASCII-Daten anzeigen.

Einschränkungen

Die Vergabe von Slave-Adressen ist eine Schwäche von I 2 C. Sieben Bit sind zu wenig, um Adresskollisionen zwischen den vielen Tausend verfügbaren Geräten zu vermeiden. Was das Problem von Adresskollisionen zwischen verschiedenen Herstellern verringert und auch die Verbindung zu mehreren identischen Geräten ermöglicht, ist, dass die Hersteller Pins zuweisen, mit denen die Slave-Adresse auf eine von wenigen Adressoptionen pro Gerät eingestellt werden kann. Zwei oder drei Pins sind typisch, und bei vielen Geräten gibt es drei oder mehr Verdrahtungsoptionen pro Adresspin.

10-Bit-I 2 C-Adressen sind noch nicht weit verbreitet und werden von vielen Host-Betriebssystemen nicht unterstützt. Auch das komplexe SMBus-"ARP"-Schema zur dynamischen Adressvergabe (außer bei PCI-Karten mit SMBus-Präsenz, für die es erforderlich ist).

Die automatische Buskonfiguration ist ein verwandtes Problem. Eine gegebene Adresse kann von mehreren verschiedenen protokollinkompatiblen Geräten in verschiedenen Systemen verwendet werden, und zur Laufzeit können kaum Gerätetypen erkannt werden. Beispielsweise 0x51kann durch einen oder 24LC02 24C32 verwendet werden , EEPROM , mit inkompatiblen Adressierung; oder von einem PCF8563 RTC , der von beiden nicht zuverlässig unterschieden werden kann (ohne den Gerätestatus zu ändern, was möglicherweise nicht zulässig ist). Die einzigen zuverlässigen Konfigurationsmechanismen, die Hosts zur Verfügung stehen, umfassen Out-of-Band-Mechanismen wie Tabellen, die von der System-Firmware bereitgestellt werden, die die verfügbaren Geräte auflisten. Auch dieses Problem kann teilweise durch ARP in SMBus-Systemen behoben werden, insbesondere wenn Hersteller- und Produktkennungen verwendet werden; aber das hat sich nicht wirklich durchgesetzt. Der Schiedsrichter. 03-Version der I 2 C-Spezifikation fügt einen Geräte-ID-Mechanismus hinzu.

I 2 C unterstützt einen begrenzten Geschwindigkeitsbereich. Hosts, die Multi-Megabit-Geschwindigkeiten unterstützen, sind selten. Die Unterstützung für die Fm+ 1 Mbit/s-Geschwindigkeit ist weiter verbreitet, da ihre Elektronik einfache Varianten dessen sind, was bei niedrigeren Geschwindigkeiten verwendet wird. Viele Geräte unterstützen die Geschwindigkeit von 400 kbit/s nicht (teilweise weil SMBus sie noch nicht unterstützt). I 2 C-Knoten, die in Software (statt dedizierter Hardware) implementiert sind, unterstützen möglicherweise nicht einmal die Geschwindigkeit von 100 kbit/s; Der gesamte in der Spezifikation definierte Bereich ist daher selten nutzbar. Alle Geräte müssen die höchste verwendete Geschwindigkeit zumindest teilweise unterstützen, sonst können sie ihre Geräteadresse fälschlicherweise erkennen.

Geräte dürfen die Taktzyklen entsprechend ihren jeweiligen Anforderungen dehnen, was die von schnelleren Geräten benötigte Bandbreite verhungern und die Latenzzeiten erhöhen kann, wenn sie mit anderen Geräteadressen kommunizieren. Die Buskapazität begrenzt auch die Übertragungsgeschwindigkeit, insbesondere wenn keine Stromquellen verwendet werden, um die Signalanstiegszeiten zu verkürzen.

Da I 2 C ein gemeinsam genutzter Bus ist, besteht die Möglichkeit, dass jedes Gerät einen Fehler hat und den gesamten Bus hängt. Hält beispielsweise ein Gerät die SDA- oder SCL-Leitung niedrig, verhindert es, dass der Master START- oder STOP-Befehle sendet, um den Bus zurückzusetzen. Daher ist es üblich, dass Designs ein Rücksetzsignal enthalten, das ein externes Verfahren zum Rücksetzen der Busgeräte bereitstellt. Viele Geräte verfügen jedoch nicht über einen dedizierten Reset-Pin, was den Designer zwingt, Schaltungen einzubauen, damit Geräte aus- und wieder eingeschaltet werden können, wenn sie zurückgesetzt werden müssen.

Aufgrund dieser Grenzen (Adressverwaltung, Buskonfiguration, Fehlermöglichkeiten, Geschwindigkeit) haben nur wenige I 2 C-Bussegmente auch nur ein Dutzend Geräte. Es ist üblich, dass Systeme mehrere solcher Segmente aufweisen. Einer könnte für die Verwendung mit Hochgeschwindigkeitsgeräten für die Energieverwaltung mit geringer Latenz bestimmt sein. Eine andere kann verwendet werden, um einige Geräte zu steuern, bei denen Latenz und Durchsatz keine wichtigen Probleme sind. ein weiteres Segment könnte nur verwendet werden, um EEPROM-Chips zu lesen, die Zusatzkarten beschreiben (wie der SPD- Standard, der bei DRAM-Sticks verwendet wird).

Derivative Technologien

I 2 C ist die Basis für den ACCESS.bus , die VESA Display Data Channel (DDC) Schnittstelle, den System Management Bus (SMBus), Power Management Bus (PMBus) und den Intelligent Platform Management Bus (IPMB, eines der Protokolle von IPMI ). Diese Varianten weisen Unterschiede im Spannungs- und Taktfrequenzbereich auf und können Unterbrechungsleitungen aufweisen .

Hochverfügbarkeitssysteme (AdvancedTCA, MicroTCA) verwenden 2-Wege-redundante I 2 C für das Shelf-Management. In diesen Systemen ist die Multimaster-I 2 C-Fähigkeit erforderlich.

TWI (Two-Wire Interface) oder TWSI (Two-Wire Serial Interface) ist im Wesentlichen der gleiche Bus, der auf verschiedenen System-on-Chip-Prozessoren von Atmel und anderen Anbietern implementiert ist . Verkäufer verwenden den Namen TWI, obwohl I 2 C seit dem 07.11.2014 keine eingetragene Marke ist. Markenschutz besteht nur für das jeweilige Logo (siehe rechts oben), Patente auf I 2 C sind inzwischen erloschen. Laut Microchip Technology weisen TWI und I2C einige Unterschiede auf. Einer davon ist, dass TWI das START-Byte nicht unterstützt.

In einigen Fällen weist die Verwendung des Begriffs "Zweidrahtschnittstelle" auf eine unvollständige Implementierung der I 2 C-Spezifikation hin. Die Nichtunterstützung von Arbitrierung oder Clock-Stretching ist eine häufige Einschränkung, die immer noch nützlich ist für einen einzelnen Master, der mit einfachen Slaves kommuniziert, die die Clock nie verlängern.

Der MIPI I3C Sensor Interface Standard (I3C) ist eine Weiterentwicklung von I 2 C und wird 2017 entwickelt.

Siehe auch

Verweise

Weiterlesen

Externe Links