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

OP (Firma: Brainit GmbH) #3158479
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) #3158492
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")
OP (Firma: Brainit GmbH) #3159682
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
#3159810
• 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.
#3159835
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
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

Eine eigene Frage? Dieser Thread ist über 13 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.