Titelbild Mikrocontroller

16.7. Anwendung des TWI

Das AVR TWI ist Byte-orientiert und Interrupt basierend. Interrupts sind das Ergebnis aller Bus-Ereignisse wie das Empfangen eines Bytes oder das Senden einer START Bedingung. Da das TWI auf Interrupts basiert, kann die Applikationssoftware andere Aufgaben durchführen, während ein Byte übertragen wird. Das TWI Interrupt Enable Bit (TWIE) im TWCR Register zusammen mit dem I-Bit im SREG erlaubt der Applikation zu entscheiden, ob mit dem Auftreten des TWINT Flags eine Interrupt Anforderung ausgelöst wird oder nicht. Wenn das TWIE Bit gelöscht ist, muss die Applikationssoftware das TWINT Flag pollen, um die Aktivitäten auf dem TWI Bus zu erkennen.

Wenn das TWINT Flag gesetzt wird, wurde eine TWI Operation beendet und erwartet eine Antwort der Applikation. In diesem Fall enthält das TWI Status Register (TWSR) einen Wert, der den aktuellen Status des TWI Busses wiedergibt. Die Applikation kann dann entscheiden, wie sich der TWI Bus im nächsten Zyklus verhalten soll, indem das TWCR und das TWDR entsprechend manipuliert werden.

Die nachfolgende Abbildung zeigt ein einfaches Beispiel, wie die Applikation mit dem TWI zusammenarbeiten kann. In dem Beispiel will ein Master ein Byte an einen Slave senden. Die Beschreibung ist zunächst abstrakt, weitere detailliertere Beispiele folgen später. Ein einfacher Beispielcode der das gewünschte Verhalten erzeugt, ist ebenfalls enthalten.
Typische Übertragung mit TWI

Typische Übertragung mit TWI



1.) Der erste Schritt bei einer TWI Übertragung ist das Senden einer START Bedingung. Dies wird gemacht, indem ein spezieller Wert in das TWCR geschrieben wird, der die TWI Hardware veranlasst, eine START Bedingung zu senden. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden der START Bedingung beginnen.

2.) Wenn die START Bedingung gesendet wurde, wird das TWINT im TWCR gesetzt und das TWSR wird mit dem Statuswert upgedatet, der signalisiert, dass eine START Bedingung erfolgreich ausgesendet wurde.

3.) Die Applikationssoftware sollte nun den Wert des TWSR analysieren, um sicherzustellen, dass die START Bedingung erfolgreich gesendet wurde. Wenn dies nicht der Fall war, muss die Software eine Art Fehler-Routine ausführen. Wenn der Status-Code der erwartete ist, muss die Applikation als nächstes die SLA+W in das TWDR laden. (Das TWDR wird für Adressen und Daten verwendet). Nachdem das TWDR mit der gewünschten SLA+W geladen ist, muss wieder ein spezieller Wert in das TWCR geschrieben werden, der die Hardware veranlasst, den SLA+W Wert im TWDR zu übertragen. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden der SLA+W beginnen.

4.) Nachdem das Adresspaket ausgesendet wurde, wird das TWINT Flag im TWCR gesetzt und das TWSR wird mit dem Statuscode geladen, der das erfolgreiche Aussenden des Adresspaketes signalisiert. Der Statuscode zeigt auch an, ob ein Slave das Adresspaket bestätigt hat oder nicht.

5.) Die Applikationssoftware sollte nun den Wert des TWSR analysieren, um sicherzustellen, dass das Adresspaket erfolgreich übertragen und wie erwartet bestätigt wurde (ACK). Wenn dies nicht der Fall war, muss die Software eine Fehler-Routine ausführen. Wenn der Status-Code der erwartete ist, muss die Applikation als nächstes das Datenbyte in das TWDR laden. (Das TWDR wird für Adressen und Daten verwendet). Nachdem das TWDR mit der gewünschten Daten geladen ist, muss wieder ein spezieller Wert in das TWCR geschrieben werden, der die Hardware veranlasst, den Daten Wert im TWDR zu übertragen. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden des Datenbytes beginnen.

6.) Nachdem das Datenpaket ausgesendet wurde, wird das TWINT Flag im TWCR gesetzt und das TWSR wird mit dem Statuscode geladen, der das erfolgreiche Aussenden des Datenpaketes signalisiert. Der Statuscode zeigt auch an, ob ein Slave das Datenpaket bestätigt (ACK) hat oder nicht.

7.) Die Applikationssoftware sollte nun den Wert des TWSR analysieren, um sicherzustellen, dass das Datenpaket erfolgreich übertragen und wie erwartet bestätigt wurde (ACK). Wenn dies nicht der Fall war, muss die Software eine Fehler-Routine ausführen. Wenn der Status-Code der erwartete ist, muss wieder ein spezieller Wert in das TWCR geschrieben werden, der die Hardware veranlasst, eine STOPP Bedingung zu übertragen. Welcher Wert genommen werden muss, wird später beschrieben. Wichtig ist, dass das TWINT Bit mit dem Schreiben des Wertes gesetzt wird. Das Schreiben einer 1 in das TWINT löscht dieses Flag. Das TWI startet keine Operation, solange das TWINT im TWCR gesetzt ist. Unmittelbar nachdem die Applikation das TWINT gelöscht hat, wird das TWI mit dem Aussenden der STOPP Bedingung beginnen. Man beachte, dass das TWINT Flag nach dem Senden einer STOPP Bedingung nicht gesetzt wird.

Auch wenn dieses Beispiel einfach ist, zeigt es den vollständigen Vorgang einer Übertragung, die zusammengefasst wie folgt abläuft:
  • Wenn das TWI eine Operation ausgeführt hat und eine Reaktion des Applikation erforderlich ist, wird das TWINT Flag gesetzt. Die SCL Leitung wird auf Low gehalten, bis das TWINT Flag gelöscht wird.
  • Wenn das TWINT Flag gesetzt ist, muss der User alle TWI Register mit den Werten laden, die für den nächsten TWI Bus Zyklus notwendig sind. Zum Beispiel muss das TWDR mit dem Wert geladen werden, der im nächsten Zyklus gesendet werden soll.
  • Nachdem alle TWI Register mit den neuen Werten beschrieben sind und alle anderen Aufgaben der Applikationssoftware erledigt sind, wird das TWCR beschrieben. Beim Beschreiben des TWCR muss das TWINT-Bit gesetzt sein. Das Schreiben einer 1 in das TWINT löscht dieses Flag, wodurch die TWI veranlasst wird, die Operation auszuführen, die im TWCR eingestellt ist.

Nachfolgend wird ein Assembler und C Beispiel für den Ablauf gegeben. Man beachte, dass der nachfolgende Code voraussetzt, dass vorher einige Definitionen durchgeführt wurden, z.B. durch Verwenden eines include-Files.
Beispielcode TWI Implementierung

Beispielcode TWI Implementierung


Impressum