Der I2C-Bus - Was ist das?

01.11.2007     08.04.2008     mborchers (Einsteiger)     i2c bus einfuehrung

Einführung

Viele haben sicher schon mal von diesem Bus gehört, wissen aber gar nicht was das eigentlich ist. Diese Frage stellte sich auch mir, also warf ich mal einen Blick ins Internet. Die Informationen überrollten mich förmlich.

Zum Glück sah ich dann mal einen Bericht im Computer-Club über den Lallus. In diesem Projekt (von Wolfgang Back) wurde der I2C-Bus verwandt, da die C-Control nur wenig I/O-Ports frei hatte.
Als Zentraler Baustein wurde dort der PCF 8574 verwendet. Also wagte ich einen Blick zu Philips auf die Homepage und lud mir das Datenblatt herunter.

Tja, das war dann auch schon der Anfang und ich legte los.

Nun aber zum eigentlichen Thema: Was ist der I2C-Bus?

In vielen modernen elektronischen Systemen wird häufig eine Kommunikation der einzelnen Bausteine untereinander benötigt. Man will aber auch nicht zig Leitungen durch das ganze System legen, also war ein Ziel, so wenig wie möglich Leitungen zu verbrauchen.

I2C-Bus heisst ausgeschrieben Inter IC-Bus, zu Deutsch: Ein Bus, der die Kommunikation zwischen verschiedenen Integrierten Schaltungen ermöglicht bzw. bereitstellen soll.

Philips ist die Mutter dieses Buses, der sich zum quasi-Standard entwickelt hat. Manchmal wird er auch 2-Draht-Bus genannt, was auch nicht abwegig ist, da der Bus tatsächlich nur mit 2 bidirektionalen Leitungen auskommt (Masse und Versorgungsspannung nicht mitgerechnet).

Beispiel eines Busses

Die erste Leitung wird mit SDA (= serial data) bezeichnet. Über diese Leitungen werden die eigentlichen Daten seriell übertragen.

Die zweite Leitung wird mit SCL (= serial clock) bezeichnet. Hier werden die Takt-Impulse gesendet.

Die Ursprünglichen Spezifikationen sahen eine maximale Bus-Geschwindigkeit von 100kHz vor. Für heutige Anwendungen ist dies aber manchmal nicht mehr ausreichend, also wurden die Spezifikationen überarbeitet. Dazu aber später mehr.

Jeder I2C-Basutein lässt sich über ein 7-bit breites Adress-"Byte" selektieren (auch dies wurde überarbeitet, siehe 10-bit-Adressen). Das 8. Bit des Adressbytes gibt an, ob auf den Baustein lesend oder schreibend zugegriffen werden möchte. Die folgenden Bytes sind dann vom jeweiligen Baustein abhängig.

Eine Kommunikation findet immer zwischen einem sog. Master und einem sog. Slave statt. Es gibt auch Multi-Master-Modi, auf diese gehe ich aber in diesem Artikel nicht weiter ein.
Der Master sendet nun eine sog. Start-Condition. Dadurch werden nun alle Slaves am Bus hellhörig und vergleichen ihre Adresse mit der Adresse, die der Master anfordert.
Nun können diese beiden Bausteine Daten austauschen. Ist dies erledigt, sendet der Master eine Stop-Condition. Dadurch wird der Bus wieder freigegeben und das Spiel kann von vorne beginnen.

So sieht ein lesender Zugriff auf einen PCF 8574 aus:

  Adresse Geräte-Sub-Adresse R/W   Daten  
Start 0 1 0 0 x x x 1 ACK x x x x x x x x Stop

Die ersten vier Bit sind vom jeweiligen Baustein abhängig und können nicht geändert werden. Die drei darauf folgenden Bit sind vom Baustein selbst abhängig, d.h. man kann diese Adresse nach belieben ändern (Pins am Baustein sind hierfür herausgeführt). Dadurch lassen sich insgesamt 8 gleiche Bausteine an einem Bus betrieben.
Das achte Adressbit gibt nun noch an, ob gelesen oder geschrieben werden will.
Nun muss der Slave ein Acknowledge an den Master senden, um zu bestätigen, dass er anwesend und bereit ist. Der Master kann nun die eigentlichen Daten auslesen. Möchte der Master weitere Daten lesen, muss er eine Acknowledge an den Slave senden. Benötigt er keine weiteren Daten, so bleibt dies aus und die Stop-Condition wird gesendet.

Näheres dazu (Timing, etc.) steht in jedem Datenblatt, egal zu welchem I2C-Basutein, drin.

Ein wichtiges Merkmal sei noch erwähnt: Es ist egal (nach oben hin, sprich langsamer) in welchem Zeitabstand diese Übertragungen statt finden. D.h. ein Mikrocontroller muss keine genauen Timings einhalten, um mit seinem Slave zu sprechen!

Das wars an grundlegendem Kram, ich hoffe, es ist nun klarer geworden, was der I2C-Bus ist und wozu er gut ist.

Fast-Mode

Mittlerweile ist der I2C-Bus zu einem quasi-Standard geworden und immer mehr Bausteine wurden entwickelt. Ursprünglich war er nur zum austausch von Status-Informationen gedacht, aber heute werden Text und Daten übertragen. Dazu reichten bald die 100kbit/s nicht mehr aus. Tim Taylor würde sagen: "Der Bus braucht mehr Power, HOR HOR HOR!".
Und so wars auch. Philips erweiterte seine Spezifikationen und nun durften 400kbit/s übertragen werden. Alle heutigen Bausteine sollten dies unterstützen.

High-Speed-Mode

Der High-Speed-Mode wurde für spezielle RAM Bausteine eingeführt, die noch höhere Übertragungsraten erforderten. Geräte des Fast oder Normal-Mode kann man NICHT an die selben Leitungen hängen (wenn denn der High-Speed-Mode verwendet werden soll). Für diesen Fall sind an einem Master mit High-Speed-Mode-Unterstüzung zwei zusätzliche Pins für die normalen Geschwindigkeiten herausgeführt. Der Master übernimmt dann die Konvertierung.

Für weitere Informationen kann ich leider nur auf die Spezifikationen verweisen...

10-bit-Adressen

Mit der Zeit wurden es immer mehr Geräte und es gab schon vorher Überschneidungen von Adressen. Glücklicherweise hat Philips die Slave-Adressen 11111xxx als "reserved" markiert, also konnte man jetzt eine Erweiterung der Adressierung einführen, ohne dabei die 7-bit-Geräte zu stören. Im Gegenteil, man kann 7-bit Geräte und 10-bit Geräte an einen Bus hängen!

Bei einer 10-bit-Adresse sieht die Übertragung folgendermaßen aus:

  reservierte Adresse Adresse R/W   Adresse, 2.Teil Geräte-Sub-Adresse  
Start 1 1 1 1 0 x x 1 ACK x x x x x x x x ACK

Die ersten 5 Bit sind die reservierte Adresse "11110" (die Adresse "11111" behält sich Philips weiterhin vor, für weitere Erweiterungen). Dann kommen die letzten 2 Bit (also das MSB) der 10-Bit-Adresse und das Read/Write-Bit. Nun senden mehrere Slaves ihr Acknowledge. Nun überträgt der Master die letzten 8 Bit der Adresse (also LSB). Jetzt meldet sich nur noch ein Slave mit einem Acknowledge und die restliche Übertragung kann wie bei der 7-Bit-Adressierung vorgenommen werden.


Kommentare

Kommentar von Frank Schiefer am 02.11.2007 um 22:58 geschrieben:

Warum kann man solche Begriffe nicht immer so einfach und verständlich erklären?
Endlich mal eine Erklärung, die man beim ersten Durchlesen kapiert.

Danke

Kommentar von marvin herr am 22.11.2007 um 14:19 geschrieben:

hey...super!
vielleicht schaff ich ja doch meine abschlussprüfung...
weil ich habe eigentlich nur mit diesem thema meine probleme GEHABT!!!
danke!!!!

Kommentar von ohne Name am 08.01.2008 um 07:04 geschrieben:

Danke für die Erklärung!

Kommentar von ohne Name am 23.01.2008 um 23:29 geschrieben:

Danke für die tolle, einfache Erklärung. Wenn der Prof. nur auch immer so verständlich wäre. Da kann die Prüfung kommen

Kommentar von Becker Heinz am 13.03.2008 um 14:05 geschrieben:

awwer hunnert-prozentig!

Kommentar von fragender am 18.03.2008 um 15:23 geschrieben:

hallo!
wer kann mir denn bitte sagen, was beim i2c-bus inter komponenten gemeint ist?
hab nämlich keine ahnung was ich zu diesem punkt schreiben soll, ist meine abschlussarbeit.
bitte helft mir!!
lg

Kommentar von ohne Name am 18.03.2008 um 15:31 geschrieben:

nicht inter sondern unter wollte ich im artikel oben schreiben...sry

Kommentar von ohne Name am 20.03.2008 um 11:35 geschrieben:

Komponenten? Ich weiss jetzt nicht ob du das auf einen I2C-Busteilnehmer als ganzes beziehst, oder ob du mit diesen "Komponenten" eher den schematischen Aufbau innerhalb eines Teilnehmers ansprechen willst.
Falls sich deine Frage auf ersteres bezieht, na, da gibt es eine beachtliche Anzahl an Komponenten die man mit diesem Bus vernetzen kann. Eine kleine Auswahl siehst du ja schon in der ersten Grafik zu diesem Artikel wie zum Beispiel Mikrocontroller [mit integrierter "I2C-UART" oder ansonsten einfach softwaremässig auf zwei I/O-Pins "simuliert"], diverse Speichermodule [hauptsächlich EEPROM], I/O-Erweiterungen [wenn der Controller zuwenig Ports hat, oder man auf einer grossen Platine das Layout vereinfachen muss/will], AD-Wandler, spezielle Interface-Module [z.B. ein LCD], diverse Sensoren [Temperatur, Druck und andere Umweltgrössen], Zeitgeber [RTC, Real Time Clock], digital einstellbare Widerstände [DigiPot,...], usw...
Da gibt es nun wirklich eines an verschiedenen Anwendungsgebieten.
Der "Nachbar" von I2C, der sogenannte SMBus, wird beispielsweise auch in jedem handelsüblichen PC eingesetzt um gewisse Daten zu sammeln. (Lüfterdrehzahlen, Spannungswerte, Temperaturen, u.v.a.) Sogar auf die PCI-Express-Slots ist der SMBus gefüht, wobei er da glaube ich noch eher selten wirklich eingesetzt wird da die Daten eher über den schnellen differentiellen Bus gejagt werden.

Hoffe das hilft einwenig weiter...

Kommentar von klausi am 24.03.2008 um 18:57 geschrieben:

Wie verändern sich die Geschwindigkeiten wenn man die pull up widerstände verändert bitte um schnelle rückmeldung liebe grüße klausi

Kommentar von ohne Name am 08.04.2008 um 11:56 geschrieben:

Hallo!

Ein kleiner Bug:

I2C-Bus heisst ausgeschrieben Inter IC-Bus, zu Deutsch: Interner Integrierter-Schaltungs-Bus.


"Inter" heißt "zwischen"
Man denke an den InterCity oder die Interkontinentalrakete.
Diese "verkehren" zwischen Städten oder Kontinenten.

Es geht hier um die Kommunikation zwischen ICs.

Ein Stadt-interner Zug wäre eher eine Straßenbahn...

Kommentar von mborchers am 08.04.2008 um 17:30 geschrieben:

Danke für den Kommentar, war äußerst ungeschickt formuliert. Die "Übersetzung" ist nun detaillierter, weil man das im Deutschen eher schwer in drei Worten beschreiben kann.

Kommentar von markus am 10.04.2008 um 15:32 geschrieben:

kann mir bitte jemand helfen und mir sagen, was man beim i2c bus unter buszustände und adressierung versteht? ist ganz,ganz wichtig. wäre super, wenn es umfangreich beschrieben werden würde. (siehe Komentar von OhneName zum Thema Komponenten)
lg markus

Kommentar von Olli am 08.08.2008 um 10:16 geschrieben:

Wirklich gut erklärt!
Wie händelt man Probleme mit der SDA beim I2C Bus? Im Fernsehgerät als Beispiel. Was ist, wenn sich nichts bewegt;

Kommentar von ohne Name am 23.08.2008 um 00:09 geschrieben:

eine super erklärung, nicht zu lang alles wichtige kurz&knapp zusammengefasst. ein kompletter überblick in wenigen minuten. einfach und verständlich - vielen dank!

Kommentar von ohne Name am 08.10.2008 um 22:48 geschrieben:

Da hat sich einer die Mühe gemacht und ein komplexes Thema verständlich aufgearbeitet - Herzlichen Glückwunsch, gelungen. Leider fehlen einige wenige essenzielle Elemente um das nun gelernte auf Problemstellungen anzuwenden. Wissen hilft nur, wenn es anwendbar und einsetzbar ist!
Trotzdem, wie die Kommentare beweisen, eine gelungene Bereicherung, denk mal darüber nach das WIKI zu ergänzen.

Kommentar von lion-r am 21.06.2009 um 21:07 geschrieben:

hallo zusammen, es war echt supere Erklärung!
ich hab noch eine frage und zwar wie kann ich die Geschwindigkeit des I2C-Buses berchenen oder bestimmen?

Kommentar von lore am 13.09.2009 um 19:02 geschrieben:

Super! kurz und pregnant... könnten doch mehr Leute so erklären!

Kommentar von ohne Name am 09.12.2009 um 10:39 geschrieben:

echt klasse! schon mal dran gedacht den artikel bei wiki
einzustellen? find den sehr viel besser als den momentanen

Kommentar von sascha am 22.01.2010 um 15:26 geschrieben:

Hallo. Zunächst mal.... Eine supertolle Seite!!!!
Nun habe ich mal eine Frage. Kann mir jemand sagen was das für Sonderzwecke sind bei der 7-Bit-Adressierung? Bzw. weshalb ich statt 128 Bus-Teilnehmern nur 112 anklemmen darf? Ich verzweifele fast an meinen Überlegungen....

:-)

Kommentar von Thomas am 03.05.2010 um 19:27 geschrieben:

hallo Leute hab eine Frage ich weiß nicht ober nur der Master lese und schreibe rechte hat, oder kann das auch der slave?

mfg

Kommentar von mborchers am 03.05.2010 um 19:34 geschrieben:

Hallo Thomas,

mir ist nicht ganz klar, was du mit Lese- und Schreibrechte meinst. Aber soviel sei gesagt: Beim I2C initiiert immer (ohne Ausnahme) der Master einen Transfer. Mit dem R/W-Bit gibt er entsprechend die Richtung dieses Transfers an.
Ein Slave darf niemals von sich aus den Bus belegen; er antwortet entsprechend immer nur Auf Anfragen vom Master.

Damit ein Master nicht ständig bei einem Slave nachfragen muss, ob er neue Daten (welcher Art auch immer) hat, führen einige Slaves eine Interrupt-Leitung heraus, die man dann an den Master anschließen kann. Dieser Mechanismus gehört dann aber nicht mehr zum eigentlichen I2C-Bus.

Gruß,
Manuel

Kommentar von ohne Name am 04.05.2010 um 08:29 geschrieben:

Okay vielen Dank.
Hat mir weitergeholfen und du hast mein Problem genau erkannt. Nochmal Danke


Kommentar schreiben

Die Kommentar-Funktion ist nur für angemeldete User freigegeben.