Dies ist eine alte Version des Dokuments!
10. I2C Schnittstelle
Ziele
Nach dieser Lektion sollten Sie:
- wissen wie die Kommunikation zwischen I2C Master und Slave funktioniert
Video
Dokumentation von Atmel
- alternative Implementierung von Elia Ritterbusch
Beschreibung
Statemachine der I2C Kommunikation
Zeitverlaufsdiagramm
Startbedingung
Um die Übertragung zu beginnen muss die Startbedingung eingeleitet werden. Während SCL HIGH ist geht SDA von HIGH auf LOW.
Für eine Startbedingung werden die Bits innerhalb des TWCR wie folgt gesetzt:
- main.cpp
- TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
- // to set the following state:
- | (1<<TWIE ) // Enable TWI Interrupt.
- | (1<<TWSTA)|(0<<TWSTO); // Initiate a START condition.
Übertragung
Die entscheidende Voraussetzung für eine erfolgreiche Bitübertragung ist, dass sich der Zustand von SDA nur ändern darf solange SCL auf LOW ist. Allerdings ist der Zustand von SDA erst gültig, wenn SCL auf HIGH ist.
Für die Übertragung eines Bytes muss TWDR und TWCR wie folgt gesetzt werden.
Zunächst wird die Übertragung der Adresse (SLA_W
) betrachtet:
- main.cpp
- TWDR = SLA_W; // Load SLA_W into TWDR
- TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
- // to start transmission of address
Die Daten (DATA
) werden in gleicher Weise übertragen:
- main.cpp
- TWDR = DATA; // Load DATA into TWDR
- TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
- // to start transmission of address
Stopbedingung
Die Stoppbedingung beendet die Übertragung durch den Übergang der SDA-Leitung von LOW nach HIGH während SCL auf HIGH ist.
Für eine Stoppbedingung werden die Bits innerhalb des TWCR wie folgt gesetzt:
- main.cpp
- TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
- // to set the following state:
- | (1<<TWIE ) // Enable TWI Interrupt.
- | (0<<TWSTA)|(1<<TWSTO); // Initiate a STOP condition.