Timeout bei I²C-Bus (TWI)

Gast #238906
Lesenswert?
• ▲
▼
Hallo,

ich steuere ein Touchscreen-Display mit einem AtMega 88 über den
I²C-Bus an. Ab und zu bleibt das Programm beim Warten auf das
TWINT-Flag hängen. Hab noch nicht rausgefunden, woran das liegt. Hab
den C-Code vom Atmel-Datenblatt verwendet:

// warten auf TWINT-Flag
// => Data wurde gesendet und ACK / NACK empfangen)
     while (! (TWCR & (1<<TWINT)))
  ;  // do nothing

Ich denke ich sollte an der Stelle noch irgend einen Timeout rein
machen. Kann man dafür eine ganz normale Schleife mit einem
8-Bit-Zähler verwenden?

Martin
Gast #1713419
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe ein ähnliches Problem. Ich arbeite mit einem XMega128, an den 4 
I2C-Porterweiterungs-ICs PCA9555 angeschlossen sind. Diese ICs schalten 
bzw. lesen über Optokoppler 24V-Spannungspegel. Die 24V-Spannung wird 
extern eingespeist. Die Erweiterungs-ICs werden aber von der internen 
Boardspannung gespeist, an der auch der XMega hängt.

Nun passiert immer wieder, wenn die externe 24V-Spannung ausgeschaltet 
und eingeschaltet wird, dass sich der XMega aufhängt. Er bleibt an der 
Programmzeile hängen, in der abgefragt wird ob die TWI-Übertragung 
abgeschlossen wurde. Dabei bleibt der Busszustand laut BUSSTATE-Bits auf 
BUSY stehen und RXACK-Bit, das ja den zuletzt empfangenen 
acknowledge-Bit anzeigt, ist gesetzt, es wurde folglich NACK empfangen.

Nun, das TWI-Modul im XMega hat ja die TIMOUT-Bits, die, wenn gesetzt, 
den Bus wieder in den IDLE-Zustand zurückbringen, wenn er "lange" 
inaktiv bleibt. Ich habe diese Bits jetzt auch gesetzt, aber das 
Programm bleibt trotzdem hängen und wartet bis der Bus wieder frei ist.

Veilleicht hatte ja jemand von euch ein solches Problem und könnte mich 
wissen lassen, wie er das gelöst hat. Ich wäre für die Hinweise seht 
dankbar!
Gast #1714303
Lesenswert?
• ▲
▼
Ich hab´ das gleiche Problem gehabt. Ich habe mir mit einem uint8_t 
einen timeout gebaut. Etwa so:


// wail until transmission completed and ACK/NACK has been received
  while(!(TWCR & (1<<TWINT)) && ++timeout);

Die while-Schleife sollte im Fehlerfall 255 mal bearbeitet werden, und 
dann rausspringen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.