erstellt   10.03.2009
Der I2C Bus
Der I2C - Bus ( Inter Integrated Circuit ) wurde 1979 ursprünglich von der Firma Phillips entwickelt und hauptsächlich in Fernseher eingesetzt um eine
Datenverbindung innerhalb der Geräte zu ermöglichen z.B. für die IR Übertragung in Stereo Anlagen , Fernseher usw.
Bei Atmel wird ein Datenbus verwendet welcher unter dem Namen TWI läuft aber weitgehend mit der I2C Spezifikation überein stimmt.
Möglicherweise wurde er aus Gründen des Urheberrechts anders benannt.
Es gibt andere und auch schnellere Bussysteme die aber entweder mehr Software oder mehr Hardware Aufwand benötigen .
Der I2C ist ein Serielles Bussystem bei dem die Daten hintereinander und nicht zeitgleich übertragen werden.
Software I2C
Die Softwareversion der I2C-Implementierung kann auf allen AVR programmiert werden, man kann sich die Ports auf denen Data (SDA) und Clock (SCL)
angeschlossen werden selbst aussuchen.
Standardmäßig wird von Bascom die Software-Version verwendet um auf den I2C-Bus zuzugreifen, d.H. die einzelnen Bits der zu übertragenden Daten werden
per Software auf High- oder Low-Pegel an den Ports ausgegeben.
Der AVR kann in dieser Zeit keine anderen Aufgaben erledigen.
Hardware TWI
AVR Controller die I2C hardwaremäßig unterstützen haben das TWI-Modul, die Ports für Data und Clock sind dabei vorgegeben.
TWI ist bei den meisten ATMegas vorhanden, z.B. dem ATMega32 un d Atmega 8.
Damit Bascom das TWI-Modul verwendet muss die I2C_twi.lib (bzw. .lbx, bei der Bascom-Demo) eingebunden werden, ansonsten ist bis auf die Initialisierung,
alles genauso wie bei Software-I2C. Bei Verwendung der Bascom-I2C-Befehle macht es Performancemäßig keinen großen Unterschied, ob man Software-I2C
oder TWI verwendet, denn bei beiden Versionen wird solange darauf gewartet, bis das Byte über den Bus gesendet ist, und ein ACK oder NACK empfangen ist.
Der Vorteil von TWI ist aber, das es in Multimasterumgebungen besser verträglich ist (z.B. I2CStart).
Gibt es nur einen Master, kann man sich für eine der beiden Versionen entscheiden.
TWI oder I2C ?
Kleinere AVR Controller, die zwar kein TWI-Modul haben aber I2C hardwaremäßig Unterstützen haben das USI-Modul, die Ports für Data und Clock sind dabei vorgegeben.
USI ist bei den meisten ATTinys und einigen ATMegas vorhanden, z.B. dem ATTiny2313.
Das USI-Modul kann evtl. als eine Art von TWI-Light angesehen werden, denn es ist nicht so komfortabel wie TWI,es muss intern noch viel in Software erledigt werden,
weshalb es Performancemäßig auch keinen großen Unterschied macht ob man Software-I2C oder USI beim Master verwendet.
Das Besondere an dem I2C
Bus ist sein lammfrommes Zeitverhalten. Es ist gleichgültig wann ein Befehl über die Leitung geschickt wird (natürlich muß die richtige Reihenfolge der SDA und
SCL - Impulse eingehalten werden).
Doch ob der Befehl „Daten lesen“ eine halbe Stunde nach dem „Start“ - Befehl gegeben wird, ist für den Bus irrelevant.
Dieses zeichnet ihn für den Einsatz eines kleinen Microprozessors so besonders aus denn als Programmierer muß man sich keine Gedanken darüber machen,
ob der Chip irgendwo etwas anderes abarbeitet und damit evtl. ein Timingproblem aufwirft.
Wohlgemerkt, der Bus ist kein Geschwindigkeitsweltmeister , er kann normalerweise im 100 Kilohertzbereich, die neueren Chips im 400 Khz - Bereich, getaktet werden.
Das erreicht man natürlich mit dem Basiccompiler niemals (ein Assemblerprogramm könnten hier ein Vielfaches an Geschwindigkeit herausholen).
Läßt man den Prozessor ungebremst den I2C-Bus bedienen und hat man Leuchtdioden an den Ausgängen angescchlossen, so kann man das Blinken der Dioden
(im Zufallsbetrieb) noch gut mit den Augen beobachten.Doch im Mess- Steuer- Regelprojekt hat man normalerweise keine allzugroßen Geschwindigkeitsprobleme.
Adressen
Jeder Chip ( A/D Wandler, EEPROM, ein DTMF-Chip usw) hat eine 4 Bit große Baustein-Adresse. z..Beispiel das EEprom 24C64, der immer die Systemadresse 1010yyyx
innerhalb eines Bytes hat, was gleichbedeutend mit der Grundadresse hex A0 oder dezimal 160 ist.
Also immer dann, wenn nach der Startkondition in dem gesendeten Byte die 160 enthalten ist, werden die EEprom's angesprochen .
Danach kommen 3 Bits (oben als yyy bezeichnet), die die Adresse des speziell angesprochenen Chips in der EEprom Gruppe bezeichnen. Was bedeutet das?
Die drei Bits können bekanntlich 8 duale Zustände haben. 000=0 , 001=1, 010=2, 011=3, 100=4, 101=5, 110=6, 111=7.
Damit lassen sich also 8 verschiedene EEproms anspechen
Dann gibt es noch das Bit X .
Da die Ports ja bidirektional aufgebaut sind (was sehr vorteilhaft ist), muß man die Absicht (lesen oder schreiben) dem EEprom mitteilen. Eine x=1 bedeutet lesen, eine x=0 bedeutet schreiben.
Paxis
In der Praxis bedeutet das, dasss wir ersteinmal beispielsweise bei einem EEprom 24C128 eine Adresse einstellen müssen ,mit der das Bauteil (EEprom) eindeutig angesprochen werden kann.
Diese Adresse werden wir Hardwaremäßig festsetzten , indem wir die folgenden Adressanschlüsse am EEprom auf Masse legen ,(Bit 1 = PIN 1) , ( Bit 2 =Pin 2) , (Bit 3 =Pin 3) Bedeutet also Bit 1,2 und 3 auf Null .
Bit76543210
     000 
         
         
Dann haben wir noch die Device Adresse, praktisch die von der Art des Bautels Abhängige Adresse beim EEprom folgende Bit 7, 6, 5, 4,ist sie 1010 , bei einem I/O Expander ( praktisch eine Porterweiterung z.B mit dem Baustein PCF 8574 ist die Adresse wie folgt : 0100
Bit76543210
 1010000 
         
         

Dann haben wir noch das Bit 0 welches auskunft darüber gibt ob gelesen oder geschrieben werden soll. Beim EEprom ist das Pin7

Bit76543210
 101000
0
1
         
         
Somit ergibt sich folgende Adresse 01010001 als Hex A1 als Dezimal 161 zum auslesen des Eeprom
und folgende Adresse 10100000 als Hex A0 als Dezimal 160 zum beschreiben des Eeprom
Damit ist nun ein spezieller Chip angesprochen; . Hierbei erkennt man auch, warum der Bus nicht so super schnell sein kann.
Denn bisher haben wir bereits ein Byte gesendet, ohne etwas bewirkt zu haben. Noch sind keine Daten geschrieben oder gelesen.
Dieses folgt jetzt - allerdings muß der Prozessor noch eine Bestätigung des Chips abfragen, das sogenannte Acknowledge.
Geht nämlich nach Versenden des obigen Bytes die Datenleitung auf high (wir werden das später noch genauer sehen), so setzt der Chip selbst diese
Datenleitung auf low.
Dieses kann man mit dem Prozessor abfragen und man weiß dann, daß der angesprochene Chip das Byte kapiert hat.
Im Beispielprogramm finden Sie nachher die Zeile wait not data. Hier wird solange in der Abarbeitung des Programmes innegehalten, bis
die Dataleitung vom Chip auf low gesetzt wurde. Dieses geschieht jedoch sehr fix, ist aber wieder ein kleiner Geschwindigkeitshemmschuh.
Ok, das Acknowledge wurde vom Chip gegeben und nun kann ich die gewünschte Information als Byte versenden.
Vorteil
Der I2C Bus kommt mit nur zwei Datenleitungen und eine Masseleitung aus. und belegt somit am Mikrocontroller gerade einmal 2 Ein/Ausgänge.

Nachteil
Der I2C ist nicht besonders schnell, und kann maximal 4 Meter Übertragungsweg überbrücken, wenn keine zusätzlichen Maßnahmen getroffen werden.

Allgemeines
Der ATmega 8 besitzt ein Two-Wire Serial Interface. Diese Schnittstelle ist äquivalent zum I2C-Bus, der, wie Two Wire schon sagt, mit nur zwei Leitungen auskommt.
Dieser Bus ist ein serieller Datenbus, der um 1980 von Philips entwickelt wurde, um in Geräten wie Fernsehern mehrere ICs an Mikroprozessoren anschließen
zu können ohne breite Adress- und Datenleitungen zu benötigen. Daher kommt auch die Bezeichnung I2C, was eine Abkürzung für Inter IC ist.
Gemeint ist damit, dass der Bus für Verbindungen zwischen ICs gedacht ist.
Der Bus hat in der aktuellen I2C-Spezifikation 2.1 von 2001 eine maximale Datenübertragungsrate von 3,4 Mbit/s (High-Speed Modus),
jedoch ist der ATmega 16 ein Fast-Mode Gerät, daher können nur Übertragungsraten von maximal 400 kbit/s verwendet werden.
Eigenschaften
Der groÿe Vorteil des Busses ist, dass man mit nur zwei Leitungen viele ICs miteinander verbinden kann.
Dazu kommt, dass während einer Datenübertragung der Takt automatisch von den beteiligten Geräten angepasst werden kann,
falls eines der Geräte mehr Zeit zur Verarbeitung der Daten benötigt.
Es ist außerdem ein Arbitrationsverfahren vorgesehen.
Dieses Verfahren sorgt dafür, dass nur ein Gerät erfolgreich Daten auf den Bus schreiben kann, wenn mehrere Geräte gleichzeitig versuchen eine Verbindung
auf dem Bus zu initiieren.
Zur Adressierung der am Bus angeschlossenen Geräte stehen wahlweise 7-bit oder 10-bit Adressierung und damit 112 bzw. 1024 Adressen zur Verfügung.
Dadurch, dass es so wenig Adressen gibt, jedoch die Auswahl an ICs mit I2CAnsteuerung groß ist, kommt dazu, dass verschiedenen Geräten desselben Typs
dieselbe Adresse zugewiesen wird.
Problematisch kann dies werden, wenn man beispielsweise mehrere serielle EEPROMs am Bus betreiben möchte, zumal manche I2C-fähigen EEPROMs gleich
8 Adressen belegen, wodurch bei 7-bit Adressierung nur ein einziges EEPROM am Bus betrieben werden kann.
Generell können durch die in der Spezifikation festgelegte maximale Leitungskapazität von 400pF ca. 20 Geräte an einem Bus betrieben werden,
 alternativ können die Leitungen ca. 10 m lang sein. Durch I2C Repeater o. Ä. kann diese Beschränkung jedoch umgangen werden.
Einsatzgebiete
Der I2C-Bus wird eingesetzt in Geräten wie zum Beispiel Fernsehern, Telefonen und Waschmaschinen. Es gibt Chipkarten, die über I2C angesprochen
werden und auch im Computerbereich wird der Bus eingesetzt, beispielsweise auf Mainboards in Form des SMBus, der auf dem I2C-Bus basiert.
In Monitorkabeln wird der DDC verwendet, der ebenfalls auf dem I2C-Bus basiert und der Grafikkarte erlaubt, Informationen mit einem Monitor auszutauschen.
ICs, die man in I2C-Bussen verwenden kann sind u. a.
• EEPROMs
• Portexpander
• LCD-Displays
• Treiber
• AD-, bzw. DA-Wandler
• Sensoren
Ablauf einer Verbindung
SCL und SDA
Der I2C-Bus verwendet zwei Leitungen zur Datenübertragung, dabei ist eine der beiden Leitungen eine Datenleitung, während die andere Leitung
eine Taktleitung ist.
Entsprechend werden die Leitungen SDA für Serial DAta bzw SCL für Serial CLock genannt.
Beide Leitungen sind laut Spezifikation mit Pullups auf High-Level zu halten; die SDA- und SCL-Pins der angeschlossenen ICs sind Open-Drain bzw.
 Open-Collector. Daher muss ein am Bus angeschlossener IC um eine 1 zu senden die Leitung loslassen und um eine 0 zu senden die Leitung auf Masse ziehen.
 Es ergibt sich dadurch eine Wired-And Funktion der Busleitungen.
START- und STOP-Condition
Der Bus ist so ausgelegt, dass ein Busteilnehmer eine Verbindung zu einem anderen Busteilnehmer initiiert und nachher die Verbindung beendet oder eine weitere Verbindung aufbaut.
Während einer Verbindung dürfen andere Busteilnehmer nicht auf den Bus zugreifen.
 Damit die am Bus angeschlossenen Geräte erkennen können, ob der Bus frei oder belegt ist, werden START- und STOPConditions verwendet, die Anfang und Ende einer Verbindung kennzeichnen.
Eine START-Condition wird ausgelöst durch einen High-Low Übergang auf SDA, während SCL High ist und eine STOP-Condition wird umgekehrt ausgelöst durch einen Low-High Übergang auf SDA, während SCL High ist. Außer beim Auslösen von START- bzw. STOP-Conditions darf sich SDA während der High-Phase von SCL jedoch nicht verändern.
Master und Slave, Transmitter und Receiver
Die Busteilnehmer können jeweils Master oder Slave, Transmitter oder Receiver sein. Bei einer Verbindung zwischen zwei Busteilnehmern ist jeweils eines der Geräte Master bzw. Slave; gleichermaÿen ist jeweils eines der Geräte Transmitter oder Receiver.
Dabei ist der Master dafür zuständig, die Verbindung zu einem Slave-Gerät zu initiieren und zu beenden, sowie den Takt auf der SCL-Leitung bereitzustellen.
Außerdem bestimmt der Master die Datenrichtung der Verbindung, d. h. welches der beiden Geräte Receiver und welches Transmitter ist.
Ein Gerät, das die Rolle eines Slave einnimmt, spricht auf eine Verbindungsanfrage eines Masters an, wenn es die eigene Geräteadresse empfängt. Es reagiert dann abhängig von der Datenrichtung mit dem Senden, bzw. Empfangen von Daten. Zusätzlich hat der Slave die Möglichkeit, die Taktrate auf der SCLLeitung herabzusetzen, wenn diese zu schnell ist um die empfangenen bzw zu sendenden Daten abzuarbeiten.
Der Transmitter ist das Gerät, das nach erfolgreichem Verbindungsaufbau Daten auf den Bus legt und der Receiver ist das Gerät, das die vom Transmitter gesendeten Daten empfängt.
Beispiel:
Wenn ein Mikrocontroller einen Wert von einem Temperatursensor liest, so ist der Mikrocontroller ein Master Receiver (denn er initiiert die Verbindung zum Sensor und empfängt dessen Daten), während der Sensor ein Slave Transmitter ist (denn er wird adressiert und sendet Daten).

Jede Verbindung auf dem I2C-Bus beginnt damit, dass ein Master eine START-Sequenz sendet. Sobald die START-Sequenz übertragen wurde, sendet der Master die 7-bittige Adresse des Slave-Geräts mit dem Datenrichtungsbit (R/¯W ). Wenn der Slave mit der passenden Adresse am Bus angeschlossen ist, so wird er zum nächsten SCL-High die SDA-Leitung auf Low ziehen und somit das ACK-Bit setzen. Wenn sich jedoch kein Slave meldet, bleibt SDA auf High und es wird somit ein NACK-Bit gesetzt. In dem Fall eines NACK hat der Master die Wahl, entweder. eine STOP-Sequenz zu senden um den Bus wieder freizugeben, oder eine wiederholte START-Sequenz zu senden um einen anderen Slave zu adressieren.
Sofern ein ACK empfangen wurde, sendet der Transmitter eines oder mehrere Datenbytes, die vom Receiver jeweils mit ACK oder mit NACK bestätigt werden. Wenn der Receiver nach dem Empfang eines Datenbytes mit NACK antwortet, so ist dies für den Transmitter das Zeichen, dass der Receiver keine weiteren Bytes mehr benötigt. Nach jedem ACK oder NACK hat der Master die Möglichkeit, die Übertragung
mit einer STOP-Sequenz zu beenden oder mit einer wiederholten START-Sequenz eine neue Übertragung mit neuer Slave-Adresse und Datenrichtung zu beginnen.

Beispiel: Ein Mikrocontroller liest zwei Datenbytes ab einer bestimmten Speicheradresse von einem EEPROMs
• Der Mikrocontroller (der hier als Master arbeitet) sendet eine START-Sequenz und anschlieÿend die Adresse des EEPROMs und das Schreibbit
(1010xxx0).
• Das EEPROM bestätigt mit ACK, dass es seine Adresse empfangen hat und bereit ist, Daten zu empfangen.
• Der Mikrocontroller sendet die Speicheradresse und das EEPROM bestätigt den Empfang mit ACK.
• Der Mikrocontroller sendet eine wiederholte START-Sequenz und die Adresse des EEPROMs, allerdings diesmal mit einem Lesebit (1010xxx1)
um die Datenrichtung umzukehren, also um nun vom EEPROM zu lesen.
• Das EEPROM sendet ein Datenbyte und Mikrocontroller antwortet mit ACK.
• Das EEPROM sendet ein weiteres Datenbyte und Mikrocontroller antwortet diesmal mit NACK, um dem EEPROM mitzuteilen, dass es keine
weiteren Datenbytes senden soll.
• Der Mikrocontroller sendet eine STOP-Sequenz.
Adressierung
Beim I2C-Bus gibt es 2 verschiedene Arten der Adressierung: Die 7-Bit Adressierung und die 10-Bit Adressierung.
Bei der 7-Bit Adressierung wird nach einer START-Sequenz eine Adresse mit 7 Bits, sowie ein Datenrichtungsbit übertragen. Die drei niedrigstwertigen Bits sind dabei meist am jeweiligen IC einstellbar (z. B. durch Adresspins am IC). Zwei Adressbereiche von jeweils 8 Adressen (1111XXX und 0000XXX) sind jedoch reserviert. Die folgende Tabelle aus der I2C-Spezifkation beschreibt, wofür die reservierten Adressen verwendet werden.
Da mit der 7-Bit Adressierung nur 112 verschiedene Adressen möglich sind, wurde in der I2C-Spezifkation 1.0 von 1992 die 10-Bit Adressierung eingeführt. Dadurch sind 1024 weitere Adressen verfügbar. Die 10-Bit Adressierung funktioniert dadurch, dass nach der START-Sequenz erst eine spezielle 7-Bit Adresse (11110XX) mit einem Schreibbit (0) übertragen wird, wobei die beiden niedrigstwertigen Bits dieser 7-Bit Adresse die beiden höchstwertigen Bits der 10-Bit Adresse sind. Weil die 7-Bit Adresse zu den reservierten Adressen gehört, wird kein Gerät darauf antworten, das nur 7-Bit Adressierung versteht, sondern ausschlieÿlich Geräte, die eine 10-Bit Adresse haben, deren beiden höchstwertigen Bits den beiden niederwertigsten Bits der 7-Bit Adresse entsprechen. Nachdem ein Slave auf die Adresse geantwortet hat, kann nun der Master ein weiteres Datenbyte übertragen, das nun die nächsten 8 Bit der Adresse enthält. Wenn auf diese Adresse ein Slave mit einem ACK antwortet, so kann der Master anfangen Daten zu senden.
Sollte der Master allerdings Daten vom Slave lesen, so muss er eine wiederholte START-Sequenz auslösen und wieder die 7-Bit Adresse senden, allerdings diesmal mit einem Lesebit (11110XX1). Dadurch erkennt der zuvor adressierte Slave, dass er als Slave-Transmitter funktionieren soll und fängt an, Daten zu senden.
r
Aktualisiert 21.05.2018
Copyright by Ms 2009