I2C- Grundlagen

Anfang der 80er Jahre entwickelte die Firma Philips das I2C-Busprotokoll. Ausschlaggebend war der steigende Einsatz von Mikroprozessoren in Konsumergeräten. Gerade die Elektronikbranche ist darauf angewiesen, möglichst preiswert zu produzieren. Einsparungen waren somit dringend notwendig. Und genau hier setzt der I2C-Bus an. Bisher wurden teure CPU’s mit 8- oder 16-Bit breiten Datenbussen in z.B. Fernsehgerät eingesetzt, obwohl sich der Datenfluss fast auf die Interaktion des Konsumers beschränkt, der gelegentlich den Sender wechselt.
Aber warum soll nun der Einsatz eines neuen Bussystems Kosten einsparen ? Ganz einfach: Beschränkt man die Datenübertragung auf ein serielles Verfahren, fallen immens viele Leitungen weg. Die IC’s können nun auch kleiner produziert werden, da nicht mehr so viele Anschlüsse nach aussen geführt werden müssen. Auch der Platzbedarf auf der Platine verringert sich stark. Zudem müssen weniger Platinenbohrungen und Lötpunkte angebracht werden. Addiert man die ganzen Einsparungen, sollte der ernorme Platzgewinn und der geringere Fertigungsaufwand erkennbar sein.
I2C steht für “Inter Integrated Circuit”. Und genau dort wird er auch eingesetzt, als Bus zwischen Mikroprozessoren, IC’s und Ein-/Ausgabeeinheiten jeglicher Art, die in der Regel ihren Platz auf einer gemeinsamen Platine finden.
Die Daten werden mit Hilfe zweier Leitungen als serielle Information übertragen. Vorraussetzung ist nur noch ein gemeinsames Massepotential, was nur in seltenen Fällen zu einer dritten Leitung führt.

Konzept

Die gesamte Kommunikation wird über nur zwei Leitungen abgewickelt. SCL (Serial Clock) trägt das notwendige Taktsignal und SDA (Serial Data) die Information. Im I2C-Bus erfolgt die Datenübertragung bitseriell und synchron, d.h., dass jedes Datenbit auf der SDA-Leitung mit dem Takt der SCL-Leitung synchronisiert wird. Beide Leitungen sind bidirektional ausgeführt, was es jedem IC ermöglicht, Daten zu verschicken oder anzufordern. Um zu gewährleisten, dass die Information zum richtigen Empfänger gelangt, erhält jedes am Bus beteiligte IC eine eindeutige Adresse, mit der es identifiziert werden kann.
Das Konzept sieht eine Unterscheidung von Geräten (IC’s) in Master und Slave vor. Als Master wird ein Gerät bezeichnet, das einen Datentransfer initiiert und das notwendige Clocksignal generiert. Geräte, die vom Master adressiert, also zum Transfer aufgefordert werden, bezeichnet man als Slave. Desweiteren wird noch eine Unterscheidung in Transmitter und Receiver gemacht. Der Transmitter sendet Daten und der Receiver empfängt sie. Anhand zweier Beispiele soll dieses nun verdeutlicht werden:

Mikroprozessor (MP) A sendet Daten an MP B

Mikroprozessor (MP) A fordert Daten von MP B an

Prinzipiell ist jedes Gerät in der Lage, Master- bzw. Slave-Funktionen zu übernehmen, da die Zuordnung dynamisch erfolgt und keinen Regeln unterliegt.
Da beliebig viele IC’s am Bus einen Transfer initiieren dürfen, wird er auch als Multimaster-Bus bezeichnet. Es muss daher gewährleistet sein, dass nur ein Master zur Zeit aktiv ist. Um Problemen vorzubeugen, bietet das I2C-Protokoll mehrere Massnahmen zur Vermeidung von Kollisionen, auf die im weiteren Verlauf näher eingegangen werden soll.

Elektrische Eigenschaften

Hardware-Grundlagen

Wie bereits beschrieben, besteht der I2C-Bus aus zwei aktiven Leitungen SDA und SCL sowie der Masseleitung als Bezugspotential. Die Leitungen SDA und SCL sind über Pull-up-Widerstände mit der Betriebsspannung verbunden.
Im Ruhezustand befinden sich also beide Leitungen auf High-Pegel (positive Logik). Die unten stehende Abbildung zeigt schematisch die Eingangs- und Ausgangskreise von Master- und Slave-Bausteinen. Bezeichnet wird die Gesamtheit dieser Chips als Wired-AND-Schaltung. Im Ruhezustand sind die als Open-Collector ausgeführen Transistoren gesperrt und der Bus befindet sich auf High-Pegel.
Zur Ausgabe einer logischen 0 wird der Transistor leitend und zieht die entsprechende Leitung auf Masse. Im umgekehrten Fall bleibt die Basis des Transitors stromlos und die Leitung liegt, bedingt durch den Pull-up-Widerstand auf logisch 1. Die Eingangskreise erkennen die Pegeländerungen auf den Busleitungen und können sie dann entprechend auswerten.
Der High-Pegel ist definiert als NICHT-LOW-Pegel, d.h., es kann auch mit entsprechenden Bausteinen an einem System mit Spannung ungleich 5V (z.B. 3,3V) gearbeitet werden.

Datenübertragung

Um die Kompatibiltät zu den Mikroprozessorsystemen zu wahren, werden die Daten im 8-Bit-Format übertragen. Die Anzahl der zu übertragenden Bytes in einem Transfer ist dank der SCL-Leitung, die das Clocksignal zur Synchronisation trägt, unbegrenzt. Allerdings können einige Bausteine abhängig von ihrer Funktion nur eine bestimmte Anzahl Bytes senden und empfangen.
Das Byte wird mit dem höchstwertigen Bit MSB (Most Significant Bit) voran übermittelt. Wichtig ist, dass die Daten auf der SDA-Leitung stabil sein müssen, solange die SCL-Leitung High führt, ansonsten werden die Signale als Steuersignale interpretiert. Schreibende Geräte (Transmitter) müssen ihre Daten auf die Leitung legen, wenn SCL Low ist. So erreichen sie einen stabilen Zustand in der High-Phase. Nun können die lesenden Geräte die Daten bei SCL High aufnehmen.
Im Timingdiagramm kann man gut die Übertragung eines gültigen Datenbits erkennen. Nun wird auch schon deutlich, wie simpel und dennoch effizient das I2C-Protokoll arbeitet. Ist SCL High, wird die Datenleitung SDA abgefragt und das stabil anliegende Signal als Information interpretiert.

Steuersignale

Leider ist es mit der reinen Datenübertragung noch nicht getan, vielmehr muss der gesamte Ablauf noch koordiniert werden. Damit nicht jedes anliegende Gerät zu Senden oder Empfangen beginnt, wird eine Identifikation der IC’s in Form einer Adresse den Daten vorangestellt. Desweiteren wird z.B. der Beginn und das Ende einer Übertragung markiert. Diese wichtigen Signale, die das ganze Verhalten auf den Leitungen bestimmen, werden zusammengefasst als Steuersignale bezeichnet.
Doch wie unterscheidet man nun die Daten- von den Steuersignalen ?
Einige lassen sich einfach an der Reihenfolge erkennen. Sinnigerweise muss erst die Adresse mitgeteilt werden und dann können die Daten folgen. Doch es gibt noch eine andere Möglichkeit. Man verändert die Signale auf der Datenleitung. Um nun nicht mit den Regeln zu brechen, die unter anderem besagen, dass alles, was im High-Zustand von SCL als Pegel auf SDA liegt, ein Datenbit ist, hat man sich nun noch etwas Besonderes einfallen lassen. Bestimmte Steuersignale werden anhand ihrer Pegeländerung während der High-Phase der Clockleitung identifiziert. Von den Receivern wird nun nicht mehr der Pegel, sondern die Flanke gelesen.
Elementar sind die Start- und Stopbedingung, die eine zu übermittelnde Sequenz kennzeichnen.
Das Startsignal wird durch eine fallende Flanke auf SDA herbeigeführt. Wichtig ist, dass während des Flankenwechsels SCL High führen muss. Die Stopbedingung wird analog kodiert, nur dass sie eine steigende Flanke darstellt. Start- und Stopbedingung dürfen zu jedem Zeitpunkt eines laufenden Transfers erzeugt werden. Beide Signale werden vom Master erzeugt. Nach jedem Start wird der Bus als Busy (Belegt) angesehen. Nur der Master, der den Transfer initiiert hat, darf den Bus wieder auf Idle (Frei) setzen.
Eine Besonderheit ist die Möglichkeit einer Repeated Start Condition (erneute Startbedingung), hier wird der Transfer nicht durch ein Start beendet. Es wird vielmehr durch einen wiederholten Start ein neuer Transfers eingeleitet. Man verspricht sich so einen leicht erhöhten Datendurchsatz, da das Stopsignal unterdrückt wird.

Ist das Byte übermittelt, wird häufig ein optionales Handshaking vollzogen. Der Slave muss nun nach jedem empfangenen Byte ein Acknowledge an den Master senden. Antwortet der Slave auf dieses Bestätigungssignal mit einem High-Bit, gibt es zu erkennen, dass es an der Kommunikation nicht mehr teilnimmt, bzw. diese beendet.
Will nun ein Gerät einen Slave auslesen, z.B. einen Speicher, muss nun der Master nach jedem Byte das Acknowledge senden. Ist die Kapazität des Speichers überschritten, kann der Master nach Empfangen des High-Pegels eine entsprechende Fehlerroutine starten. Es ist jedoch zu beachten, dass kein Master weitersenden darf, wenn er ein High-Acknowledge-Bit, auch als NACK (Not Acknoledge) bezeichnet, empfangen hat. Ansonsten gehen sämtliche nachträglich gesendete Informationen verloren.
Auch wenn das Acknoledge-Bit ein Steuersignal ist, wird es praktisch wie ein Datenbit gehandhabt, der Master erzeugt hierfür noch ein zusätzlichen neunten Taktimpuls auf SCL. Der einzige Unterschied ist, dass sich das Verhalten von Transmitter und Receiver kurzfristig umdreht, schliesslich muss der Slave die folgende Übertragung mit einem Low quittieren, wenn die Übertragung fortgesetzt werden soll. Sendet der Slave dagegen ein High, gibt er das Ende der Kommunikation bekannt.

Interessant für langsamere Bausteine ist noch das Clock-Stretching (Taktverlängerung). Slaves können, bedingt durch die Pullupwiderstände an den Datenleitungen, die Lowphase des Clocksignals künstlich verlängern. Damit geben sie dem Master zu verstehen, dass sie die Taktfrequenz nicht verarbeiten können und ermöglichen sich selbst so das korrekte Lesen des aktuellen Datenbits.
Notwendig ist hierbei die Überwachung der Taktleitung durch den Master, da dieser sonst nicht auf das Clock-Stretching reagieren kann.

Clock-Synchronisation und Arbitrierung

In Multimastersystemen wird unter bestimmten Bedingungen vorausgesetzt, dass das Taktsignal der Master sich völlig synchron verhält. Dies ist nur dann möglich, wenn die Master eine gewisse Eigenintelligenz mitbringen, die man in der Regel nur in Mirkroprozessoren findet. Synchronisiert man zwei Master, stimmen danach Frequenz und Tastverhältnis überein. Ein Kompromiss aus beiden Clocksignalen ist durchaus vorstellbar, wenn beide Systeme zur gleichen Zeit eine Synchronisation durchführen.

Durch die Realisierung der Busleitung als Wired-AND besteht die Möglichkeit, das anliegende Taktsignal zu lesen. Ein Master, der auf der SCL-Leitung einen Low-Pegel ausgibt, wird diesen irgendwann zurücknehmen und High ausgeben. Nun schaut der Master auf die Clockleitung. Liegt nun immer noch eine logische “0” an, bedeutet dies, dass ein weiterer Master eine längere Low-Phase erzeugt. Anhand der Beobachtung von SCL kann der erste Master sein Taktsignal solange verlängern, bis es mit dem langsameren übereinstimmt.
Analog dazu kann auch der Beginn des Clocksignals verschoben werden. Legt ein Master die SCL-Leitung auf logisch “1” und ein anderer, viel langsamerer, hält sie nach wie vor auf “0”, behält der weniger schnelle Master die Dominanz. Wird SCL auch schon in dieser Zeit überprüft, kann sich der schnellere Master auf die längere Low-Phase einstellen.
Allgemein setzt sich die langsamste Low-Periode und damit das langsamste Gerät durch.
Die Zuteilung des Busses an die verschiedenen Master wird als Arbitrierung bezeichnet. Implementiert ist ein Verfahren mit dem Namen CSMA/CD (Carrier Sense, Multiple Access with Collision Avoidance). Sobald ein Master eine Transaktion auf dem Bus durchführen will, muss kontrolliert werden, ob er überhaupt frei ist oder eine Übertragung noch nicht abgeschlossen. Das Verfahren ist relativ leicht umzusetzen, da lediglich die beiden Leitungen SDA und SCL für eine definierte Zeit, die etwas unter der halben Periode des Taktsignals liegt, beobachtet werden. Trägt nur eine Leitung ein Low-Signal, ist dies ein sicheres Zeichen für eine bestehende Transaktion, der Bus wird nun als belegt angesehen.
Erkennt der Master den Bus als frei, kann er seine Übertragung beginnen. Gelegentlich kann es dennoch zu einer gleichzeitigen Transaktion kommen, z.B. dann, wenn zwei oder mehr Master im gleichen Moment den Bus abfragen und ihn als frei interpretieren. Interessanterweise kommt es in solchen Situationen erst zu einer im oberen Teil beschriebenen Synchronisation des Taktes.
Doch damit nun nicht beide Master gleichzeitig senden, setzt die sogenannte Kollisionsvermeidung (Collision Avoidance) ein. Sobald einer der Master eine logische “1” sendet, also die Leitung auf High setzt, aber eine “0” empfängt, erkennt er, dass zur Zeit ein anderes Gerät den Bus bedient, und bricht die Transaktion ab. Die “0” kann nur dann empfangen werden, wenn zur gleichen Zeit ein anderes IC die Datenleitung für sich beansprucht und den entsprechenden Pull-up-Widerstand auf Masse legt.
Nachteilig an diesem Verfahren ist, dass keine Prioritäten verteilt werden können. Es ist somit dem Zufall bzw. der Übertragung überlassen, welcher Master die endgültige Kontrolle über den Bus erlangen kann. Als Kollisionsvermeidung wird das Verfahren benannt, da der Master, der sich durchsetzt, von seinen Konkurennten nichts mitbekommt.

Adressierung

Will nun ein Master mit einem bestimmten Gerät über den Bus kommunizieren, muss als erstes eine Adresse übermittelt werden, die das IC eindeutig identifiziert. Die logische Konsequenz der Adresse ist, dass sie einmalig und dem Master bekannt sein muss.
Im Normalfall ist der Master das steuernde Gerät auf dem Bus, er allein kann einen Transfer initiieren. Herrschen mehrere Master über den Bus, ist eine Adressierung der einzelnen Master unabdingbar. Ansonsten ist eine vollständige Kommunikation zwischen den Mastern nicht möglich.
Die ursprüngliche Grösse der Adresse beträgt 7 Bit, damit liessen sich im Höchstfall 128 IC’s im Bus einsetzen. Da allerdings noch einige Adressen reserviert sind und nicht jedes Gerät jede beliebige Adresse annehmen kann, wurde eine Erweiterung auf eine Länge von 10 Bit spezifiziert. Nun bleibt es dem Anwender überlassen, für welches Format er sich entscheidet, nur gibt der Markt zur Zeit kaum bis keine IC’s mit 10 Bit langen Adressen her.

Nach der gesendeten Startbedingung wird unmittelbar die Adresse übertragen. Im 7-Bit-Format, auf welches hier näher eingegangen werden soll, wird die Adresse in dem nächsten Byte angegeben. Da hier ein Bit übrig bleibt, das LSB, wird hier noch zusätzlich die Richtung des Transfers (R/W) verschlüsselt (Abb. 7). Eine logische “0” bedeutet “Schreiben”, eine “1” steht für den Lesebetrieb. Hier entscheidet sich die Funktion von Master und Slave, ob das Gerät nun als Receiver (Lesen) oder Transmitter (Schreiben) arbeitet.
Ist nun die Adresse übertragen worden, wartet der Master auf eine Bestätigung. Hat ein Slave die 8 Bit empfangen, vergleicht er sie mit seiner eigenen Adresse. Bei Misserfolg verhalten sie sich ruhig und warten auf die nächste Startbedingung. Stimmt die Adresse überein, meldet sich der Baustein mit einem Acknowledge und gibt zu erkennen, dass er bereit für die folgende Übertragung ist.
Die Art der Adresskodierung der Bausteine ist recht vielfältig. Es gibt zum einen reine Softwarelösungen, die aber nur in Mikroprozessoren realisierbar sind. In der Regel stehen externe Pins zur Verfügung, die über Jumper gesetzt werden können. Um die Bausteine pysikalisch klein und billig zu halten, werden häufig nur die niedrigsten drei Bits der Adresse nach aussen zur Konfiguration geführt. Die restlichen vier Bits sind dann fest im Gehäuse verdrahtet und somit nicht zugänglich, was den verfügbaren Adressraum noch kleiner werden lässt.
Auf die reservierten Adressen soll nur kurz eingegangen werden, da sie nur in seltenen Fällen von Belang sind.
Es wurde in den vorherigen Abschnitten behauptet, dass eine Übertragung immer nur zwischen zwei IC’s möglich ist. Aber es gibt eine Ausnahme. Mit der General Call Adress, Adresse “0” und Richtungsbit auf “Schreiben” (R/W = 0), lässt sich eine Art Rundruf gestalten. Ein Master kann so einer ganzen Gruppe von Slaves Daten übermitteln.
Es wurde auch an die Kompatibiltät zu anderen synchronen Bussystemen gedacht. Um diese nutzen zu können, gibt es z.B. die Adressen 0000 001 und 0000 010, sie würden dann die differenten Systeme aktivieren.
Eine wichtige Adresse ist die 10-Bit-Slave-Adresse, die wie der Name schon sagt, eine 10 Bit lange Adresse einleitet. Hier sind nur die höherwertigen fünf Bits reserviert, die restlichen enthalten schon die ersten zwei Bits der eigentlichen Adresse und natürlich das Richtungsbit.

Transferarten

Prinzipiell gibt es drei verschiedene Arten des Transfers. Sie geben die Richtung der zu übertragenden Daten an. Um einen kleinen Überblick zu gewähren, sind die Betriebsarten noch einmal aufgezeichnet.