Fachbegriffe aus der Mikrocontroller Welt - I2C / TWI

Kommunikation

  • I2C (oder auch TWI - Two Wire Interface)

Der I2C Bus ist ein synchroner serieller 2-Draht Bus, der in den 80er Jahren von Philips entwickelt wurde. I2C gesprochen 'I Quadrat C' kommt von der der Abkürzung IIC und bedeutet Inter-Integrated Circuit. Er wird hauptsachlich dazu benutzt, zwischen Schaltkreisen, die sich auf einer Platine verbinden, Daten auszutauschen. Die beiden Leitungen, die den I2C Bus bilden heißen SCL und SDA. SCL steht für Signal Clock und ist die Taktleitung für den Bus. Deshalb spricht man auch von einem synchronen Bus. SDA steht für Signal Data und ist die Datenleitung. Die Datenübertragungsrate des I2C Busses beträgt 100kHz im Standard Mode, bzw. 400kHz im Fast Mode. Aus Lizenzgründen nennt man das I2C Interface bei Atmel TWI (Two Wire Interface).

Der I2C Bus ist ein Multi Master/Slave Bus. Das bedeutet, es gibt mindestens einen I2C Master und ebenso mindestens einen I2C Slave. Der Master selektiert einen Slave durch seine Slave Adresse, die innerhalb eines Busses eindeutig sein muß. Eine Datenübertragung kann nur durch einen I2C Master initiiert werden. Der Slave bleibt immer passiv und lauscht nur auf die Slave Adresse und vergleicht diese mit seiner eigenen Slave Adresse. Erst wenn er seine Slave Adresse erkennt, greift der Slave auch aktiv in das Busgeschehen ein.

Aus Sicht des I2C Masters unterscheidet man zwischen Read und Write Sequenzen. Bei einer Read Sequenz liest der I2C Master Daten vom I2C Slave. Bei einer Write Sequenz sendet der I2C Master Daten zum Slave.

Wie man sich denken kann, gibt es verschiedene Bus Zustände

Durch die Signal Pegel der beiden I2C Bus Leitungen SCL und SDA ergeben sich verschiedene Zustände, die der Bus einnehmen kann.

 

Zustand Nummer 1.: Bus ist frei

Wenn SCL und SDA dauerhaft HIGH sind, spricht man von 'Bus free'. Ein I2C Master muß diese Bedingung immer zuerst abprüfen, bevor er den Bus belegen darf.

 

Zustand Nummer 2.: Start Bedinung (Übertragung kann beginnen..)

Die Start Bedingung kennzeichnet den Beginn einer Datenübertragung durch einen I2C Master. Der Master zieht die Datenleitung SDA von HIGH auf LOW, während die Taktleitung SCL auf HIGH bleibt.

 

Zustand Nummer 3.: Datenbit (Logische Informationen, Digitale Informationen)

Ein Datenbit kann, wie in der Digitaltechnik üblich 2 Zustände einnehmen '0' oder '1'. Die Daten sind gültig während die Taktleitung SCL auf HIGH liegt. Ein LOW Pegel auf der Datenleitung SDA bedeuted '0', ein HIGH bedeutet '1'

 

Zustand Nummer 4.: Acknowledge

Bei einer Schreib Sequenz quittiert der I2C Slave nach Erkennen seiner Slave Adresse bzw. nach jedem geschriebenen Daten Byte mit einem Acknowledge. Bei einer Lese Sequenz quittiert der I2C Slave nach Erkennen seiner Slave Adresse mit Acknowledge. Nach jedem gelesenen Daten Byte quittiert der I2C Master mit einem Acknowledge dem Slave, dass er bereit ist, weitere Daten zu empfangen. Dabei wird zu einem ebenfalls vom Slave generierten Takt Impuls die Daten Leitung auf LOW gehalten.

 

Zustand Nummer 5.: No Acknowledge

Bei einer Lese Sequenz sendet der I2C Master nach dem Lesen des letzten Daten Byte ein No Acknowledge. Das bedeutet, er möchte keine weiteren Daten mehr lesen. Dabei wird zu einem ebenfalls vom Slave generierten Takt Impuls die Daten Leitung auf HIGH gehalten.

 

Zustand Nummer 6.: Stopp Bedingung

Die Stop Bedingung kennzeichnet das Ende einer Datenübertragung durch einen I2C Master. Der Master zieht die Datenleitung SDA von LOW auf HIGH, während die Taktleitung SCL auf HIGH bleibt.

 

Addressierung

Nun gibt es bei einem "Bus System" ja meistens mehrere Teilnehmer die mit Informationen versorgt werden wollen. Stellen wir uns einmal vor, wir haben auf unserer Leiterplatte einen Temperatursensor und einen Datenspeicher wie zum Beispiel einen "EEProm " oder einen "Flash".

Nun hängen die beiden IC´s an den gleichen Leitungen.. Was nun? Woher weiß jetzt wer, wer was liefern oder speichern soll? Genau dafür gibt es eine Adressierungs Sequenz.

I2C Slave Adressen sind 7-Bit Adressen. Damit lassen sich an einem Bus bis zu 128 Geräte betrieben. Sofern jeder über eine verschiedene I2C Adresse verfügt. Die wird oft mit einem oder mehreren Bits Hardwaremäßig eingestellt. Einige Hersteller bieten dafür Pins mit den Bezeichnungen "A0-An" an. Je nachdem welche Pegel dort anliegen (low oder high), ändert sich die Adresse. Es werden meistens noch Widerstände an die Eingänge angeschlossen. PullUps oder PullDowns in Berreich von einigen kOhm (10 - 100k).

Beim Senden eines I2C Befehls folgt nach der 7-Bit Adresse als letztes und niederwertigstes Bit die Schreib/Lese Kennung. Damit kennzeichnet der I2C Master die Richtung des Datentransfers. Eine '1' steht für Lesen, das heißt der Master will vom Slave lesen. Eine '0' dagegen bedeutet, der Master will schreiben.

 

Hier sieht man wie aus einer 7 Bit Adresse mit einem lese / Schreibbit versehen wird.
Möchten wir jetzt dem Busteilnehmer (nehmen wir einfach mal den Temperatursensor..) sagen, dass er uns doch die aktuellen Werte für die Temperatur übermitteln soll, so legen wir jetzt den sogenannten "read/write Header" auf den Bus. Der beinhaltet die Adresse und das jeweilige Bit für lesen.

Die Adresse von dem Temperatur IC ist "0x09" + das Datenbit zum lesen (0x01).
In C, würde eine von vielen Möglichkeiten so aussehen..

#define I2C_READ                  (0x01)
#define I2C_WRITE                (0x00)
#define TEMP_SENS_ADDR     (0x09 << 1)

#define TEMP_SENS_ADDR_READ     (TEMP_SENS_ADDR + I2C_READ)
#define TEMP_SENS_ADDR_WRITE   (TEMP_SENS_ADDR + I2C_WRITE)

Daten Übertragen.:
******************************************************************

uint8_t receive=0;

i2c_start_wait(TEMP_SENS_ADDR_READ); // sendet den read header
receive = i2c_read_Nack(); // ließt ein byte und sagt dem sensor das er keine weiteren haben möchte..
i2c_stop(); // sagt dem Slave das die übertragung beendet ist
**************************************************************************

Wenn alles geklappt hat, finden wir jetzt unsere Date in der Variablen "receive".

Das alles kleines Beispiel..

Habt ihr Fehler gefunden oder Anmerkungen? Hinterlasst ein Kommentar. Danke!

Kommentar schreiben

Loading