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?
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.
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")
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
• 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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.