Forum: Mikrocontroller und Digitale Elektronik I2C Flusskontrolle?


von Thomas (Gast)


Lesenswert?

Hallo,

ich habe erfolgreich eine I2C Kommunikation zwischen einem 
Xmega256(Master) und einem mega32(Slave) aufbauen können. Weiterhin 
funktioniert master_read, master_write und auch master_writeread.

Nun möchte ich mittels master_writeread dem Slave 4byte senden. Der 
Slave wertet diese Bytes aus und schreibt dann entsprechend neue 
Daten(10Byte) in den Sendepuffer.

Da der Master aber sofort Daten empfangen möchte kann es vorkommen, dass 
der Slave noch nicht alle Daten in seinem Sendepuffer aktualisiert hat 
und daher der Master zwar etwas empfängt aber eben nicht die aktuellsten 
Daten.

Wie würde sich so etwas umsetzen lassen?

Gruß
Thomas

von Oliver (Gast)


Lesenswert?

Warten?

Oliver

von Michael (Gast)


Lesenswert?

Puffern

von Thomas (Gast)


Lesenswert?

Also erst nur master_write dann delay_ms(1) und dann erst master_read ?

von Klaus 2. (klaus2m5)


Lesenswert?

Der Slave muss nach dem ACK-Bit SCL low halten (clock stretching), 
solange er noch mit der Vorbereitung der Sendung beschäftigt ist.

Bevor der Master weitere Clocks sendet, muss er prüfen, ob SCL high ist.

von Thomas (Gast)


Lesenswert?

Kann ich das nicht auch irgendwie lösen dass ich in meinem TWI-Interupt 
ein I2C Statusflag überprüfe und dann entsprechend das senden von ACK 
bzw. NACK beeinflusse.

Das I2C Statusflag wird in der Hauptschleife dann zu beginn der 
Datenaufbereitung auf FALSE gesetzt und nachdem alle Daten im 
Sendepuffer sind auf TRUE gesetzt.

Würde soetwas irgendwie gehen?

von Klaus 2. (klaus2m5)


Lesenswert?

TWI beachtet clock-stretching automatisch. Du darft nur auf der 
Slave-Seite TWINT=1 erst setzen, wenn die Lese-Daten zur Verfügung 
stehen.

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.