Theorie
 
 
 
 
 
Schnittstellen
 
 
 
 
 
seriell, synchron
 
 
I2C -Bus
 
 

 
 
 
 

 

Grundsätzliche Funktion des I2C-Busses
I2C-Bus bedeutet Inter-IC- bus (Bus zwischen integrierten Schaltkreisen) und meint eine serielle Daten-Übertragungverbindung zwischen zwei, von mehreren am Bus angeschlossenen Bausteinen. Er zählt zu den synchronen seriellen Schnittstellen. Der Bus besteht aus zwei Signalleitungen, mit den Bezeichnungen Takt und Data. Diese Leitungen liegen über Pull-Up-Widerstände an HIGH und die angeschlossenen Bausteine können sie auf 0 herunterziehen.
So etwas nennt man 'wired AND' (verdrahtete UND-Verknüpfung).
Die maximale Übertragungsfrequenz betrug zunächst 100kHz, inzwischen gibt es Bausteine die mit 400kHz arbeiten. Dies entspricht einer Zykluszeit des Taktes von 10µs bzw. 2,5µs pro Bit. Die Übertragung eines Bytes, zu dem neun Taktzyklen benötigt werden, dauert also etwa 90µs bzw. 22,5µs. Das neunte Bit ist das Bestätigungsbit (Acknowledge) der Übertragung.

 

 

 

 

 

Master und Slave
Die Bausteine an dem I2C-Bus unterteilen sich in Master- und Slave Bausteine. Es darf zu einer Zeit jeweils nur ein Master aktiv sein, der alle Slave Bausteine erreicht. Der Master bestimmt das Taktsignal (clock) auf dem I2C-Bus, er kann auf der Datenleitung (data) von den Sklaven Daten empfangen (receive) oder solche zu ihnen senden (transmit). Der jeweils empfangende Baustein sendet nach jedem übertragenen Byte eine Empfangsbestätigung, das Acknowledgebit.

 

 

 

 

 

Master sendet Daten .. (transmit)
Hierzu belegt der Master den Bus zunächst durch eine START-Bedingung. Dann sendet er ein Byte, welches den anzusprechenden Sklaven-Baustein bei Ausnutzung von 7 Bits des ersten Bytes adressiert, und ihm in dessen unterstem Bit mitteilt dass er Daten empfangen soll. Da sich die Begriffe lesen (read) und schreiben (write) immer auf den Master beziehen, will der Masten also Daten zum Sklaven schreiben. Er setzt in dem untersten Bit also das Write-Signal, was einer log 0 entspricht.
Ist der adressierte Sklave vorhanden, empfängt er dieses Byte vom Master und bestätigt, im nächsten, dem neunten Taktzyklus, den Erhalt durch ein Acknowledgebit. Von nun an wartet der Sklave auf eingehende Datenbytes, die er beim Empfang immer im neunten Taktzyklus durch ein Acknowledgebit bestätigt. Es können so beliebig viele Datenbytes zum Sklaven gesendet werden.
Ist der Master mit seiner Datenübertragung fertig, so muss er eine STOP-Bedingung zum Bus ausgeben. Diese gibt den I2C-Bus wieder frei und der Sklave schaltet sich ebenfalls vom Bus.

 

 

 

 

 

Master empfängt Daten .. (receive)

Hierzu belegt der Master den Bus zunächst durch eine START-Bedingung. Dann sendet er ein Byte, welches den anzusprechenden Sklaven-Baustein bei Ausnutzung von 7 Bits des ersten Bytes adressiert, und ihm in dessen unterstem Bit mitteilt dass er Daten senden soll. Da sich die Begriffe lesen (read) und schreiben (write) immer auf den Master beziehen, will der Masten also Daten vom Sklaven lesen. Er setzt in dem untersten Bit also das Read-Signal, was einer log 1 entspricht.
Ist der adressierte Sklave vorhanden, empfängt er dieses Byte vom Master und bestätigt, im nächsten, dem neunten Taktzyklus, den Erhalt durch ein Acknowledgebit.
Bis hierher entspricht das Verfahren dem vorhergehend beschriebenen transmit-Verfahren.

Da die Datenbytes nun vom Sklaven zum Master strömen, muss der Master in der Folge die Datenempfangsbestätigung im neunten Bit generieren. Dies tut er bis zum vorletzten empfangenen Byte. Nach dem letzten empfangenen Byte sendet der Master anstelle des Acknowledge-Signals eine STOP-Bedingung.

 

 

 

 

 

Signale auf den Leitungen Data und Clock

 

 


Übertragung von Daten
Zu einer bestimmten Zeit kann nur ein Baustein die Abläufe auf dem I2C-Bus bestimmen. Dieser Baustein wird als Maser bezeichnet. Er gibt den Takt vor, mit dem der Sklave, Daten von der Datenleitung holen oder zur Datenleitung senden muss. Dabei gilt: Die Daten auf der Leitung Data sind dann gültig, wenn das Taktsignal HIGH ist. Geändert werden die Daten, wenn das Taktsignal LOW ist. Die Übertragung eines Datenwortes besteht grundsätzlich aus 8 Bit (einem Byte), allerdings kommt ein Quittungsbit hinzu, so dass 9Bit übertragen werden. Das Quittungsbit wird grundsätzlich von dem Baustein gesendet, welcher das Datenbyte empfangen hat. Zudem gelten eine Start- und eine Stoppbedingung.

Start- und Stoppbedingung
Ist der Bus frei, befindet er sich also im Ruhezustand, liegen beide Leitungen, Data und Takt, auf HIGH. Das ergibt sich aufgrund der verwendeten Pull-Up-Widerstände.
Die Bus-Busy-Flaggen der angeschlossenen Bausteine sind auf 0 gesetzt. Sie werden automatisch durch die Start- und die Stoppbedingung verändert. Als Startbedingung gilt eine fallende Flanke, als Stoppbedingung eine steigende Flanke auf Data, wobei sich dieser Wechsel des Datensignals bei dem Taktzustand HIGH abspielt. Diese Zustandskombination kommt bei der Übertragung von Daten nicht vor. Hier ändern sich die Daten nur bei Takt = LOW.

Ablauf einer Übertragung von Daten


 

 

 

F:

 

Der Bus ist frei, Data = HIGH und Takt=HIGH

 

 

S:

 

Die Übertragung beginnt mit der Startbedingung .. fallende Flanke an Data .. der Takt bleibt HIGH. Diese Zustandsfolge setzt bei allen angeschlossenen Bausteinen die BusBusy-Flagge auf 1.

 

 

 

C1:

Der Takt wird LOW. Nun kann das erste Datenbyte auf den Bus gelegt werden. Der Master bestimmt von nun an das Taktsignal.

 

 

 

D1:

Solange das Taktsignal auf HIGH liegt, müssen die Daten auf der Leitung Data stabil bleiben. Master oder Sklave können die Daten nun lesen.

 

 

 

 

Ausbremsen des Masters durch den Sklaven

Durch den wired AND-Aufbau des Busses kann der Sklave seinerseits erzwingen, dass die Daten länger auf dem Bus bleiben, als es der Master mit seinem Taktsignal vorsah. Zieht der Sklave während seines Lesevorgangs das Taktsignal auf LOW, erkennt der Master, dass nicht er es war, der die Taktleitung auf LOW zog und wartet mit der Ausgabe weiterer Daten, bis die Taktleitung wieder auf HIGH ansteigt, Nun setzt er seinerseits die Taktleitung auf LOW und gibt das nächste Datenbit aus. Dieser Mechanismus erlaubt es langsamen Sklaven, in Ruhe die Daten eines schnelleren Masters zu übernehmen.

 

 

 

C2:

Der Takt wird erneut LOW. Es kann ein neues Datum auf die Leitung Data gelegt werden. Dieser Vorgang setzt sich fort, bis 8 Bits des Datenwortes übertragen wurden. Nun folgt je nach Datenflussrichtung das Quittungsbit (Acknowledge) des Sklaven .. oder des Masters.

 

 

 

 

 

 

 

 

 

 

Quittung des Sklaven:
                   bei Datenflussrichtung Master -> Sklave (Write)
Nach den 8 Datenbits vom Masters ändert dieser mit dem 9.Takt=LOW den Zustand der Leitung Data auf HIGH. Hat der Sklave alle Daten verstanden, muss er nun seinerseits die Datenleitung bedienen und diese auf LOW ziehen.Während des 9.Taktes =HIGH stammt also die Setzung der Data-Leitung nicht vom Master, sondern vom Sklaven. Der Sklave quittiert mit diesem Acknowledge-Signal (Data=LOW), dass er alles verstanden hat und mit Data = HIGH, dass ein Fehler aufgetreten ist. --> weiter mit D2

 

 

 

 

 

 

 

 

 

 

Quittung des Masters:
                  bei Datenflussrichtung Sklave -> Master (Read)
Nach den 8 Datenbits vom Sklaven ändert der Master mit dem 9.Takt=LOW die Leitung Data auf LOW ..
.. a) und belässt sie dort während der Zeit 9.Takt=HIGH. Damit quittiert der Master, dass die Daten vom Sklaven bei ihm angekommen sind .. und dass er weitere Daten vom Sklaven erhalten will. -> weiter mit D2
.. b) generiert aber folgend eine STOP-Bedingung. Dieser Zustand sagt dem Sklaven, dass er keine weiteren Daten mehr zum Master senden soll. --> weiter mit P

 

 

 

 

 

 

 

 

 

D2 ....

Es können nun in der oben beschriebenen Weise beliebig viele Datenworte aus je 8 Bits plus Quittung folgen ...

 

 

P:

 

Die Übertragung wird mit einer Stoppbedingung abgeschlossen. Nach der Übertragung des letzten Bits (der Quittung) lässt der Master die Taktleitung noch einmal auf LOW fallen und setzt zudem die Leitung Data auf LOW.
Nun folgt der letzte Wechsel der Taktleitung auf HIGH. Während die Taktleitung bereits im Ruhezustand ist, wechselt der Master letztmalig den Zustand der Leitung Data von LOW auf HIGH. Aus dieser positiven Flanke an Data, die auftritt während der Takt bereits HIGH ist, erkennen alle angeschlossenen Bausteine, dass der Bus wieder frei ist. Ihre Flaggen BusBusy werden automatisch auf 0 gesetzt.

 

 

 

 

 

Zusammenfassung
Der I2C-Bus überträgt 8 Datenbits (1 Byte) vom Master zum Sklaven, in der Reihenfolge MSB first (most signifikant Bit first) was bedeutet, dass das höchste Bit als erstes übertragen wird. Dann folgt ein Quittungsbit, das vom Sklaven zum Master gesendet wird. Die hierzu notwendigen 9 Taktschläge erzeugt der Master, während der Sklave die Taktschläge nur verlängern kann. Der Master beginnt die Übertragung mit einer Startbedingung und beendet sie mit einer Stoppbedingung. Hierdurch wird allen angeschlossenen Busteilnehmern mitgeteilt, wann der Bus frei oder belegt ist.

Adressierung
Wie bereits gesagt können an dem I2C-Bus bis zu 127 Teilnehmer angeschlossen sein. Von denen jeder Master oder Sklave sein kann. Zu einer bestimmten Zeit, darf jedoch nur einer der Master sein, und dieser wird sich normalerweise mit genau einem Sklaven unterhalten wollen. Die Adressierung ist die Methode, mit welcher der Master seinen gewünschten Sklaven auswählt. Die Adresse wird im ersten Datenbyte auf den Bus ausgegeben. Dabei enthalten die Bits 7..1 die Adresse, und Bit 0 die Ansage, ob der Master Daten lesen oder schreiben will. (Bit0 = 0, Master will schreiben / Bit0 = 1, Master will lesen)

Nachdem die Adresse ausgegeben wurde, folgen die Informationsdaten, in der gewünschten Flussrichtung. Unter dem Takt des Masters werden seine Daten zum Sklaven übertragen (Write) oder die Daten des Sklaven zum Master (Read).

Die Zuteilung von Adressen an die Bausteine, erfolgt bei Mikrocontrollern durch geeignete Programmierung. Bei nicht programmierbaren IC-Bausteinen durch den IC-Hersteller. Dieser hat in der Regel durch eine interne Beschaltung einige fest vorgegebene Adressen verfügbar gemacht, die durch den Anwender, über die Beschaltung von Pins des Bausteins, vervollständigt werden kann.

Adresse 00h - General Call
Besteht die Adresse aus 8 Nullbits, werden alle angeschlossenen Teilnehmer adressiert und dazu aufgefordert, die Daten des Masters zu lesen. (Sie werden zu Slave-Empfängern) Auf diese Weise können z.B. alle am Bus angeschlossenen Teilnehmer mit nur einer Übertragung initialisiert werden.
 

 

 

 

 

 

Multimasterbetrieb durch Arbitration


Der bereits erwähnte wired-AND-Aufbau des I2C- Busses ist Voraussetzung für den sogenannten Multimasterbetrieb. Hierunter ist zu verstehen, dass mehrere Master auf dem seriellen Bus arbeiten können, ohne dass die zu übertragende Information verfälscht wird. Um dies sicherzustellen, findet vor dem Informationstransfer ein Auswahlprozess (Arbitration) statt, bei dem ein bestimmter Master die Buszuteilung erhält, während alle anderen abgeschaltet werden und warten müssen, bis der Bus wieder frei ist.
Erst dann können diese Master mit einem erneuten Übertragungsversuch beginnen.
Sobald also eine Startbedingung auf dem Bus erscheint, ist dieser belegt. Die Flagge BusBusy wird gesetzt, und keine andere Einheit kann auf den Bus zugreifen. Versuchen jedoch zwei Master gleichzeitig, Informationen auf den Bus zu geben, so läuft der Auswahlprozess wie folgt ab:



Sind die Informationen der beiden Master zunächst gleich, so kann noch kein Entscheidungsprozess stattfinden. Wird jedoch gleichzeitig versucht, von einem Master eine 1, von einem zweiten eine 0 auf den Bus zu geben, so stellt sich auf diesem, wegen der Wired-AND-Verdrahtung, LOW-Pegel ein, d. h., die 0 wird empfangen. Beide Master vergleichen nun den Pegel auf der Datenleitung mit ihrem internen Ausgangspegel, während der zugehörige Taktimpuls HIGH ist.
Der Master, der hierbei einen Unterschied zu der von ihm gesendeten Information feststellt, schaltet seine Ausgangsstufe sofort ab, der Master mit dem Ausgangspegel LOW sendet dagegen weiter, so dass seine Daten auf der Datenleitung erscheinen. Der Master mit dem Ausgangspegel LOW hat somit die Buszuteilung gewonnen, während der Master, der sie verloren hat, seinen Ausgangspegel konstant auf HIGH setzt.

Im allgemeinen findet dieser Vorgang schon während des Adressentransfers statt. Der verlierende Master schaltet dann sofort auf die Betriebsart Slave-Empfänger um, da er selbst von dem gewinnenden Master adressiert werden könnte. Adressieren beide Master gleichzeitig zufällig denselben Baustein, so erfolgt die Bus-Arbitration erst beim Transfer des ersten unterschiedlichen Datenbits.
Bei gleichzeitigem Sendebeginn hängt somit die Priorität der Master nur von den gesendeten Informationen ab. Der Sender, der dem Bus das Byte mit dem niedrigsten Stellenwert anbietet, gewinnt die Buszuteilung. Während des Transfers von Quittungsbits erfolgt kein Auswahlprozess, um eine falsche Auswertung dieser Bits zu vermeiden. Hat ein Master die Buszuteilung erhalten, so behält er sie solange, bis er den Informationsfluss mit der Stoppbedingung beendet hat. Währenddessen hat kein anderer Sender Zugriff zum Bus. Alle Master sind so strukturiert, dass sie bei Verlust der Buszuteilung vom gewinnenden Master adressiert werden können.

Taktsynchronisation
Alle Master-Sender, die mit der Ausgabe einer Information auf den Bus beginnen, erzeugen ihren eigenen Takt. Wenn somit Taktimpulse von mehr als einem Master auf die Taktleitung gelangen, muss der Takt synchronisiert werden. Dies wird folgendermaßen erreicht:



Da auch die Taktleitung Wired-AND-Eigenschaften hat, wird ein Übergang vom HIGH- zum LOW-Pegel von allen Bausteinen an dieser Leitung erkannt. Von diesem Übergang an beginnt jeder Taktgenerator mit der Zählung für seine LOW-Phase. Die Wired-AND- Eigenschaften der Taktleitung führen auch dazu, dass die LOW-Zeit auf ihr durch den Baustein mit der längsten LOW-Phase, d. h. vom langsamsten Master, bestimmt wird. Ein Baustein mit kürzerer LOW-Phase ist nach deren Ende nicht in der Lage, HIGH-Pegel auf der Taktleitung herbeizuführen, erkennt aber den Unterschied zwischen dem internen Pegel seiner Taktausgangstufe und dem tatsächlichen Pegel auf der Taktleitung. Dadurch wird der Taktgenerator dieses Bausteins in einen Wartezustand übergeführt, wobei seine Zählschaltung auf den Anfang einer HIGH-Phase eingestellt bleibt.

Sobald alle Bausteine ihre LOW-Phase durchlaufen haben, wird die Taktleitung freigegeben. Die wartenden Bausteine können nun keinen Unterschied mehr zwischen dem Pegel ihrer Ausgangsstufe und dem Pegel der Taktleitung erkennen und beginnen daher mit der Abwärtszählung ihrer HIGH-Phase. Auf diese Weise wird ein synchronisierter Takt erzeugt, dessen LOW-Phase durch den Baustein mit der längsten LOW-Phase und dessen HIGH-Phase durch den Baustein mit der kürzesten HIGH-Phase bestimmt wird.

Wenn daher ein bestimmter Baustein die Taktleitung für längere Zeit auf LOW-Pegel hält, befinden sich alle übrigen im Wartezustand. Hierdurch kann z. B. ein schneller Master durch einen Slave so verlangsamt werden, so dass dieser genug Zeit hat, um ein empfangenes Byte zu speichern oder ein Byte zum Transfer vorzubereiten.

 

 

 

 

www..de