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

  • Gleichberechtigte Kommunikationspartner (siehe Abbildung ##)
  • Senden und Empfangen geschieht über zwei separate Leitungen
  • Kommunikation ist nur zwischen zwei Geräten möglich. \\ein weiterer Slave würde eine weiteren U(S)ART-Bus benötigen

I2C

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

  • Master gibt Takt vor (siehe Abbildung ##)
  • Slave darf nur zu bestimmten Zeiten senden und nur, wenn der Master dies anfordert
  • Senden und Empfangen geschieht über die gleiche Leitung
  • Alle Slaves hören am gleichen Bus mit und schreiben auf die gleiche Leitung.
  • Slave muss anhand der Signale überprüfen, ob die Daten für ihn gemeint sind.

SPI

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

  • Master gibt Takt vor (siehe Abbildung ##)
  • Slave darf nur zu bestimmten Zeiten senden und nur, wenn der Master dies anfordert.
  • Senden und Empfangen geschieht über zwei separate Leitungen
  • Alle Slaves hören auf der gleichen Leitung mit und schreiben auf die gleiche Leitung.
  • Der gewünschte Slave wird über die Slave Select Leitung ausgewählt

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: