Forum: Mikrocontroller und Digitale Elektronik TWI: Theoriefrage - Übertragung Slave->Master sauber beenden?


von Emanuel B. (movergan)


Lesenswert?

Hallo zusammen!

Beim erlernen des TWI und meinen ersten Versuchen stellt sich mir doch 
eine Frage theoretischer Art, die mir noch keiner beantworten konnte:

Mein Slave (µC) will eine dem Master unbekannte Anzahl Bytes zum Master 
(auch µC) übertragen. Wie geht das überhaupt? Wie kann diese Übertragung 
sauber beendet werden, so dass der Slave alle Daten übertragen hat und 
auch weiß, dass alle Daten beim Master angekommen sind?

Der Master kann nach jedem Byte ein ACK oder NACK senden, jenachdem ob 
er bereit ist weitere Bytes zu empfangen. Sofern die Übertragung korrekt 
ablaufen soll und es keine technischen Probleme gibt, müsste der Master 
immer ein ACK geben, da er nicht wissen kann, ob weitere Bytes folgen. 
Der Slave kann zwar ein letztes Byte senden, womit er nur seine eigenen 
Zustände beeinflusst, aber der Master weiß davon nichts und quittiert 
dieses wieder mit ACK. Dann steigt der Slave aus, weil er keine Daten 
mehr hat und der Master würde nun afaik endlos 0b11111111 empfangen, 
weil er nicht merkt, dass niemand mehr Daten auf den Bus legt.

Die Datenblätter geben mir jedenfalls Rätsel auf, wie das funktionieren 
soll. Und die Artikel auf Mikrocontroller.net lassen hier scheinbar 
bewusst Lücken offen (s.u.).

Das Datenblatt vom Mega8 sagt auf S. 189 in der Tabelle: "Last data byte 
will be transmitted and NOT ACK should be received". Diese Aktion kann 
ich durch entsprechende Registerbelegung ausführen. Warum sollte ein 
NACK empfangen werden? Woher soll der Master wissen, dass er nun das 
letzte Byte bekommt? Im Abschnitt Master-Receiver (MR) steht nichts 
dazu.

Oder der Artikel zum TWI auf Mikrocontroller.net:
Bei den Erläuterungen zum MR-Mode wird beschrieben, wie die einzelnen 
Bytes empfangen und quittiert werden und dass das beliebig oft gemacht 
werden kann. Direkt im nächsten Satz steht da plötzlich "Nachdem das 
letzte Byte empfangen wurde, kann der Master dem Slave durch senden von 
NACK klar machen, dass keine Daten mehr erwartet werden.". Woher soll 
der Master denn wissen, dass das gerade das letzte Byte war? Genau meine 
Frage. Wird dort nicht erklärt.
Im Abschnitt zum Slave Transmitter steht auch nur "Wird TWEA während 
eines Transfers gesetzt, wird das aktuelle Byte noch fertig gesendet und 
Status 0xC0 oder 0xC8 tritt ein, je nachdem ob der Master ACK oder NACK 
nach dem letzten Byte gesendet hatte. Das TWI wird in einen 
Blockierzustand gehen, unabhängig davon, ob der Master den Transfer 
fortsetzt. So erhält der Master nur noch '1' auf dem seriellen Bus. 
Status 0xC8 tritt ein, wenn der Master weitere Daten fordert (durch 
Senden von ACK), obwohl der Slave bereits das letzte Byte gesendet hat 
(TWEA '0' und erwartet NACK)". Hier wird ebenfalls nicht klar, warum der 
Master sich jetzt nicht in einer endlosen Empfangsschleife festsetzt und 
endlos viele Bytes mit dem Inhalt 0b11111111 empfängt.


Wäre auf jeden Fall total nett, wenn mir das einer erklären kann. Meiner 
bisherigen Ansicht nach hab ich nur zwei Möglichkeiten:
1. Master bricht irgendwann den Empfang ab, hat dann aber keine Ahnung, 
ob er schon alle Daten hat oder nicht. Das kann es nicht sein!
2. Slave muss zuerst mal die Anzahl der noch folgenden Daten 
übermitteln, was meiner Ansicht nach funktionieren sollte aber ein 
Workaround ist, der das Problem nicht löst.

Wie kann ich also eine dem Master unbekannte Anzahl Bytes geschlossen 
(d.h. zusammenhängend) vom Slave zum Master senden?

Schönen Abend,
Movergan

von Volker S. (volkerschulz)


Lesenswert?

Emanuel B. schrieb:
> Wäre auf jeden Fall total nett, wenn mir das einer erklären kann. Meiner
> bisherigen Ansicht nach hab ich nur zwei Möglichkeiten:
> 1. Master bricht irgendwann den Empfang ab, hat dann aber keine Ahnung,
> ob er schon alle Daten hat oder nicht. Das kann es nicht sein!
> 2. Slave muss zuerst mal die Anzahl der noch folgenden Daten
> übermitteln, was meiner Ansicht nach funktionieren sollte aber ein
> Workaround ist, der das Problem nicht löst.

Das waere kein "Workaround", das waere die Spezifikation Deines 
Uebertragungsprotokolls. Dieses wird durch die Benutzung des TWI nicht 
festgelegt, es werden lediglich die "Rahmenbedingungen" geschaffen. Eine 
andere Moeglichkeit waere ein Stop-Byte, also ein bestimmtes Byte, das 
im eigentlichen Datenstrom nicht vorkommt, und nur das Ende der 
Uebertragung signalisiert. Oder eben eine feste Anzahl an Bytes 
(Paketlaenge), die bei jeder Anfrage gesendet werden.

Der Master hat natuerlich nach wie vor das Recht, eine laufende 
Uebertragung zu stoppen. Damit muss auch der Slave klarkommen.


> Wie kann ich also eine dem Master unbekannte Anzahl Bytes geschlossen
> (d.h. zusammenhängend) vom Slave zum Master senden?

Eben unter Verwendung eines zuvor definierten Protokolls.


Volker

von Matthias L. (Gast)


Lesenswert?

Meineswissens ist I2C so ausgelegt, dass der Master weiß, wieviele Bytes 
er jetzt beim Slave auslesen will. Da er das in deinem Fall offenbar 
nicht tut, so kannst du doch einfach als erstes Datenbyte/word die 
Anzahl der (folgenden) zu erwartenden Bytes einfach mitgeben. So kann 
der Master mitzählen und weiß, ab wann der Slave keine Daten  mehr hat.

Bekommt er also als ersten Datenbyte/word, also als Anzahl, eine Null, 
so kann er die Übertragung beenden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.