Schönen Sonntag allerseits,
ich stell mir gerade folgende zwei Fragen:
a) normalerweise wartet man bei der TWI-Programmierung auf dei
Fertigstellung einer Operation, indem man das TWINT-bit prüft:
1 | while (!(TWCR & (1 << TWINT)));
|
In Fleurys Library passiert das auch so, nicht aber beim Senden der
STOP-Condition, hier wird auf das TWSTO-Bit geprüft:
1 | while (!(TWCR & (1 << TWSTO)));
|
macht das einen Unterschied, oder ist es egal, und würde mit TWINT
genauso funktionieren?
Hintergrund: ich möchte in diese Warteschleife ein Timeout einbauen, und
dafür wäre es natürlich praktisch, wenn ich überall dieselbe
Warteschleife (also TWINT) verwenden könnte.
Womit wir schon bei Frage b) wären: gibts Erfahrungswerte über ein
sinnvolles Timeout? Das Timeout sollte so lang wie nötig aber natürlich
so kurz wie möglich sein. Ich möchte damit verhindern, dass Wackler,
an/abstecken im betrieb (passiert am Breadboard häufiger) und im
speziellen amoklaufende Slaves (die SDA und/oder SCL blockieren)
erkennen, und zumindest einen Fehler per UART ausgeben (momentan bleibt
er einfach in der Endlosschleife hängen)
Die eigentliche "last resort" Funktion zum harten Resetten des
I2C-Busses hab ich eh schon fertig (TWI abschalten, händisch 9 Clocks
ausgeben, händisch STOP erzeugen) nur aufrufen müsst ich sie halt
auch...