22.   TWI: Serielles Zweidraht-Interface

Im nachfolgenden Abschnitt wird das serielle Zweidraht-Interface beschrieben.

22.1   Features

22.2   Bus-Definition

Das Two-wire Serial Interface (TWI) ist für typische Mikrocontrollerapplikationen ideal aufgebaut. Das TWI Protokoll erlaubt dem Systemdesigner mit bis zu 128 verschiedenen Bausteinen zu arbeiten, die lediglich über zwei Leitungen miteinander verbunden sind. Eine Leitung für den Takt (SCL) und eine Leitung für die Daten (SDA). Die einzige externe Hardware, die in den Bus implementiert werden muss, sind zwei Pullup-Widerstände für die beiden Busleitungen. Alle Bausteine, die an den Bus angeschlossen werden, haben eine individuelle Adresse, die Mechanismen zur Auflösung von Buskollisionen sind Bestandteil des Busprotokolls.
Bild 22-1: TWI-Bus-Verbindungen

22.2.1   TWI-Terminologie

Die folgenden Definitionen werden uns in den folgenden Abschnitten wiederholt begegnen:
Bezeichnung Beschreibung
Master Dieser Baustein startet und beendet eine Datenübertragung, der Master generiert außerdem den Takt SCL.
Slave Dieser Baustein wird durch den Master adressiert.
Sender Dieser Baustein legt die Daten auf den Bus.
Empfänger Dieser Baustein ließt die Daten von dem Bus.

22.2.2   Elektrischer Anschluss

Wie in obigem Abbild gezeigt, sind beide Busleitungen über die Pullup-Widerstände mit der positiven Versorgungsspannung verbunden. Die Bustreiber aller TWI-Bausteine sind open-drain oder open-collektor Treiber. Dies entspricht einer verdrahten UND-Funktion, die für die Arbeitsweise des Busses entscheidend ist. Ein Low-Pegel auf einer der Busleitungen wird erzeugt, indem einer oder mehrere TWI-Bausteine ihren Ausgang auf Low ziehen. Ein High-Pegel wird erzeugt, wenn alle Bausteine ihre Ausgänge in tristate versetzen, so dass die Pullup-Widerstände die Busleitungen auf High ziehen. Man beachte, dass allen AVR Bausteinen, die an den Bus angeschlossen werden, möglich sein muss, diese Busoperationen durchzuführen.

Die Anzahl der Bausteine, die an den Bus angeschlossen werden können, wird durch die maximale Buskapazität von 400 pF und den 7-bit Adressraum für die Slaves begrenzt. Eine detaillierte Beschreibung der elektrischen Eigenschaften des TWI ist weiter hinten enthalten. Dort sind die Spezifikationen für zwei verschiedene Busvarianten gegeben, eine für Busgeschwindigkeiten unterhalb von 100 kHz und eine für Busgeschwindigkeiten bis zu 400 kHz.

22.3   Rahmenformate

Im nachfolgenden Abschnitt wird die Datenübertragung mit dem TWI beschrieben.

22.3.1   Bits senden

Jedes Datenbit, das über den Bus übertragen wird, ist mit einem Puls auf der Taktleitung verbunden. Der Pegel der Datenleitung muss stabil sein, wenn die Taktleitung High ist. Die einzige Ausnahme von der Regel ist das Generieren einer Start- oder Stopp Bedingung.
Datenvalidierung TWI

22.3.2   Start- und Stopp-Bedingung

Der Master startet und beendet eine Datenübertragung. Die Übertragung wird gestartet, indem der Master eine Start Bedingung auf dem Bus erzeugt und beendet, indem der Master eine Stopp Bedingung auf dem Bus erzeugt. Zwischen einer Start und einer Stop Bedingung ist der Bus demzufolge belegt und kein anderer Master sollte versuchen die Kontrolle über den Bus zu übernehmen. Ein besonderer Fall tritt auf, wenn zwischen einer Start und einer Stopp Bedingung eine weitere Start Bedingung auftritt. Dies wird als Wiederholte Startbedingung bezeichnet und wird verwendet, wenn der Master eine neue Übertragung starten will, ohne vorher die Kontrolle über den Bus zu verlieren. Nach einer Wiederholten Start Bedingung ist der Bus weiterhin belegt, bis eine Stopp Bedingung auftritt. Dies ist identisch mit der normalen Start Bedingung und daher wird Start und Wiederholter Start im Folgenden allgemein als Start bezeichnet, spezielle Besonderheiten werden explizit erwähnt. Wie zuvor geschildert, werden die Start und Stopp Bedingungen dadurch signalisiert, dass sich der Pegel der SDA Leitung ändert, während die SCL Leitung High ist.
Start, erneuter Start und Stopp

22.3.3   Adressformat

Alle Adresspakete, die auf dem TWI-Bus übertragen werden sind 9-bit lang, bestehend aus 7-bit Adresse, einem READ/WRITE Bit und dem Bestätigungsbit (acknowledge, ACK). Wenn das READ/WRITE Bit gesetzt ist, wird eine Lese-Operation ausgeführt, wenn das Bit gelöscht ist, wird eine Schreiboperation durchgeführt. Wenn ein Salve erkennt, dass er adressiert wurde, so muss er im neunten Taktzyklus (SCL) die Datenleitung (SDA) auf Low ziehen. Wenn der Slave belegt ist oder aus einem anderen Grund die Anforderung vom Master nicht beantworten kann, so muss die SDA Leitung im neuntenTakt auf High bleiben. Der Master kann dann eine Stopp Bedingung generieren oder eine Wiederholte Start Bedingung ausführen um die Datenübertragung zu starten. Ein Adresspaket, das die Salveadresse und das Read oder Write Bit enthält wird als SLA+R bzw. SLA+W bezeichnet.

Das MSB der Adresse wird zuerst übertragen. Die Salveadressen können frei durch den Programmierer gewählt werden, allerdings ist die Adresse 0000 000 für einen Rundruf reserviert.

Wenn ein Rundruf ausgeführt wird, antworten alle Slaves indem sie die SDA Leitung im ACK Takt auf Low ziehen. Ein Rundruf wird verwendet, wenn der Master an alle Bausteine im System die gleiche Nachricht schicken will. Wenn die Rundrufadresse mit dem WRITE Bit auf den Bus ausgegeben wird, ziehen alle Slaves zum Bestätigen des Rundrufs die SDA Leitung im neunten Takt auf Low. Die folgenden Datenpakete werden dann von allen Slaves empfangen, die den Rundruf bestätigt haben. Man beachte, dass eine Rundrufadresse mit einem READ Bit unsinnig ist, da dies zu Kollisionen führen wird, wenn alle Slaves mit dem Aussenden unterschiedlicher Daten beginnen würden.

Alle Adressen mit dem Format 1111 xxx sind für zukünftige Verwendungen reserviert.

Adresspaket

22.3.4   Datenformat

Alle Datenpakete, die über den TWI-Bus übertragen werden, sind 9-Bit lang, acht Bit Daten und ein ACK Bit. Während des Datentransfers generiert der Master den Takt und die Start- Stop Bedingungen, während der Empfänger dafür verantwortlich ist, den Datenempfang zu bestätigen (ACK). Eine Bestätigung (ACK) wird durch den Empfänger dadurch signalisiert, indem er die SDA Leitung im neuten Takt auf Low zieht. Läßt der Empfänger die SDA Leitung im neunten Takt auf High, so wird eine Nichtbestätigung (NACK) signalisiert. Wenn der Empfänger das letzte Byte empfangen hat oder aus irgendwelchen Gründen keine weiteren Daten empfangen kann, teilt er dies dem Sender durch eine Nichtbestätigung (NACK) nach dem letzten Byte mit. Das MSB der Daten wird zuerst übertragen.
Datenpaket

22.3.5   Adressen und Daten gemischt

Eine Übertragung besteht grundsätzlich aus einer Start Bedingung, einer SLA+R/W Adresse, einem oder mehreren Datenpaketen und der Stopp Bedingung. Eine Leermeldung, bestehend aus einer Start und Stop Bedingung ist unzulässig. Man beachte, dass die verdrahtete UND-Funktion der SCL Leitung für das Aufbauen eines Handshake zwischen Master und Slave verwendet werden kann. Der Slave kann die Low-Periode der SCL Leitung verlängern, indem er diese auf Low ziegt. Dies ist nützlich, wenn die Taktgeschwindigkeit, die durch den Master erzeugt wird, zu hoch ist für den Slave und dieser mehr Zeit zum Verarbeiten der einzelnen Daten benötigt. Die verlängerte SCL Low-Periode beeinflusst nicht die High-Periode von SCL, die durch den Master bestimmt wird. Als Resultat kann der Slave also die TWI Datentransferrate reduzieren, indem er die Taktzeit von SCL verlängert.

Das nachfolgende Bild zeigt eine typische Datenübertragung. Man beachte, dass mehrere Datenbytes zwischen der SLA+R/W Adresse und der Stopp Bedingung übertragen werden können, dies ist abhängig von dem Softwareprotokoll, dass in der Applikation verwendet wird.

Typische Datenübertragung

22.4   Multi-Master-Bussystem

Das Busprotokoll erlaubt Bussysteme mit mehreren Mastern. Spezielle Dinge müssen geregelt werden, damit sichergestellt ist, dass ein Übertragungsprozess auch dann normal abläuft, wenn zwei oder mehrere Master zum gleichen Zeitpunkt eine Übertragung beginnen. Zwei Probleme können in Multi-Master Systemen auftreten: Die verdrahtete UND-Funktion der beiden Busleitungen wird verwendet, um diese beiden Probleme aufzulösen. Die seriellen Takte aller Master sind UND verknüpft, woraus sich ein Takt ergibt, dessen High-Periode durch den Master mit der kürzesten High-Periode bestimmt wird und dessen Low-Periode durch den Master mit der längsten Low-Periode bestimmt wird. Man beachte, dass alle Master die SCL Leitung abfragen, indem sie die High und Low Zeiten der Taktleitung SCL auszählen.
SCL-Synchromnisation
Das Schiedsgericht wird durch alle Master kontinuierlich durchgeführt, indem sie die SDA Leitung überwachen, nachdem sie Daten darauf ausgegeben haben. Wenn der Wert der Datenleitung SDA nicht mit dem Wert übereinstimmt, den ein Master ausgegeben hatte, so hat er das Schiedsgericht verloren. Man beachte, dass ein Master das Schiedsgericht nur dann verlieren kann, wenn er ein High auf die SDA Leitung ausgibt, während ein anderer Master diese Leitung auf Low zieht. Der unterlegene Master muss sofort in den Salve Modus gehen, um zu überprüfen, ob der durch den gewinnenden Master adressiert wurde. Die SDA Leitung sollte High bleiben, allerdings ist des dem unterlegenen Master erlaubt, bis zum Ende des laufenden Daten- oder Adresspaketes weiterhin das Taktsignal zu erzeugen. Das Schiedsgericht wird so lange fortgesetzt, bis nur ein Master übrig bleibt. Das kann viele Bits lang dauern. Wenn mehrere Master zeitgleich den gleichen Slave adressieren, so wird das Schiedsgericht während der Datenpakete fortgesetzt.
Schiedsgericht
Das Schiedsgericht ist nicht möglich zwischen: Es ist durch die Software des Anwenders sicherzustellen, dass diese ungültigen Schiedsgericht Bedingungen nicht auftreten können. Das bedeutet, dass in einem Multi-Master System alle Datenübertragungen die gleiche Zusammenstellung von SLA+R/W und den Datenpaketen haben müssen. Mit anderen Worten: Alle Übertragungen müssen die gleiche Anzahl von Datenpaketen haben, da andernfalls das Ergebnis des Schiedsgerichtes undefiniert ist.

22.5   Übersicht zum TWI-Modul

Das TWI Modul umfasst mehrere Untermodule, wie nachfolgend dargestellt. Auf alle Register, die in einer fetten Linie stehen, kann über den AVR Datenbus zugegriffen werden.
TWI Modul

22.6   TWI-Anwendung

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
  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:
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.

Assembler-BeispielC-BeispielAnmerkungen
1
 ldi  r16,(1<<TWINT)\
       | (1<<TWSTA)\
       | (1<<TWEN)
 out  TWCR, r16
TWCR = (1<<TWINT)
      |(1<<TWSTA)
      |(1<<TWEN);
Sende Start-Bedingung
2
wait1:
 in   r16,TWCR
 sbrs r16,TWINT
 rjmp wait1
while (!(TWCR & 
  (1<<TWINT)));
Warte bis TWINT-Bit gesetzt. Dann wurde die Startbedingung gesendet.
3
 in   r16,TWSR
 andi r16,0xF8
 cpi  r16,START
 brne FEHLER
if ((TWSR & 0xF8)
  != START)
    FEHLER();
Prüfe Inhalt des TWI-Statusregisters ohne die Vorteiler-Bits. Wenn nicht START dann FEHLER
 ldi  r16,SLA_W
 out  TWDR,r16 
 ldi  r16,(1<<TWINT)\
        | (1<<TWEN)
 out  TWCR, r16
TWDR = SLA_W;
TWCR = (1<<TWINT)
     | (1<<TWEN);
Lade SLA_W ins TWDR-Register. Lösche das TWINT-Bit im TWCR zum Absenden der Adresse
4
wait2:
 in   r16,TWCR
 sbrs r16,TWINT
 rjmp wait2
while (!(TWCR & 
  (1<<TWINT)));
Warte bis TWINT-Bit gesetzt. Dann wurde SLA+W abgesendet, und ACK oder NACK wurde empfangen.
5
 in   r16,TWSR
 andi r16,0xF8
 cpi  r16,MT_SLA_ACK
 brne FEHLER
if ((TWSR & 0xF8)
  != MT_SLA_ACK)
    FEHLER();
Prüfe Inhalt des TWI-Statusregisters ohne die Vorteiler-Bits. Wenn nicht MT_SLA_ACK dann FEHLER
 ldi r16,DATA
 out TWDR,r16       
 ldi r16,(1<<TWINT)\
       | (1<<TWEN)
 out TWCR,r16
TWDR = DATA;
TWCR = (1<<TWINT)
     | (1<<TWEN);
Lade Daten ins TWDR-Register. Lösche das TWINT-Bit im TWCR zum Absenden
6
wait3:
 in   r16,TWCR
 sbrs r16,TWINT
 rjmp wait3
while (!(TWCR & 
  (1<<TWINT)));
Warte bis TWINT-Bit gesetzt. Dann sind die Daten abgesendet und ACK oder NACK empfangen worden.
7
 in   r16,TWSR
 andi r16,0xF8
 cpi  r16,MT_DATA_ACK
 brne FEHLER
if ((TWSR & 0xF8)
  != MT_DATA_ACK)
    FEHLER();
Prüfe Inhalt des TWI-Statusregisters ohne die Vorteiler-Bits. Wenn nicht MT_DATA_ACK dann FEHLER
 ldi  r16,(1<<TWINT)\
        | (1<<TWEN)\
        | (1<<TWSTO)
 out  TWCR, r16 
TWCR = (1<<TWINT)
     | (1<<TWEN)
     | (1<<TWSTO);
Sende Stopp-Bedingung

22.7   Übertragungsmodi

Das TWI kann in vier verschiedenen Modi arbeiten. Diese werden als Master Transmitter (MT), Master Receiver (MR), Slave Transmitter (ST) und Slave Receiver (SR) bezeichnet. Verschiedene dieser Modi können in einer Applikation verwendet werden. Zum Beispiel kann der MT Modus verwendet werden, um Daten in ein TWI EEPROM zu schreiben und der MR um diese wieder auszulesen. Wenn weitere Master im System vorhanden sind, können von diesen Daten empfangen werden, wenn der SR Modus verwendet wird. Die Applikationssoftware entscheidet, welcher der Modi möglich ist.

Nachfolgend werden alle Modi beschrieben. Die möglichen Statuscodes sind in jedem Bild angegeben, die die Übertragung im Detail darstellen. In den Bildern werden folgende Abkürzungen verwendet:

S: START Bedingung
Rs: Wiederholte START Bedingung
R: Read Bit, Bit lesen (High Pegel auf SDA)
W: Write Bit, Bit schreiben (Low Pegel auf SDA)
A: Acknowledge Bit (Low Pegel auf SDA)
A: Not Acknowledge Bit (High Pegel auf SDA)
Data: 8-bit Datenbyte
P: STOPP Bedingung
SLA: Slave Adresse
Die Kreise in den Bildern kennzeichnen, wann das TWINT Flag gesetzt wird. Die Zahlen in den Kreisen zeigen den Statuscode an, der im TWSR steht, wobei die Vorteilerbits mit 0 maskiert sind. An diesen Stellen muss die Applikationssoftware eine Aktion ausführen, um die Übertragung fortzusetzen oder zu beenden. Die TWI Übertragung ist unterbrochen, bis das TWINT Flag durch die Software gelöscht wird.

Wenn das TWINT Flag gesetzt ist, bestimmt der Statuscode im TWSR, welche Aktion die Applikation als nächstes ausführen muss. Für jeden Statuscode sind die erforderlichen Aktionen und Details der folgenden seriellen Übertragung in den Tabellen angegeben. Auch in den Tabellen sind die Vorteilerbits mit 0 maskiert.

22.7.1   Master-Senden

Im Master Sende Modus wird eine Anzahl von Bytes an einen Slave Empfänger übertragen. Um in den Master Sende Modus zu gelangen, wird eine START Bedingung ausgesendet. Das Format des darauf folgenden Adresspaketes bestimmt, ob der Master Sende- oder der Master- Empfangs Modus ausgewählt wird. Wenn ein SLA+W Adresspaket ausgegeben wird, wird der Master Sende Modus ausgewählt, wenn ein SLA+R Adresspaket ausgegeben wird, erfolgt der Eintritt in den Master Empfangs Modus. Alle Statuscodes, die nachfolgend angegeben sind, unterstellen, dass die Vorteilerbits mit 0 maskiert sind.
Master Sende Modus
Eine START-Bedingung wird gesendet, wenn folgender Wert in das TWCR geschrieben wird.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X10X10X

TWEN muss gesetzt werden, um das TWI freizugeben. TWSTA muss auf eins gesetzt werden, um eine START Bedingung zu senden und TWINT muss mit einer 1 beschrieben werden, um das TWINT Flag zu löschen. Das TWI wird dann den TWI Bus überprüfen und eine START Bedingung senden, sobald der Bus frei wird. Nach dem Senden der START Bedingung wird das TWINT Flag durch die Hardware gesetzt und der Statuscode im TWSR wird auf 08h gesetzt. Um dann den Master Sende Modus zu aktivieren, muss anschließend ein SAL+W Adresspaket gesendet werden. Dies wird gemacht, indem eine SLA+W in das TWDR geschrieben wird. Anschließend muss das TWINT Bit gelöscht werden, indem eine 1 hineingeschrieben wird, um die Übertragung fortzusetzen. Es muss also folgender Wert in das TWCR geschrieben werden, um die Übertragung fortzusetzen.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X00X10X

Wenn das SLA+W Adresspaket gesendet und eine Bestätigung (ACK) empfangen wurde, so wird das TWINT Flag wieder gesetzt und der Stauscode im TWSR aktualisiert. Mögliche Statuscodes im Master Modus sind 18h, 20h oder 38h. Wie bei den unterschiedlichen Statuscodes weiter verfahren wird, ist in der Tabelle angegeben.

Wenn ein SLA+W Adresspaket erfolgreich gesendet wurde, kann als nächstes ein Datenpaket gesendet werden. Das Datenbyte wird dafür in das TWDR geschrieben. Das TWDR darf nur beschrieben werden, wenn das TWINT auf High ist. Andernfalls wird der Zugriff verworfen und das Schreibkollisions- (TWWC) Bit im TWCR Register gesetzt. Nach dem Aktualisieren des TWDR muss das TWINT Bit gelöscht werden (durch Beschreiben mit einer 1) um die Übertragung fortzusetzen. Es muss also folgender Wert in das TWCR geschrieben werden.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X00X10X

Dieser Vorgang wird wiederholt, bis das letzte Datenbyte gesendet ist und die Übertragung durch eine STOPP Bedingung oder eine Wiederholte START Bedingung beendet wird. Eine STOPP Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X01X10X

Eine Wiederholte START Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X10X10X

Statuskodes für Master-Senden
Status Code(TWSR); Prescaler Bits are 0 Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware Application Software Response Next Action Taken by TWI Hardware
To/from TWDR To TWCR
STASTOTWINTTWEA
0x08 A START condition has been transmitted Load SLA+W 001X SLA+W will be transmitted;
ACK or NOT ACK will be received
0x10 A repeated START condition has been transmitted Load SLA+W 001X SLA+W will be transmitted;
ACK or NOT ACK will be received
Load SLA+R 001X SLA+R will be transmitted;
Logic will switch to Master Receiver mode
0x18 SLA+W has been transmitted;
ACK has been received
Load data byte 001X Data byte will be transmitted and ACK or NOT ACK will be received
No TWDR action 101X Repeated START will be transmitted
No TWDR action 011X STOP condition will be transmitted and TWSTO Flag will be reset
No TWDR action 111X STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x20 SLA+W has been transmitted;
NOT ACK has been received
Load data byte 001X Data byte will be transmitted and ACK or NOT ACK will be received
No TWDR action 101X Repeated START will be transmitted
No TWDR action 011X STOP condition will be transmitted and TWSTO Flag will be reset
No TWDR action 111X STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x28 Data byte has been transmitted;
ACK has been received
Load data byte 001X Data byte will be transmitted and ACK or NOT ACK will be received
No TWDR action 101X Repeated START will be transmitted
No TWDR action 011X STOP condition will be transmitted and TWSTO Flag will be reset
No TWDR action 111X STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x30 Data byte has been transmitted;
NOT ACK has been received
Load data byte 001X Data byte will be transmitted and ACK or NOT ACK will be received
No TWDR action 101X Repeated START will be transmitted
No TWDR action 011X STOP condition will be transmitted and TWSTO Flag will be reset
No TWDR action 111X STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x38 Arbitration lost in SLA+W or data bytes No TWDR action 001X 2-wire Serial Bus will be released and not addressed Slave mode entered
No TWDR action 101X A START condition will be transmitted when the bus becomes free
Master senden Format

22.7.2   Master-Empfang

Im Master Empfänger Modus wird eine Anzahl von Bytes von einem Slave Sender empfangen. Um in den Master Empfänger Modus zu gelangen, wird eine START Bedingung ausgesendet. Das Format des darauf folgenden Adresspaketes bestimmt, ob der Master Sende oder Master Empfangs Modus ausgewählt wird. Wenn ein SLA+W Adresspaket ausgegeben wird, wird der Master Sende Modus ausgewählt, wenn ein SLA+R Adresspaket ausgegeben wird, erfolgt der Eintritt in den Master Empfangs Modus. Alle Statuscodes, die nachfolgend angegeben sind, unterstellen, dass die Vorteilerbits mit 0 maskiert sind.
Master Empfänger Modus
Eine START Bedingung wird gesendet, wenn folgender Wert in das TWCR geschrieben wird.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X10X10X

TWEN muss gesetzt werden, um das TWI freizugeben. TWSTA muss auf eins gesetzt werden, um eine START Bedingung zu senden und TWINT muss mit einer 1 beschrieben werden, um das TWINT Flag zu löschen. Das TWI wird dann den TWI Bus überprüfen und eine START Bedingung senden, sobald der Bus frei wird. Nach dem Senden der START Bedingung wird das TWINT Flag durch die Hardware gesetzt und der Statuscode im TWSR wird auf 08h gesetzt. Um dann den Master Empfänger Modus zu aktivieren, muss anschließend ein SAL+R Adresspaket gesendet werden. Dies wird gemacht, indem eine SLA+R in das TWDR geschrieben wird. Anschließend muss das TWINT Bit gelöscht werden, indem eine 1 hineingeschrieben wird, um die Übertragung fortzusetzen. Es muss also folgender Wert in das TWCR geschrieben werden, um die Übertragung fortzusetzen.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X00X10X

Wenn das SLA+R Adresspaket gesendet und eine Bestätigung (ACK) empfangen wurde, so wird das TWINT Flag wieder gesetzt und der Stauscode im TWSR aktualisiert. Mögliche Statuscodes in diesem Master Modus sind 38h, 40h oder 48h. Wie bei den unterschiedlichen Statuscodes weiter verfahren wird, ist in der Tabelle angegeben.

Die empfangenen Daten können aus dem TWDR Register ausgelesen werden, wenn das TWINT Flag durch die Hardware auf High gesetzt wird.
Dieser Vorgang wird wiederholt, bis das letzte Datenbyte empfangen ist. Danach muss der Master Empfänger den Slave Sender durch Senden einer Nichtbestätigung (NACK) darüber informieren, dass der Datenempfang nun abgeschlossen werden kann. Die Übertragung wird dann beendet, indem eine STOPP Bedingung oder eine Wiederholte START Bedingung erzeugt wird.

Eine STOPP Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X01X10X

Eine Wiederholte START Bedingung wird erzeugt, indem folgender Wert in das TWCR geschrieben wird.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert1X10X10X

Nach einer Wiederholten START Bedingung (Status 10h) kann das TWI erneut auf den selben Slave zugreifen oder auf einen anderen Slave, ohne eine STOPP Bedingung auszusenden. Eine erneute START-Bedingung ermöglicht das Umschalten zwischen verschiedenen Slaves oder Master Empfänger und Sender Modus, ohne die Kontrolle über den Bus zu verlieren.

Statuskodes für Master-Empfang
Status Code(TWSR); Prescaler Bits are 0 Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware Application Software Response Next Action Taken by TWI Hardware
To/from TWDR To TWCR
STASTOTWINTTWEA
0x08 A START condition has been transmitted Load SLA+R 001X SLA+R will be transmitted
ACK or NOT ACK will be received
0x10 A repeated START condition has been transmitted Load SLA+R 001X SLA+R will be transmitted
ACK or NOT ACK will be received
Load SLA+W 001X SLA+W will be transmitted
Logic will switch to Master Transmitter mode
0x38 Arbitration lost in SLA+R or NOT ACK bit No TWDR action 001X 2-wire Serial Bus will be released and not addressed Slave mode will be entered
No TWDR action 101X A START condition will be transmitted when the bus becomes free
0x40 SLA+R has been transmitted; ACK has been received No TWDR action 0010 Data byte will be received and NOT ACK will be returned
No TWDR action 0011 Data byte will be received and ACK will be returned
0x48 SLA+R has been transmitted;
NOT ACK has been received
No TWDR action 101X Repeated START will be transmitted
No TWDR action 011X STOP condition will be transmitted and TWSTO Flag will be reset
No TWDR action 111X STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
0x50 Data byte has been received;
ACK has been returned
Read data byte 0010 Data byte will be received and NOT ACK will be returned
Read data byte 0011 Data byte will be received and ACK will be returned
0x58 Data byte has been received;
NOT ACK has been returned
Read data byte 101X Repeated START will be transmitted
Read data byte 011X STOP condition will be transmitted and TWSTO Flag will be reset
Read data byte 111X STOP condition followed by a START condition will be transmitted and TWSTO Flag will be reset
Master Empfang Formate

22.7.3   Slave-Empfang

Im Slave Empfänger Modus werden eine Anzahl von Bytes von einem Master Sender empfangen. Alle Statuscodes die nachfolgend verwendet werden, untsertellen, dass die Vorteilerbits mit 0 maskiert sind.
Slave Empfänger Modus
Um den Slave Empfänger Modus einzuschalten, müssen das TWAR und TWCR wie folgt initialisiert werden.

TWARTWA6TWA5TWA4TWA3TWA2TWA1TWA0TWGCE
WertChip-interne Slave-Adresse

Die oberen 7 Bits bilden die Adresse, über die das TWI durch einen anderen Master angesprochen werden kann. Wenn das TWGCE Bit gesetzt ist, wird der Baustein auch durch einen Rundruf angesprochen, andernfalls ignoriert er Rundrufe.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert0100010X

TWEN muss auf 1 gesetzt werden, um das TWI freizugeben. Das TWEA Bit muss auf eins gesetzt werden, um das Bestätigen der eigenen Salve-Adresse oder eines Rundrufes freizugeben. TWSTA und TWSTO müssen auf 0 gesetzt werden.

Wenn TWAR und TWCR initialisiert sind, wartet das TWI bis es durch die eigene Salve Adresse (oder einen Rundruf, wenn freigegeben) gefolgt von dem Datenrichtigs Bit adressiert wurde. Wenn das Richtungsbit 0 ist (Write), arbeitet das TWI im Slave Empfänger Modus, andernfalls wird der Slave Sender Modus eingeschaltet. Nachdem die eigene Slave Adresse und das Write Bit empfangen wurden, wird das TWINT Flag gesetzt und ein gültiger Statuscode kann aus dem TWSR gelesen werden. Der Statuscode wird verwendet, um die folgende Aktion der Software zu bestimmen. Die möglichen Aktionen der Software sind für die unterschiedlichen Statuscodes in der nachfolgenden Tabelle beschrieben. Der Slave Empfänger Modus wird auch eingeschaltet, wenn der Baustein das Schiedsgericht im Mastermodus verloren hat (siehe Status 68h und 78h).

Wenn das TWEA während einer Übertragung gelöscht wird, wird das TWI eine Nichtbestätigung (NACK) auf der SDA Leitung zurückgeben, nachdem das nächste Datenbyte empfangen wurde. Dies kann dazu benutzt werden, um zu signalisieren, dass der Slave keine weiteren Daten mehr empfangen kann. Während TWEA auf Null ist, wird das TWI die eigene Slave Adresse nicht bestätigen. Der TWI Bus wird aber weiterhin überwacht, so dass der Adressvergleich jederzeit durch Setzen des TWEA Bits wieder eingeschaltet werden kann. Das bedeutet, dass das TWEA Bit dazu verwendet werden kann, das TWI vorübergehend vom Bus zu isolieren.

In allen Sleep Modi außer dem Idle Modus wird das Taktsystem des TWI ausgeschaltet. Wenn das TWEA Bit gesetzt ist, kann der Baustein weiterhin seine eigene Slave Adresse oder einen Rundruf bestätigen, indem er den Takt des TWI-Busses als Taktquelle verwendet. Der Baustein wird dann aufwachen und das TWI hält die SCL Leitung so lange auf Low, bis das Auwachen abgeschlossen ist und das TWINT Flag gelöscht wird (durch Beschreiben mit einer 1). Der weitere Datenempfang verwendet dann wieder die normalen AVR Takte. Man beachte, dass, wenn der AVR auf eine lange Aufwachzeit eingestellt ist, die SCL Leitung ebenfalls lange auf Low gehalten wird und dadurch andere Datenübertragungen blockiert werden.

Man beachte, dass das TWDR nach dem Aufwachen aus dem Sleep Modus nicht das letzte Byte enthält, das auf dem Bus präsent war.

Statuskodes für Slave-Empfang
Status Code(TWSR); Prescaler Bits are 0 Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware Application Software Response Next Action Taken by TWI Hardware
To/from TWDR To TWCR
STASTOTWINTTWEA
0x60 Own SLA+W has been received;
ACK has been returned
No TWDR action X010 Data byte will be received and NOT ACK will be returned
No TWDR action X011 Data byte will be received and ACK will be returned
0x68 Arbitration lost in SLA+R/W as Master; own SLA+W has been received; ACK has been returned No TWDR action X010 Data byte will be received and NOT ACK will be returned
No TWDR action X011 Data byte will be received and ACK will be returned
0x70 General call address has been received; ACK has been returned No TWDR action X010 Data byte will be received and NOT ACK will be returned
No TWDR action X010 Data byte will be received and ACK will be returned
0x78 Arbitration lost in SLA+R/W as Master; General call address has been received; ACK has been returned No TWDR action X010 Data byte will be received and NOT ACK will be returned
No TWDR action X011 Data byte will be received and ACK will be returned
0x80 Previously addressed with own SLA+W; data has been received;
ACK has been returned
Read data byte X010 Data byte will be received and NOT ACK will be returned
Read data byte X011 Data byte will be received and ACK will be returned
0x88 Previously addressed with own SLA+W; data has been received;
NOT ACK has been returned
Read data byte 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
Read data byte 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
Read data byte 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
Read data byte 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
0x90 Previously addressed with general call; data has been received; ACK has been returned Read data byte X010 Data byte will be received and NOT ACK will be returned
Read data byte X011 Data byte will be received and ACK will be returned
0x98 Previously addressed with general call; data has been received; NOT ACK has been returned Read data byte 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
Read data byte 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
Read data byte 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
Read data byte 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
0xA0 A STOP condition or repeated START condition has been received while still addressed as Slave No action 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
Formate und Zustände bei Slave-Empfang

22.7.4   Slave-Senden

Im Slave Sender Modus werden eine Anzahl von Datenbytes an den Master Empfänger gesendet. Alle Statuscodes die nachfolgend verwendet werden, unterstellen, dass die Vorteilerbits mit 0 maskiert sind.
Slave Sender Modus
Um den Slave Sender Modus einzuschalten, müssen das TWAR und TWCR wie folgt initialisiert werden.

TWARTWA6TWA5TWA4TWA3TWA2TWA1TWA0TWGCE
WertChip-interne Slave-Adresse

Die oberen 7 Bits bilden die Adresse, über die das TWI durch einen anderen Master angesprochen werden kann. Wenn das TWGCE Bit gesetzt ist, wird der Baustein auch durch einen Rundruf angesprochen, andernfalls ignoriert er Rundrufe.

TWCRTWINTTWEATWSTATWSTOTWWCTWEN-TWIE
Wert0100010X

TWEN muss auf 1 gesetzt werden, um das TWI freizugeben. Das TWEA Bit muss auf eins gesetzt werden, um das Bestätigen der eigenen Salve-Adresse oder eines Rundrufes freizugeben. TWSTA und TWSTO müssen auf 0 gesetzt werden.

Wenn TWAR und TWCR initialisiert sind, wartet das TWI bis es durch die eigene Salve Adresse (oder einen Rundruf, wenn freigegeben) gefolgt von dem Datenrichtigs Bit adressiert wurde. Wenn das Richtungsbit 1 ist (Read), arbeitet das TWI im Slave Sender Modus, andernfalls wird der Slave Empfänger Modus eingeschaltet. Nachdem die eigene Slave Adresse und das Read Bit empfangen wurden, wird das TWINT Flag gesetzt und ein gültiger Statuscode kann aus dem TWSR gelesen werden. Der Statuscode wird verwendet, um die folgende Aktion der Software zu bestimmen. Die möglichen Aktionen der Software sind für die unterschiedlichen Statuscodes in der nachfolgenden Tabelle beschrieben. Der Slave Sender Modus kann auch eingeschaltet werden, wenn der Baustein das Schiedsgericht im Mastermodus verloren hat (siehe Status B0h).

Wenn das TWEA während einer Übertragung gelöscht wird, wird das letzte Byte der Übertragung übertragen. Danach treten die Statuscodes C0h oder C8h auf, abhängig davon, ob der Master Empfänger das letzte Byte mit einem NACK oder ACK bestätigt. Das TWI schaltet in den nicht adressierten Slave Modus um und ignoriert den Master, falls dieser die Übertragung weiter fortsetzen will. Daher empfängt der Master alle seriellen Daten als 1. Status C8h wird eingeschaltet wenn der Master weitere Daten abruft (durch Senden eines ACK) auch wenn der Slave das letzte Byte gesendet hat (TWEA null und erwartetem NACK vom Master).

Während TWEA auf Null ist, wird das TWI die eigene Slave Adresse nicht bestätigen. Der TWI Bus wird aber weiterhin überwacht, so dass der Adressvergleich jederzeit durch Setzen des TWEA Bits wieder eingeschaltet werden kann. Das bedeutet, dass das TWEA Bit dazu verwendet werden kann, das TWI vorübergehend vom Bus zu isolieren.

In allen Sleep Modi außer dem Idle Modus wird das Taktsystem des TWI ausgeschaltet. Wenn das TWEA Bit gesetzt ist, kann der Baustein weiterhin seine eigene Slave Adresse oder einen Rundruf bestätigen, indem er den Takt des TWI-Busses als Taktquelle verwendet. Der Baustein wird dann aufwachen und das TWI hält die SCL Leitung so lange auf Low, bis das Aufwachen abgeschlossen ist und das TWINT Flag gelöscht wird (durch Beschreiben mit einer 1). Der weitere Datenempfang verwendet dann wieder die normalen AVR Takte. Man beachte, dass, wenn der AVR auf eine lange Aufwachzeit eingestellt ist, die SCL Leitung ebenfalls lange auf Low gehalten wird und dadurch andere Datenübertragungen blockiert werden.

Man beachte, dass das TWDR nach dem Aufwachen aus dem Sleep Modus nicht das letzte Byte enthält, das auf dem Bus präsent war.

Statuskodes für Slave-Senden
Status Code(TWSR); Prescaler Bits are 0 Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware Application Software Response Next Action Taken by TWI Hardware
To/from TWDR To TWCR
STASTOTWINTTWEA
0xA8 Own SLA+R has been received; ACK has been returned Load data byte X010 Last data byte will be transmitted and NOT ACK should be received
Load data byte X011 Data byte will be transmitted and ACK should be received
0xB0 Arbitration lost in SLA+R/W as Master; own SLA+R has been received; ACK has been returned Load data byte X010 Last data byte will be transmitted and NOT ACK should be received
Load data byte X011 Data byte will be transmitted and ACK should be received
0xB8 Data byte in TWDR has been transmitted; ACK has been received Load data byte X010 Last data byte will be transmitted and NOT ACK should be received
Load data byte X011 Data byte will be transmitted and ACK should be received
0xC0 Data byte in TWDR has been transmitted; NOT ACK has been received No TWDR action 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
No TWDR action 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
No TWDR action 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
No TWDR action 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
0xC8 Last data byte in TWDR has been transmitted (TWEA = “0”); ACK has been received No TWDR action 0010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA
No TWDR action 0011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”
No TWDR action 1010 Switched to the not addressed Slave mode;
no recognition of own SLA or GCA;
a START condition will be transmitted when the bus becomes free
No TWDR action 1011 Switched to the not addressed Slave mode;
own SLA will be recognized;
GCA will be recognized if TWGCE = “1”;
a START condition will be transmitted when the bus becomes free
Formate und Zustände beim Slave-Senden

22.7.5   Sonstige Zustände

Es gibt zwei Stati, die nicht mit einem definierten Zustand des TWI korrespondiern.

Status F8h zeigt an, dass keine relevanten Informationen vorliegen, weil das TWINT Flag nicht gesetzt ist. Dies tritt zwischen anderen Stati auf und wenn der TWI nicht an der seriellen Übertragung beteiligt ist.

Status 00h zeigt an, dass ein Busfehler während einer TWI Übertragung aufgetreten ist. Ein Busfehler tritt auf, wenn eine START oder STOPP Bedingung an einer ungültigen Position in dem Frameformat auftritt. Beispiele für solche ungültigen Positionen sind während des seriellen Übertragens eines Adresspaketes, eines Datenbytes oder Bestätigungs Bits. Wenn ein Busfehler auftritt, wird TWINT gesetzt. Um den Busfehler wieder zu beseitigen, muss das TWSTO Flag gesetzt und das TWINT Flag durch Beschreiben mit einer 1 gelöscht werden. Dies zwingt das TWI in den Modus eines nicht adressierten Slaves und löscht das TWSTO Flag, andere Bits im TWCR werden nicht beeinflusst. Die SDA und SCL Leitung werden freigegeben allerdings wird keine STOPP Bedingung gesendet.

Sonstige Zustände
Status Code(TWSR); Prescaler Bits are 0 Status of the 2-wire Serial Bus and 2-wire Serial Interface Hardware Application Software Response Next Action Taken by TWI Hardware
To/from TWDR To TWCR
STASTOTWINTTWEA
0xF8 No relevant state information available; TWINT = “0” No TWDR action No TWCR action Wait or proceed current transfer
0x00 Bus error due to an illegal START or STOP condition No TWDR action 011X Only the internal hardware is affected, no STOP condition is sent on the bus. In all cases, the bus is released and TWSTO is cleared.

22.7.6   Kombination diverser TWI-Modi

In einigen Fällen müssen verschiedene TWI Modes kombiniert werden, um die gewünschte Aktion auszuführen. Dies kann z.B. beim Lesen eines seriellen EEPROMs der Fall sein. Gewöhnlich läuft ein solcher Transfer wie folgt ab:
  1. Übertragung initialisieren
  2. Dem EEPROM mitteilen, von welcher Speicherzelle gelesen werden soll
  3. Lesen der Speicherzelle
  4. Beenden der Übertragung
In diesem Fall werden also Daten vom Master zum Slave und vom Slave zum Master übertragen. Um dem Slave mitzuteilen, von welcher Speicherzelle gelesen werden soll, ist der Master Sende Modus erforderlich. Beim Lesen der Daten ist hingegen der Master Empfangs Modus erforderlich. D.h. die Richtung der Datenübertragung muss zwischendurch umgeschaltet werden. Der Master muss während allen Schritten die Kontrolle über den TWI Bus behalten und die Schritte müssen in einer zusammenhängenden Operation durchgeführt werden. In einem System mit mehreren Mastern kann ein anderer Master den Datenzeiger des EEPROM zwischen Schritt 2 und 3 verändern und der erste Master liest die falsche Speicherzelle. Ein Wechsel der Übertragungsrichtung muss also durch eine Wiederholte START Bedingung zwischen dem Senden der Speicheradresse und dem Empfangen der Daten vorgenommen werden. Mit der Wiederholten START Bedingung behält der Master die Kontrolle über den Bus. Die nachfolgende Abbildung zeigt den Vorgang.
Mehrere TWI-Zustände bei Zugriff auf seriellen EEPROM

22.8   Multi-Master Systeme und Schiedsgericht

Wenn mehrere Master an denselben Bus angeschlossen sind, kann eine Übertragung zeitgleich von zwei oder mehreren Mastern begonnen werden. Der TWI Standard stellt sicher, dass solche Situationen so gehandhabt werden, dass nur einem Master erlaubt wird, seine Arbeit fortzusetzen und keine Daten verloren gehen. Ein Beispiel für eine Schiedsgericht-Situation ist nachfolgend beschrieben, in der zwei Master versuchen, Daten an einen Slave Empfänger zu übertragen.
Schiedsgericht-Situation
Folgende Szenarien können während des Schiedsgerichtes auftreten:
Zusammengefasst sind hier noch einmal die verschiedenen Möglichkeiten aufgezeigt, die Werte der möglichen Statuscodes sind in den Kreisen angegeben.
Statuscodes Schiedsgericht

22.9   Register-Beschreibung

  TWBR – TWI-Bitraten-Register

Bit76543210
(0xB8)TWBR7TWBR6TWBR5TWBR4TWBR3TWBR2TWBR1TWBR0TWBR
ZugriffR/WR/WR/WR/WR/WR/WR/WR/W
Startwert00000000
Diese Bits wählen den Teilungsfaktor für den Bitratengenerator. Der Bitratengenerator ist ein Frequenzteiler, der im Master-Modus die Frequenz für den SCL-Takt erzeugt.

  TWCR — TWI-Kontrollregister

Das TWCR wird verwendet, um die Arbeit des TWI zu kontrollieren. Es wird verwendet, um den TWI freizugeben, um einen Masterzugriff durch Aussenden einer Start-Bedingung zu beginnen, um die Emfangsbestätigung zu erzeugen, um eine Stopp-Bedingung zu erzeugen und um den Takt anzuhalten, während die Daten, die auf den Bus geschrieben werden sollen, in das TWDR Register geschrieben werden. Es zeigt ebenfalls eine Schreibkollision, wenn versucht wird, Daten in das TWDR zu schreiben, während dieses Register nicht ansprechbar ist.

Bit76543210
(0xBC)TWINTTWEATWSTATWSTOTWWCTWEN-TWIETWCR
ZugriffR/WR/WR/WR/WR/WR/WRR/W
Startwert00000000
Diese Bits wird durch die Hardware gesetzt, wenn das TWI seinen laufenden Job beendet hat und auf eine Antwort der Applikationssoftware wartet. Wenn das I-Bit im SREG und das TWIE-Bit im TWCR gesetzt sind, springt die MCU zu dem TWI Interrupt Vektor. Während das TWINT Flag gesetzt ist, wird der SCL Takt auf Low gehalten. Das TWINT Flag wird nicht automatisch durch die Hardware gelöscht, wenn der Interrupt ausgeführt wird. Das Flag muss vielmehr durch die Software gelöscht werden, indem es mit einer logischen 1 beschrieben wird. Das Löschen des Flags startet die Arbeit des TWI wieder, daher müssen alle Zugriffe auf das TWI Address Register (TWAR), das TWI Status Register (TWSR) und das TWI Data Register (TWDR) vorher abgeschlossen sein. Diese Bits kontrolliert das Erzeugen des Empfangsbestätigungs-Pulses. Wenn das TWEA-Bit mit einer 1 beschrieben ist, so wird ein ACK-Puls erzeugt, wenn eine der folgenden Bedingungen zutrifft:
  1. Die Slaveadresse des Bausteins wurde empfangen
  2. Ein Rundruf wurde empfangen während das TWGCE Bit im TWAR gesetzt war
  3. Ein Datenbyte wurde im Master- oder Slave-Modus empfangen.
Durch Setzen dieses Bits auf Null kann der Baustein vorübergehend virtuell vom Bus getrennt werden. Die Adresserkennung kann dann wieder freigegeben werden, indem das Bit wieder auf 1 gesetzt wird. Die Applikation schreibt das TWSTA Bit auf 1, wenn sie Master über den TWI Bus werden will. Die TWI Hardware überprüft, ob der Bus frei ist und erzeugt eine Start-Bedingung, wenn der Bus frei war. Wenn der Bus nicht frei war, wartet die TWI bis eine Stopp-Bedingung erkannt wird, und erzeugt dann eine neue Start-Bedingung, um die Kontrolle über den Bus zu übernehmen. Das TWSTA muss durch die Software gelöscht werden, wenn die Start-Bedingung gesendet wurde. Wenn das TWSTO Bit im Master Modus auf eins gesetzt wird, wird eine Stopp-Bedingung auf dem TWI-Bus erzeugt. Nach dem Erzeugen der Stopp-Bedingung wird das TWSTO Bit automatisch gelöscht. Im Slave-Modus kann das Setzen des TWSTO Bits verwendet werden, um aus einer Fehlersituation zurückzukehren. Dadurch wird zwar keine Stopp-Bedingung auf dem Bus erzeugt, allerdings kehrt das TWI in einen definierten Zustand zurück. Dieses Bit wird gesetzt, wenn versucht wird in das TWI Data Register (TWDA) zu schreiben, während das TWINT Flag Low ist. Das TWWC Flag wird gelöscht, wenn in das TWDA geschrieben wird, während TWINT High ist. Das TWEN Bit gibt das TWI frei und aktiviert das TWI Interface. Wenn das TWIEN Bit auf Eins gesetzt ist, übernimmt das TWI die Kontrolle über die I/O-Pins, die mit SDA und SCL verbunden sind, und gibt die Übertragungsratenverzögerung und die Spitzenfilter frei. Wenn das TWEN Bit auf Null gesetzt wird, wird das TWI ausgeschaltet und alle Übertragungen werden abgebrochen, unabhängig davon, ob diese bereits beendet sind oder nicht. Dieses Bit ist reserviert und wird immer als 0 gelesen. Wenn dieses Bit auf 1 gesetzt ist und das I-Bit im SREG ebenfalls 1 ist, wird der TWI Interrupt so lange ausgeführt, wie das TWINT Flag High ist.

  TWSR – TWI-Statusregister

Bit76543210
(0xB9)TWS7TWS6TWS5TWS4TWS3-TWPS1TWPS0TWSR
ZugriffRRRRRRR/WR/W
Startwert11111000
Diese 5 Bits geben den Status der TWI Logik und des TWI Busses wieder. Die verschiedenen Status Kodes werden auf den Seiten weiter hinten beschrieben. Man beachte, dass der Wert, der aus dem TWSR gelesen wird, neben den 5 Status Bits immer auch die 2 Bits des Vorteilers enthält. Die Applikationssoftware muss die unteren 2 Bits also auf Null maskieren, wenn die Statusbits geprüft werden sollen. Dadurch wird die Statusprüfung der Vorteilerbits unabhängig. Diese Vorgehensweise wird auch in diesem Datenblatt unterstellt. Dieses Bit ist reserviert und wird immer als 0 gelesen. Diese Bits können gelesen und geschrieben werden. Sie bestimmen den Wert des Vorteilers.
TWPS1TWPS0Wert des Vorteilers
001
014
1016
1164
Die Berechnung der Bitrate ist auf den Seiten zuvor beschrieben.

  TWDR – TWI-Datenregister

Bit76543210
(0xBB)TWD7TWD6TWD5TWD4TWD3TWD2TWD1TWD0TWD
ZugriffR/WR/WR/WR/WR/WR/WR/WR/W
Startwert11111111
Im Sendemodus enthält das TWDR das nächste Byte, das gesendet wird. Im Empfangsmodus enthält das TWDR das letzte Byte, das empfangen wurde. Das Register ist beschreibbar, solange das TWI nicht mit dem Schieben eines Bytes beschäftigt ist, was durch das Setzen des TWI Interrupt Flag (TWINT) durch die Hardware angezeigt wird. Man beachte, dass das Data Register nicht initialisiert werden kann bevor der erste Interrupt auftritt. Die Daten im TWI bleiben so lange stabil, wie das TWINT gesetzt ist. Während die Daten rausgeschoben werden, werden die Daten auf dem Bus gleichzeitig reingeschoben. Das TWDR enthält immer das letzte Byte, das auf dem Bus präsent war. Außer nach dem Aufwachen aus einem Sleep-Modus durch dem TWI Interrupt. In diesem Fall ist der Inhalt des TWDR unbestimmt. Im Falle eines verlorenen Schiedsgerichtes gehen keine Daten während des Überganges vom Master in den Slave Modus verloren. Das Handhaben des ACK Bits wird durch die TWI Logik automatisch kontrolliert, die CPU kann nicht direkt auf das ACK Bit zugreifen. Diese 8 Bits enthalten das nächste zu sendende Byte oder das letzte empfangene Byte.

  TWAR — TWI-Adressregister (Slave)

Bit76543210
(0xBA)TWA6TWA5TWA4TWA3TWA2TWA1TWA0TWGCETWAR
ZugriffR/WR/WR/WR/WR/WR/WR/WR/W
Startwert11111111
Die oberen 7 Bits des TWAR können die 7-bit Slave Adresse enthalten, unter der das TWI angesprochen wird, wenn es als Slave Empfänger oder Sender arbeitet. Im Master Modus werden diese Bits nicht benötigt. Im Multi Master Modus muss eine Adresse angegeben werden, damit der Baustein von einem anderen Master als Slave adressiert werden kann.

Das LSB des TWAR wird verwendet, um das Erkennen eines Rundrufes freizugeben. Der verbundene Adressvergleicher überprüft, ob die empfangene Adresse mit der Slave-Adresse (oder der Rundrufadresse) übereinstimmt. Wenn dies der Fall ist, so wird eine Interruptanforderung erzeugt.

Diese 7 Bits enthalten die Slaveadresse des Bausteins. Wenn dieses Bit gesetzt ist, ist das Erkennen eines Rundrufes freigegeben.

  TWAMR – TWI-Adressmasken-Register (Slave)

Bit76543210
(0xBD)TWAM[6:0]-TWAMR
ZugriffR/WR/WR/WR/WR/WR/WR/WR
Startwert00000000
Mit diesen Bits können einzelne Bits beim Adressvergleich via TWAR ausgenommen werden. Ein gesetztes TWAM-Bit deaktiviert den Adressvergleich für das korrespondierende TWA-Bit.
Beispiel: Der Mikrocontroller ist als I²C-Slave auf den Adressen 0x50 (Schreibadresse 0xA0) und 0x58 (Schreibadresse 0xB0) aufweckbar, wenn TWA auf 0xA1 (oder 0xB1) und TWAM auf 0x10 gesetzt wird.
Logik des TWI-Adressvergleichs, Blockschaltbild
Dieses Bit sollte Null bleiben.