hdtvfreak,

es ist so wie linux_80 sagt: Der Sklave hat, wie früher zwischen Sklavenhaltern und Sklaven üblich , keinen Einfluss auf den Master; d.h. die TWI_INT-Flag im Master kann er nicht verändern. Er darf nur "Yes, Sir!" (=ACK) oder "No, Sir!" (=NACK) sagen. Umgekehrt kann der Master auch nicht die TWI_INT-Flag des Sklaven sehen.

Das Ablaufschema für die Betriebsart Master-Transmitter/Slave-Receiver geht etwas anders als Du's aufgestellt hast (siehe Seite 188 für den Master, Seite 191 für den Sklaven):

1. Master beginnt und sendet Startsequenz.
2. Alle am Bus angeschlossenen Sklaven gehen in "Hab-Acht"-Stellung und warten auf die Übermittlung der Sklaven-Adresse, die angesprochen werden soll. Bei keinem Sklaven wird der TWI_INT ausgelöst.
2. Beim Master löst der Abschluss der Startsequenz den TWI_INT aus. Das Zustandsbyte ist 0x08. Der Master reagiert auf darauf, indem er die Sklavenadresse mit R/W-Bit=0 sendet.
3. Wenn am Bus ein Sklave mit der gesendeten Adresse vorhanden ist, der sich im aktiven Wartezustand befindet (siehe Punkt 7), dann löst das Eintreffen der Adresse bei ihm den TWI_INT aus. Das Zustandsbyte ist 0x60 (weil das Read-Bit Null ist). Nur dieser Sklave reagiert darauf, indem er ACK sendet, alle anderen gehen weiter ihrer Beschäftigung nach. Wenn sich kein Sklave von der Adresse angesprochen fühlt, oder der angesprochene Sklave sich im passiven Wartezustand (siehe Punkt 7) befindet, dann wird die TWI-Datenleitung nicht auf Null gezogen und im Master wird das als NACK gewertet.
4. Sowohl ACK als auch NACK lösen beim Master den TWI_INT aus. Das Statusbyte ist 0x40 (Sklaven mit R/W-bit = 0 angesprochen, ACK empfangen) oder 0x38 (Sklaven mit R/W-Bit =0 angesprochen, NACK empfangen). Je nach Statusbyte reagiert der Master mit Abbruch (sendet STOP-Sequenz) oder mit dem Senden der Datenbytes.
5. Der angesprochene Sklave empfängt das erste Datenbyte. Nach Empfang des 8.Bits sendet der Sklave automatisch ACK an den Master. Danach wird beim Sklaven der TWI_INT ausgelöst, das Zustandsbyte ist 0x80. Je nachdem, ob er jetzt noch weitere Daten erwartet oder nicht, setzt oder löscht er das TWEA-Bit im Register TWCR.
6. Beim Master lösen ACK oder NACK den TWI_INT aus. Das Zustandsbyte ist 0x28 (wenn der Sklave ACK gesendet hat) oder 0x30 (wenn der Sklave NACK gesendet hat). Der Master reagiert darauf mit Senden weiterer Datenbytes (wenn noch welche zu senden übrig sind) oder mit Abbruch (sendet STOP-Sequenz, wenn keine Datenbytes mehr zu senden sind oder der Sklave durch das NACK angezeigt hat, dass er keine weiteren Datenbytes mehr gebrauchen kann).
7. Wenn der Sklave weitere Datenbytes empfängt, wiederholt sich der Ablauf wie bei 5. Wenn er eine STOP-Sequenz empfängt, dann wird bei ihm der TWI_INT ausgelöst. Das Zustandswort ist 0xA0. Je nach gewünschtem Verhalten kann er jetzt in den aktiven (empfangene Adressen werden auf Übereinstimmung mit eigener Adresse überprüft) oder passiven (empfangene Adressen werden nicht beachtet) Sklaven-Wartezustand übergehen, er kann für Rundrufe (General calls) empfänglich sein oder nicht usw. Ausserdem muss er jetzt anfangen, mit den empfangenen Daten irgendwas anzufangen.

Damit habe ich eigentlich nur ausführlich erzählt, was im Datenblatt in den Tabellen auf Seite 188 und Seite 191 dargestellt ist. Man muss die Tabellen erst zu lesen lernen und dafür wollte ich Dir ein Beispiel geben.

Das Schlechte an den vielen Zusammenhängen und Zustandsbytes ist, dass man leicht die Übersicht verliert. Das viel wichtigere Gute aber ist, dass man für jedes Zustandsbyte ein entsprechendes Dienstprogramm schreiben kann und dann eine TWI-Kommunikation erhält, die auf alles vorbereitet ist und die wie auf Schienen läuft. Es ist ein bisschen mühselig und aufwendig, aber nur einmal. Es lohnt, sich die Mühe zu machen.

Ciao

mare_crisium