Erkennung TWI Ende

Gast #578857
Hallo Gemeinde,

EIne I2C Stopp-Condition generiert man ja mit folgendem Code:
1
//-- send stop condition --------------------
2
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);

Aber wie kann ich jetzt feststellen, ob die Stop-Condition vollständig 
durchgeführt worden ist, also ob der Bus wieder frei ist und ich mit 
einer neuen Übertragung beginnen kann??

Vielen Dank im Voraus...
Gast #578917
"[...]TWINT is NOT set after a STOP condition has been sent."(atmega48 
datasheet "using the twi")
klingt schlecht

"When the STOP condition is executed on the bus, the TWSTO bit is 
cleared automatically" (selbes Datenblatt "register description")
klingt nach: Das TWSTO-Bit pollen
a`la:
1
while(TWCR & (1<<TWSTO));
2
//leserlicher:
3
while(TWCR & (1<<TWSTO)){
4
    }

hth. Jörg
#578971
Matthias wrote:

> Aber wie kann ich jetzt feststellen, ob die Stop-Condition vollständig
> durchgeführt worden ist, also ob der Bus wieder frei ist und ich mit
> einer neuen Übertragung beginnen kann??

Gar nicht.

Setze einfach das Startbit und gut.
Du kannst es sogar gleichzeitig mit dem Stopbit setzen.

Ein Start wird erst erzeugt, sobald der Bus als frei erkannt wurde.


Peter

Gast #578984
@  Peter Dannegger (peda):

Mir ist erst nach meinem Post die Frage eingefallen, ob man das 
überhaupt feststellen muss (und ich wollte nicht doppel-posten ;)
Gast #1556410
Peter Dannegger schrieb:
> Gar nicht.
>
> Setze einfach das Startbit und gut.
> Du kannst es sogar gleichzeitig mit dem Stopbit setzen.
>
> Ein Start wird erst erzeugt, sobald der Bus als frei erkannt wurde.
>
>
> Peter

Hmm... das hat bei mir nicht funktioniert.

Also genauer:

Ohne Prüfung ob das Stopbit nach dem Setzen wieder gelöscht wurde, führt 
das zu Fehlern in der Übertragung. (00 == Busfehler)

Wenn ich in einer while Schleife auf das Löschen des Bits warte ist das 
auch problematisch. Wenn man den Bus nämlich etwas "quält", kann es sein 
dass das Bit nie gelöscht wird. Vermutlich weil der Controller nicht in 
der Lage war die Stopcondition richtig zu generieren. Müsste das dann 
nicht wenigstens auch zu einem Busfehler führen?
#1556694
Ich habe die Doku zum TWI gerade nicht vorliegen.

Da ich aber gerade mit dem TWI herumgefluicht habe, hier meine 
Erfahrungen

Meines Wissens ist es nicht erforderlich nach dem TWI_STO-Befehl auf 
dessen Vollzug zu warten.

Was wohl geht, sind diese repeated-starts.

Ansonsten ist es meines Wissens illegal nach START und Senden der 
Baustein-adresse sofort wieder STOp zu senden.
Beim Emulieren wartet man dann beim nächsten START bis in alle Ewigkeit 
auf den Vollzug.

Ich hatte jüngst die Situation, dass ich bei der initialisierung auf das 
korrekte Vorhandensein aller TWI-bausteine testen wollte udn somit alle 
Adressen durchgetestet habe.
(Firma: privat) #1557578
Nicolas Nickisch schrieb:

> Meines Wissens ist es nicht erforderlich nach dem TWI_STO-Befehl auf
> dessen Vollzug zu warten.
>
> Was wohl geht, sind diese repeated-starts.

Richtig, das habe ich jetzt auch herausgefunden!
Wenn man TWSTA setzt bevor TWSTO zurückgesetzt wurde,
wird statt einer Startcondition eine repeated Startcondition
erzeugt. Also mit anderen Worten die Stopcondition "abgebrochen" bevor 
sie überhaupt auf dem BUS erscheint und stattdessen eine Startcondition
erzeugt.

> Ansonsten ist es meines Wissens illegal nach START und Senden der
> Baustein-adresse sofort wieder STOp zu senden.
> Beim Emulieren wartet man dann beim nächsten START bis in alle Ewigkeit
> auf den Vollzug.

Offenbar nicht nur beim Emulieren. TWSTO wird dann nämlich auch nicht 
mehr zurückgesetzt.
Das ist natürlich dann wie erwähnt etwas gefährlich, wenn man mit einer 
while Schleife darauf wartet.

> Ich hatte jüngst die Situation, dass ich bei der initialisierung auf das
> korrekte Vorhandensein aller TWI-bausteine testen wollte udn somit alle
> Adressen durchgetestet habe.


viele Grüße,
Klaus

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.