Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Laderegler Test Tueftler Seite

Geschichte

Der I2C-Bus (Inter Integrated Circuit) ist ein serieller synchroner Zweidraht-Bus, der vor rund 20 Jahren von Philips entwickelt wurde. Was die Philips-Designer seinerzeit kaum ahnen konnten: Ihr Inter-IC Bus (I2C, "1 Squared C") ist mittlerweile ein Industriestandard für Steuerungs-, Diagnose- und Überwachungslösungen in unzähligen Embedded-Applikationen. Mit einfacher Implementierung, niedrigen Kosten und einer Übertragungsrate bis 3,4 MBit/s ist der Bus-Veteran aktuell wie nie zuvor.

Ziel der damaligen Entwicklung war ein hierarchisches Bus-System, über das mehrere ICs bei geringstem Aufwand (Leiterbahnen, Komponenten, etc.) miteinander kommunizieren sollten. Daher bot sich eine serielle Struktur an, um

  • im Vergleich zu parallelen Bus-Systemen
  • mit weniger Leiterbahnen und I/0s auszukommen und so letztendlich Platinenfläche, IC-Abmessungen (Pin-Anzahl) und Kosten zu reduzieren.

Aus diesen Überlegungen entstand schließlich ein echter bidirektionaler Zweidraht-Bus in Master/Slave-Architektur mit integriertem Übertragungsprotokoll und Software-Adressierung, der nur zwei Verbindungen zwischen den ICs/Boards erfordert: Die Taktleitung SCL (Serial Clock Line) und die Datenleitung SDA (Serial Data Line).

Das bedeutet in der Praxis, dass z.B. ein Microcontroller ein ganzes "Netzwerk" von Chips mit nur zwei I/O Pins und einfacher Software steuern bzw. für bestimmte Funktionen nutzen kann. Ursprünglich wurde der I2C-Bus für Interaktionen zwischen einigen wenigen ICs entwickelt, die auf derselben Platine montiert waren, etwa zur Steuerung der Abstimmung von Autoradios oder TV-Geräten.

Dabei betrug die Übertragungsrate nur 100 kBit/s bei einer zulässigen Bus-Kapazität von 400 pF. Den ständig steigenden Leistungssnforderungen folgend, wurde die Übertragungsrate 1992 und 1998 auf 400 kBit/s bzw. 3,4 Mbit/s angehoben. Ein weiterer großer Vorteil des I2C-Bus besteht darin, dass auch deutlich langsamere Busteilnehmer am Bus betrieben werden können. Siehe dazu Clock Stretching.

Heute wird der I2C-Bus auch in Systemen mit mehreren Boards wie Blade- oder Rack-Mount-Servern eingesetzt, wobei I2C-Hot-Swap-Buffer ein störungsfreies Einsetzen oder Austauschen von Boards während des Betriebs gewährleisten. Zum Beispiel wird der I2C-Bus heute auch bei nahezu allen Projekten aus dem Roboternetz verwendet. Siehe dazu Projekte und Schaltungen.

Mit Hilfe neuer Expansions- und Steuerungs-Bauelemente kann der I2C-Bus inzwischen über die 400-pF-Grenze (ca. 20 bis 30 ICs pro Bus-Segment) hinaus erweitert werden. Dadurch können Entwickler mehr Chips sogar mehrere identische ICs mit der selben Adresse anschließen und flexibel auf die steigende Zahl von I2C-Bauelementen reagieren.

Ein großer Vorteil des I2C-Bus ist auch die einfache Ansteuerung. Da keine festen Taktzeiten eingehalten werden müssen, können sowohl langsame als auch sehr schnelle Bussteilnehmer, Chips und Programmiersprachen eingesetzt werden.

http://www.roboternetz.de/bilder/i2cbeitrag1.gif

Bitübertragung

Um ein Bit als gültig zu werten, muss SCL High sein. SDA darf sich währendessen nicht ändern (es sei denn es handelt sich um die Start- oder Stoppbedingung, doch dazu später mehr). Um beispielsweise eine 1 zu übertragen, müssen SDA sowie SCL High sein. Für eine 0, muss SDA Low sein, SCL jedoch High.

I2C Bituebertragung.png

Start- und Stoppbedingungen

Startbedingung

Um die angeschlossenen ICs zu informieren, dass eine Datenübertragung beginnt, muss eine Startbedingung erzeugt werden. Vorher kann keine Datenübertragung erfolgen. Eine Startbedingung wird erzeugt, indem, während SCL High ist, SDA von High auf Low wechselt.

I2C Startbedingung2.png

Stoppbedingung

Die Stoppbedingung funktioniert genau anders herum: SCL muss High sein und während dieser Phase wechselt SDA von Low auf High. Die Stoppbedingung beendet, wie der Name schon vermuten lässt, eine Datenübertragung. So kann der Master signalisieren, dass er keine weiteren Daten empfangen oder senden möchte.

I2C Stoppbedingung.png


Repeated-Startbedingung

Da die Stoppbedingung gleichzeitig auch eine Freigabe des Bus bedeutet (und dann könnte ja ein anderer Master den Bus übernehmen), gibt es auch den Start ohne vorheriges Stopp. Das wird dann benötigt, wenn vor dem Lesen erst ein Argument/Command geschickt werden muß. Abfolge:

 I2C Start
 I2C Send Write-Address
 I2C Send Argument
 I2C Start oder Repeated Start
 I2C Send Read-Address
 I2C Read Data
 ....
 I2C Stopp oder Release Bus

Datenübertragung größerer Datenmengen

Byteübertragung

Wenn ein Byte verschickt werden soll, dann wird als erstes das höchstwertigste Bit verschickt. Dann folgen die anderen bis hin zum niederwertigstem. Folgende Tabelle soll dieses Schema anhand der Zahl 109 verdeutlichen:

Dezimal 128 64 32 16 8 4 2 1
Dual 0 1 1 0 1 1 0 1
Übertragungsreihenfolge 1 2 3 4 5 6 7 8

Wie man sieht wird das Bit, das die Dezimalzahl 128 repräsentiert, als erstes übertragen.

Bestätigung (Acknowledgment)

Der Empfänger quittiert den Erhalt der Daten mit einer Bestätigung (oder auch Acknowledgment). Nach acht Datenbits und folglich auch acht Taktimpulsen wird eine Bestätigung erzeugt.

I2C Bestaetigung.png

Der Empfänger "zieht" SDA auf Low, bis der Master den neunten Taktimpuls generiert hat. Findet diese Bestätigung statt, bedeutet dies auch gleichzeitig, dass der Empfänger ein weiteres Byte empfangen möchte. Möchte der Empfänger kein weiteres Byte mehr empfangen, dann verschickt er keine Bestätigung. Das eigentliche Ende der Datenübertragung wird aber durch die Stoppbedingung ausgelöst (Oder die "Repeated Startbedingung").

Adressierung

Das erste Byte nach der Startbedingung, das der Master verschickt, ist die Adresse des Slaves, den er ansprechen möchte.

7-Bit Adressierung

Die 7-Bit Adressierung ist die erste Adressierungsform des I2C Busses und ermöglicht bis zu 128 (27) Geräte an einem Bus.

Aufbau einer 7-Bit Adresse

I2C Adresse Aufbau.png

Auch hier wird mit dem wichtigstem Bit begonnen. Da ein Byte aber acht Bits hat, und die Adresse nur sieben Bits, gibt es noch ein Bit, das die Datenrichtung angibt. Dieses Bit bestimmt, ob der Master Daten empfangen möchte oder ob er dem Slave Daten schicken möchte. Dieses letzte Bit wird als R/W Bit bezeichnet. Hat ein Slave seine Adresse richtig verstanden und ist bereit Daten zu empfangen oder, je nach Fall, zu verschicken, dann sendet er eine Bestätigung. Hat er seine Adresse nicht richtig mitbekommen, oder ist gerade nicht in der Lage eine Daten zu verschicken oder zu empfangen, dann bleibt die Bestätigung aus. Der Master kann dann eine Stoppbedingung erzeugen, sodass die Datenübertragung abgebrochen wird.

Reservierte Adressen

Einige Adressen wurden reserviert um den Bus ausbaufähig zu halten, oder um Missverständnissen vorzubeugen.

Adresse R/W Bit Beschreibung
0000000 0 General Call Adresse
0000001 X CBUS Adresse
0000010 X Reserviert für ein anderes Busformat
0000011 X Für zukünftige Erweiterungen reserviert
00001XX X Für zukünftige Erweiterungen reserviert
11111XX X Für zukünftige Erweiterungen reserviert
11110XX X 10-Bit Adressierung

Nach abzug der Reservierten Adressen, bleiben also 112 freie Adressen übrig, die man mit der 7-Bit Adressierung verwenden kann.

Subadressen

Als Subadressen bezeichnet man die vom Benutzer programmierbaren Adressbits einer Adresse. Dies sind bei den meisten ICs die letzten drei Adressbits. Da man so acht verschiedene Adresskombinationen zusammenbekommt (23), kann man folglich maximal acht dieser ICs an einem Bus gleichzeitig nutzen. Folgende Tabelle verdeutlicht dies am Beispiel des I2C Bausteins PCF 8570:

1. Teil: Feste Adresse 2. Teil: Subadresse
1010 XXX

10-Bit Adressierung

Da es mit der Zeit immer mehr I2C-Bausteine wurden und es schon vorher Überschneidungen, was die Adressen betraf, gab, wurden 10-Bit Adressen eingeführt. Diese erlauben bis zu 1024 (210) Geräte an einem Bus. Durch die Reservierung der Adressen 1111 0XX und des R/W Bits dieser Adresse, werden mögliche 7-Bit Geräte am Bus nicht gestört. Im Gegenteil, es können sogar 7- und 10-Bit Geräte an einem Bus betrieben werden.

Reservierte Adresse Adresse Teil 1 R/W Bit Adresse Teil 2
11110 XX X 1. Bestätigung XXXXXXXX 2. Bestätigung

Als erstes wird die reservierte Adresse mit den ersten fünf Bits "11110" gesendet. Dadurch wird, wie schon gesagt das Stören von Bausteinen mit 7-Bit Adressen vermieden. Nun folgen die ersten zwei Bits der eigentlichen Adresse. Nun kommt schon das R/W Bit, da nach einem Byte immer eine Bestätigung folgen muss, wenn eine weitere Datenübertragung erwünscht ist. Da es vorkommen kann, das mehrere Teilnehmer auf den ersten Teil der Adresse reagieren, werden auch alle diese betroffenen Teilnehmer die Bestätigung generieren. Nach der ersten Bestätigung kommt der 2. Teil der Adresse, der diesmal ein ganzes Byte ist. Alle Teilnehmer, bei denen der erste Adressteil schon zugetroffen hat, werden auch das zweite Adressbyte überprüfen, aber nur ein Teilnehmer kann eine Bestätigung erzeugen. Nach der zweiten Bestätigung kann der eigentliche Datenaustausch beginnen.

Beispiel einer Datenübertragung

Schema

Zum Abschluss noch das schematische Beispiel einer vollständigen Kommunikation zwischen einem Mikrocontroller als Master und einem Slave mit 7-Bit Adresse. In diesem Fall wird schreibend auf den Slave zugegriffen. Der Master ist also ein Sender, während der Slave als Empfänger fungiert.

I2C Datenuebertragung.png

Nach der Startbedingung folgt die Slaveadresse mit dem R/W Bit. Dann kommt die obligatorische Bestätigung und der Master sendet ein Byte. Nun folgt wieder eine Bestätigung und der Master sendet wiederum ein Byte. Der Slave sendet wieder seine Bestätigung, jedoch möchte der Master jetzt keine Daten mehr senden, da SDA jetzt auf +5 Volt liegt. Da nun das Ende der Datenübertragung erreicht ist, löst der Master die Stoppbedingung aus.

Oszillogramm

Hier ein typisches Bild einer I2C-Kommunikation:

http://www.tobias-schlegel.de/PublicData/DOUBLE.png


Programmierung Beispiel

Ein typisches Beispiel wie in einer Programmiersprache (hier Bascom Basic) Daten über den I2C-Bus verschickt werden:

i2c_init 
i2c_start 
i2c_sendebyte(slaveid) 
i2c_sendebyte(wert1) 
i2c_sendebyte(wert2) 
i2c_stop


Artikelautoren:

Frank
Vish


Verwendete Quellen für diesen Text:

  1. Philips Infos
  2. Spoerle Produktinfos
  3. mehrere Roboternetz-Artikel

Siehe auch

Weblinks


LiFePO4 Speicher Test