Der I2C Bus


Allgemeines zum I2C Bus

Der I2C Bus wird an dieser Stelle anhand eines Beispieles vorgestellt. Natürlich kann hier nicht die komplette Spezifikation erklärt werden, da dieser Bus sehr komplex ist. Detaillierte Informationen über den I2C Bus können auf der Internetpräsenz von Philips nachgesehen werden. Philips ist der Erfinder dieses Bussystems, so das dort in einem PDF Dokument die komplette Spezifikation zur Verfügung gestellt wird. In dem nun folgenden Beispiel steuert ein Microcontroller Z86E40 aus der Z8 Familie von Zilog über den I2C Bus ein EEPROM vom Typ 24C04 an, wobei der Controller der Busmaster und das EEPROM der Slave ist. Um anhand dieses Beispieles die Funktionsweise des I2C Bus zu verstehen, sind natürlich keine detaillierten Kenntnisse über Microcontroller und EEPROM's notwendig.


Warum gibt es den I2C Bus ?

Der I2C Bus wurde entwickelt, um Daten sicher über eine Zweidrahtverbindung zwischen mehreren Teilnehmern auszutauschen. IC's benötigen jeweils nur zwei PIN's und die Herstellungskosten von Platinen werden ebenfalls nicht unnötig erhöht. Die Integration des I2C Bus Protokolls führt weiterhin zum Verzicht von teuren Adressdecodern und erleichtert Entwicklern Hardware verschiedenster Anbieter miteinander zu verschalten.


Überblick über den I2C Bus

Der I2C Bus benutzt zwei Leitungen zum Datenaustausch, die SDA (Seriel Data Line) Leitung und die SCL (Seriel Clock Line) Leitung. Jeder Busteilnehmer besitzt seine eigene, eindeutige Adresse und kann sowohl Informationen senden als auch empfangen. Weiterhin werden die Teilnehmer als Master oder Slave charakterisiert. Ein Master ist ein Teilnehmer, der einen Datenaustausch initialisiert, kontrolliert und terminiert (abschließt). Ein Slave ist lediglich ein Teilnehmer, der von einem Master adressiert wird. Die Anwesenheit mehrerer Master in einem I2C Bus ist erlaubt, da der Buszugriff und die Taktsynchronisation zeitlich genau definiert ist. Alle Verbindungen zum Bussystem sind sog. "Wired And" Verbindungen. Sowohl die SDA als auch die SCL Leitung sind bidirektional und "Pulled Up" zum positiven High Level der Spannungsversorgung, d. h. im passiven Zustand liegt High Potential auf dem Bussystem. Der Datenaustausch beschränkt sich immer auf acht Bits und kann im Standardmode mit 100 kBits/s und im Fastmode mit bis zu 400 kBits/s übertragen werden.


Der Datentransfer auf dem I2C Bus

Der Datentransfer wird auf dem I2C Bus durch zwei eindeutige Zustände durch den Busmaster kontrolliert. Diese Indikatoren sind die START und STOP Zustände. Der Start einer Datenübertragung liegt vor, wenn der Level der SDA Leitung von High auf Low wechselt während die SCL Leitung High bleibt. Das Ende einer Datenübertragung liegt vor, wenn der Level der SDA Leitung von Low nach High wechselt, währen die SCL Leitung High bleibt. Die Daten auf der SDA Leitung müssen immer dann gültig bzw. stabil sein, wenn die SCL Leitung High ist. Der Level der SDA Leitung darf immer nur dann wechseln , wenn die SCL Leitung Low Pegel hat. Pro SCL Periode wird immer nur ein Bit übertragen. Die Grafik verdeutlicht den Startzustand, aufgenommen mit meinem Oszilloskop.


Nachdem die Startprozedur durchgeführt wurde, folgen die ersten acht Bit in Form von einer sieben Bit langen Teilnehmeradresse (Slave Adress) und einem Richtungsbit, dem sog. Lese/Schreib Bit (R/W Bit). Wie bereits erwähnt, besitzt jeder Teilnehmer/Slave seine eigene Adresse. In diesem Fall kann man dem EEPROM mit Hilfe der Adresseingänge A0,A1 und A2 eine Adresse hardkodiert mitteilen (siehe oberer Schaltplanausschnitt). Die Adressen sind nicht beliebig zu vergeben sondern bedürfen der Berücksichtigung der von Philips definierten Zuordnung, wie in der folgenden Tabelle ersichtlich ist.


Slave Adresse
R/W Bit
Beschreibung
0000 000
0
Allgemeine Teilnehmer Adresse
0000 000
1
START Byte
0000 001
X
CBUS Adresse
0000 010
X
Reserviert für verschiedene Busformate
0000 011
X
Reserviert für zukünftige Zwecke
0000 1XX
X
HS Mode Master Code
1111 1XX
X
Reserviert für zukünftige Zwecke
1111 0XX
X
10 Bit Slaveadressierung


Das Datenrichtungsbit (R/W Bit) ist das sog. "Least Significant Bit" und legt fest, ob der Master Daten senden (Bit = 0) oder empfangen (Bit = 1) möchte. Für jede acht Bitübertragung gilt, das das sog. "Most Significant Bit" zuerst übertragen werden muss. Nach jeder acht Bitübertragung folgt das sog. Bestätigungsbit (Acknowledge Bit). Dieses Bit ist ein kurzzeitiger Low Pegel auf der SDA Leitung, welcher vom jeweiligen Empfänger erzeugt wird, während der Master den neunten Clockpuls auf der SCL Leitung erzeugt. Ist der Empfänger nicht in der Lage, Daten zu empfangen, so ist der Level auf der SDA Leitung High während des neunten Clockpulses auf der SCL Leitung. Wurde die Start- und Adressübertragung erfolgreich abgeschlossen, so können beliebig Daten zwischen dem Master und dem Slave ausgetauscht werden. Der bereits zuvor besprochene STOP Zustand beendet die Kommunikation. Die folgende Grafik zeigt eine lange Datenübertragung, bei der jedoch nur die ersten zwölf Bits eingefangen werden konnten. Nach der Startprozedur kann man die Information 10100000 auf der SDA Leitung erkennen. 1010 ist die EEPROM Device Adresse, 000 ist die hardkodierte Teilnehmeradresse A2, A1, und A0 und die achte Stelle (0) ist das Lese/Schreibbit des Masters. An dem neunten Bit auf der SCL Leitung ist sehr gut zu erkennen, dass der Slave den Pegel dieser Leitung auf Low hält und dem Master damit seine Bereitschaft anzeigt.




24CXX EEPROM's an einem I2C Bus

Um die Funktionsweise des I2C Bus noch besser zu verdeutlichen, gehe ich hier etwas detaillierter auf die Ansteuerung von EEPROM's ein. Die EEPROM's aus der 24CXX Serie sind serielle zweidraht EEPROM's, die einen Speicherbereich von 256 bis 2K Byte bieten. Die Adresseingänge A0, A1 und A2 wurden bereits zuvor beschrieben. Einzig zu erwähnen bleibt nur noch der Eingang WP (Write Protect). Wird dieser Eingang mit der positiven Betriebsspannung verbunden, so ist das EEPROM schreibgeschützt. Ein EEPROM ist in einem I2C Bus immer ein Slave. Mit den ersten vier Bits als 1010 wird in diesem Bus jeweils ein Speicherbaustein adressiert. Die nun folgende Tabelle zeigt die verschiedenen Typen.



Die Typen der 24CXX EEPROM Familie

Device
Bytes
Max. Devices
Page Write
Device Adress Byte
24C01A
128
8
8
1010 A2 A1 A0 R/W
24C02
256
8
8
1010 A2 A1 A0 R/W
24C04
512
4
16
1010 A2 A1 P0 R/W
24C08
1K
2
16
1010 A2 P1 P0 R/W
24C16
2K
1
16
1010 P2 P1 P0 R/W


Die Ansteuerung eines EEPROM

Nachdem nun erfolgreich die Teilnehmeradresse übertragen wurde, kann nun die Speicheradresse in der geschrieben oder aus der gelesen werden soll, übermittelt werden. Zwei Arten von Schreibzugriffen existieren, der byteweise Zugriff und der seitenweise Zugriff (Byte und Page). Der byteweise Zugriff erlaubt die Beschreibung einer beliebigen oder zufälligen Speicheradresse. Der Ablauf ist wie folgt:

  • START Zustand (Master)

  • EEPROM Teilnehmer Adresse mit R/W Bit=0 (Master)

  • Bestätigungsbit (Slave, EEPROM)

  • Ziel/Speicher Adresse (Master)

  • Bestätigungsbit (Slave, EEPROM)

  • Datenbyte/Informationen (Master)

  • Bestätigungsbit (Slave, EEPROM)

  • STOP Zustand (Master)


Ablauf einer Schreiboperation

Nach Erhalt des Stop Bits führt das EEPROM einen internen Schreibzyklus zum nicht flüchtigen Speicher durch. Alle Eingänge des EEPROM's sind während dieses Vorganges deaktiviert. Dem Master bleiben zwei Möglichkeiten um festzustellen, ob der interne Schreibzyklus beendet ist. Die erste Methode ist ein Timeout auszuwerten. Dieser Timeout muss größer sein als die maximale interne Schreibzykluszeit. Die zweite und elegantere Alternative ist der sog. "Acknowledge Poll", also das EEPROM zyklisch anfragen, ob es empfangsbereit ist. Dies geschieht durch das Senden des Start Bits gefolgt von der Teilnehmeradresse. Ist das EEPROM bereit, so antwortet es mit dem Bestätigungsbit (ack=acknowledge).

Der seitenweise Zugriff ist identisch mit dem zuvor beschriebenen byteweisen Zugriff. Hier wird jedoch anstelle von nur einem Datenbyte gleich mehrere Datenbytes gesendet. EEPROM's unterstützen meist zwischen 8 und 16 Bytes pro seitenweiser Zugriff. Das EEPROM inkrementiert automatisch seinen internen Speicherzeiger zwischen den Schreibzyklen. Wird die höchste Adresse erreicht, so findet automatisch ein Umbruch statt und der Zeiger springt auf die erste Adresse zurück. Der große Vorteil des seitenweise Zugriffs ist das Senden von mehreren Bytes innerhalb nur eines Schreibzyklus.



Ablauf einer Leseoperation

Drei Arten von Lesezugriffen gibt es, der aktuelle Adresszugriff, der zufällige Adresszugriff und der sequentielle Adresszugriff. Lesezugriffe beginnen genau wie Schreibzugriffe, ausgenommen das Lese/Schreibbit, welches hier nach der Teilnehmeradresse auf High gesetzt ist. Bei dem aktuellen Adresszugriff wird keine Speicheradresse übermittelt. Es wird die Adresse im EEPROM angesprochen, die zuletzt aktuell war, jedoch erhöht um Eins. Die Sequenz sieht folgendermaßen aus:

  • START Zustand (Master)

  • EEPROM Teilnehmer Adresse mit R/W Bit=1 (Master)

  • Bestätigungsbit (Slave, EEPROM)

  • Datenbyte/Informationen (Master)

  • Nicht Bestätigungsbit (Master, EEPROM)

  • STOP Zustand (Master)


Ablauf des aktuellen Adresszugriffes

In dieser Ablaufsteuerung sieht man, dass keine Speicherstellenadressierung in der Datenübertragung enthalten ist.


Ablauf des zufälligen Adresszugriffes

Dieser Zyklus startet mit einem "Dummy Byte" Schreibzyklus, gefolgt von dem aktuellen Adresszugriff, wie bereits zuvor beschrieben.


Ablauf des sequentiellen Adresszugriffes

Der sequentielle Zugriff wird entweder mit dem aktuellen oder mit dem zufälligen Adresszugriff initialisiert. Hier schließt der Master nicht jedes übertragene Byte mit einer "Nicht Bestätigung" (Non Acknowledge) ab, sondern antwortet mit einer gültigen Bestätigung nach jedem empfangenen Byte. Dieser Befehl führt dazu, dass das EEPROM mit der Übertragung des nächsten Datenbyte startet. Dieser sequentielle Datenzugriff wird erst durch ein "Non Acknowledge" des Masters beendet.

Bei der Entwicklung eigener Schaltkreise ist zu berücksichtigen, dass ein Pull Up Widerstand in der SDA Leitung eingesetzt wird, da es sich hier um "Open Drain" Ausgänge handelt, wie mit R14 in meinem o. a. Schaltplanausschnitt zu sehen ist.



[ Zurück zur Startseite ]      © Thomas Otte