Forum: Mikrocontroller und Digitale Elektronik AVR I2C/TWI: wie sag ich als Slave dass ich busy bin?


von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hallo zusammen,

ich hab grad ein kleines Verständnisproblem beim i2c-slave am AVR:

ich hab einen kleinen Adapter gebaut, der mit einem ATmega328P ein 
LCD-Display ansteuert, und diverse Kommandos und Daten per i2c empfängt.

Sobald ich per i2c ein Kommando kriege, führe ich dieses aus (z.B. 
zeichne eine Linie), der i2c-slave-receiver ist inzwischen für den 
Empfang des nächsten Kommandos bereit. Soweit, so gut.

Wenn ich nun aber immer noch mit der Verarbeitung des ersten Kommandos 
beschäftigt bin, das zweite Kommand bereits empfangen wurde und im 
Empfangsbuffer liegt, und in der Zwischenzeit ein drittes Kommando 
kommt, überschreibt mir das das zweite. Nicht so gut.

Auf der Master-Seite hab ich das soweit im Griff: Schicke ich ein SLA+W 
an mein Display, und krieg ein NAK, dann warte ich kurz und probiers 
nochmal.

Auf der Slave-Seite versteh ich nciht ganz, wie ich das angehen soll: 
ich hab ein Kommando (u.U. mehrere bytes) empfangen, dieses liegt im 
Empfangsbuffer. Momentan aktiviere ich den Slave-Mode wieder, was aber 
dazu führt dass ein allfälliges nächstes Kommando den Buffer wieder 
überschreibt.

Wie aktiviere ich den Slave so, dass er zwar am Bus lauscht, auf eine 
Adressierung als SLA+W aber mit NAK antwortet? (SLA+R darf positiv 
quittiert werden)

Wenn ich TWEA auf null setze, wird der Slave ja temporär komplett vom 
Bus getrennt?

Oder muss man die Adressierung sehr wohl mit ACK quittieren, aber das 
erste Datenbyte dann mit NAK?

von Wusel D. (stefanfrings_de)


Lesenswert?

Wenn ein Slave busy ist, hält er die Clock Leitung "fest" (auf Low). 
Dann kann der Master nicht takten.

Blöd ist nur, dass dadurch der ganze Bus blockiert wird.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Ja, aber das ist eine andere Art "busy": Die Clock-Leitung wird low 
gehalten, bis das einzelne Byte verarbeitet (sprich: in den 
Empfangspuffer geschoben) ist, falls der Slave dafür etwas länger als 
üblich braucht ("Clock Stretching")

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Hat keiner eine Idee?

Ich habs jetzt mal vorerst so gelöst, dass ich in der State Machine wenn 
ich das STOP vom Master bekomme (Übertragung beendet) ich TWEA auf 0 
setze, damit nicht mehr adressiert werden kann, solange bis der 
Empfangspuffer geleert ist.

Scheint verläßlich zu funktionieren, allerdings bin ich mir nicht sicher 
ob das die richtige Vorgehensweise ist...

Würd mich freuen wenn ein I2C-Experte noch was dazu sagen könnte...



Danke, Michi

von Peter D. (peda)


Lesenswert?

• Bit 6 – TWEA: TWI enable acknowledge bit

By writing the TWEA bit to zero, the device can be virtually 
disconnected from the 2-wire Serial
Bus temporarily. Address recognition can then be resumed by writing the 
TWEA bit to one
again.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Danke!

von Bernd M. (bernd_m)


Lesenswert?

Wie wäre es mit einem kleinen Protokoll:
Master fragt: wie isses dir?
Slave antwortet: "hab nix zu tun" oder "bin beschäftigt" oder "deine 
letzte Anweisung war grottenschlecht"

Kostet zwar etwas mehr auf dem I2C, aber du läufst nicht Gefahr, das dir 
Befehle durch Auslastung des Slaves verloren gehen. Bei der Gelegenheit, 
kannst du auch noch die Datenübertragung absichern.

Gruss,
Bernd

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Gute Idee, hilft aber nicht: Mein problem ist ja, dass der Slave im 
Moment gar keine Zeit bzw. keinen freien Puffer hat, um irgendwas (also 
z.B. auch die Abfrage "wie gehts dir?") zu verarbeiten.

Das ist eh hardwaremäßig sauber gelöst (ausbleiben des ACK) und 
funktioniert so wie ich es mir zusammengereimt und peter bestätigt hat.

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.