Willst du direkt nach dem STOP wieder ein START schicken? Dann kannst du auch einen sogenannten "repeated start" machen. Das bedeutet, du sendest einfach wieder ein START, ohne davor ein STOP zu senden, so kann man z.B. die Addressierung ändern, ohne, dass der AVR die Kontrolle über den TWI-Bus evtl. an einen anderen µC verliert.
Falls du aber doch ein STOP senden willst, kannst du meines Wissens nach durch das Bit TWSTO im TWCR feststellen, ob STOP gesenden wurde. Dieses Bit wird ja gesetzt, um ein STOP zu senden. Und, wenn das Bit nicht mehr gesetzt ist, ist die Übertragung fertig.
Hi,
danke für die Antwort.
Ich möchte kein Repeated Start machen, sondern wirklich wissen, wann mein STOP fertig ist.
Ist da die Variante mit TWSTO wirklich richtig? Weil beim Start wartet man ja einfach ab, dass TWINT gesetzt wird. Beim STOP scheint(!) diese Variante aber nicht zu funktionieren.
edit: kleine Zwischenfrage: Sehe ich das richtig, dass ich bei nur einem Master kein STOP brauche, sondern nur Repeated Start einsetzen kann?
Gruß, CowZ
Ob sie wirklich richtig ist, weiß ich nicht, aber bei mir funktionierts damit.Ist da die Variante mit TWSTO wirklich richtig?
Beim STOP verwendet man ja auch nicht die Methode mit TWINT, sondern mit TWSTO.Weil beim Start wartet man ja einfach ab, dass TWINT gesetzt wird. Beim STOP scheint(!) diese Variante aber nicht zu funktionieren.
Ja, bei mir funktionierts auch
Die Frage, ob das "richtig" ist, bleibt natürlich. Könnte ja auch nur n netter workaround sein oder so. Aber trotzdem erstmal danke dafür
Gruß, CowZ
Das steht im Datenblatt des ATMega8 in der Definition des TWSTO-Bits im TWCR-Register.Writing the TWSTO bit to one in Master mode will generate a STOP condition on the Two-wire Serial Bus. When the STOP condition is executed on the bus, the TWSTO bit is cleared automatically.
Meiner Meinung nach stützt das unsere Vermutung.
Hallo,
hast Du da schon mal reingeguckt:
https://www.roboternetz.de/wissen/index.php/TWI_Praxis
da hab ich das durch setzen der Register gemacht.
Nach dem STOP warte ich nicht mehr, denn bis zum nächsten START, sollte es auf jeden Fall gesendet sein, solange das START nicht direkt gleich die Zeile danach kommt.
Ein STOP ist ja nur die beiden Leitungen loszulassen, kann man ja mal ausrechnen wieviel Takte der AVR macht, bis das geschehen ist.
Normalerweise fragt man das Statusregister ab nachdem TWINT gesetzt ist, und kann dann entscheiden was passiert ist, in Abhängigkeit was man eigentlich vor hatte.
Für STOP gibts aber keinen speziellen Status.
Steht auch nix besonderes im DB was passiert nach dem STOP.
Edit:
ich seh grad, das steht doch drin:
"Note that TWINT ist NOT set after a STOP condition has been sent."
Hi,
die Definition des TWSTO ist sehr hilfreich, danke
Nicht auf das Ende des Stops zu warten empfinde ich als "Katastrophe" Vorallem, da du dir nicht sicher sein kannst, mit welcher Geschwindigkeit der Bus läuft (da diese von den Slaves gedrosselt werden kann).
Daher ist die Lösung mit TWSTO wohl optimal Danke
Gruß, CowZ
Warum soll das eine Katastrophe sein,
wenn's so eilt ein Start auf ein STOP zu senden, kann man das doch auch gleich als ein Befehle machen, ist zumindest im AVR so vorgesehen !
Also gleichzeitiges setzen von TWSTO und TWSTA nach der letzten Aktion.
Ich denke es gibt auch nichts was ein abgesetztes STOP noch verhindern könnte.
Und in einem normalen Ablauf dauerts doch ein paar Takte, bis sich wieder entscheidet, das was gesendet werden soll, und da ist das Stop schon durch.
Chaos könnte dann nur noch passieren, wenn zB. in verschiedenen ISRs etwas am TWI gemacht wird, die sich nicht synchronisieren.
Hi
Manchmal kann man eben nicht wissen, ob im nächsten Takt schon wieder ein START kommt, oder eben nicht. Und daher sollte man imho auf das Ende des STOPS warten. Ob das nun irgendwas stört oder nicht, kann ich nicht einschätzen, aber ich finde es einfach unschön
Gruß, CowZ
Lesezeichen