AVR I2C/TWI: wie sag ich als Slave dass ich busy bin?

OP (Firma: Brainit GmbH) #3158479
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?
OP (Firma: Brainit GmbH) #3159682
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
#3159835
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
OP (Firma: Brainit GmbH) #3159842
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren