Dies ist eine alte Version des Dokuments!


10. I2C Schnittstelle

Nach dieser Lektion sollten Sie:

  1. wissen wie die Kommunikation zwischen I2C Master und Slave funktioniert


USART

Abb. ##: Konzeptbild U(S)ART microcontrollertechnik:konzeptbildusart.png

I2C

Abb. ##: Konzeptbild I2C microcontrollertechnik:konzeptbildi2c.png

SPI

Abb. ##: Konzeptbild SPI microcontrollertechnik:konzeptbildspi.png

Statemachine der I2C Kommunikation

Startbedingung

Um die Übertragung zu beginnen muss die Startbedingung eingeleitet werden. Während SCL HIGH ist (a), geht SDA von HIGH auf LOW. Anschließend startet SCL mit LOW (b).

Für eine Startbedingung werden die Bits innerhalb des TWCR wie folgt gesetzt:

main.cpp
  1. TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
  2. // to set the following state:
  3. | (1<<TWIE ) // Enable TWI Interrupt.
  4. | (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
  1. TWDR = SLA_W; // Load SLA_W into TWDR
  2. TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
  3. // to start transmission of address

Die Daten (DATA) werden in gleicher Weise übertragen:

main.cpp
  1. TWDR = DATA; // Load DATA into TWDR
  2. TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
  3. // to start transmission of address

Stopbedingung

Die Stoppbedingung beendet die Übertragung. SCL geht auf HIGH (c), anschließend wechselt die SDA-Leitung von LOW nach HIGH (d).

Für eine Stoppbedingung werden die Bits innerhalb des TWCR wie folgt gesetzt:

main.cpp
  1. TWCR = (1<<TWINT)|(1<<TWEN); // Setting TWINT clears interupt flag
  2. // to set the following state:
  3. | (1<<TWIE ) // Enable TWI Interrupt.
  4. | (0<<TWSTA)|(1<<TWSTO); // Initiate a STOP condition.
  • Simulide: …\share\simulide\examples\Arduino\sofware_i2c_lcd\i2c_lcd-arduino (hierbei wird Software I2C eingesetzt)
  • Software I2C: