STM32F4 I2C (N)ACK

OP #7658788
Lesenswert?

moin,

folgendes muss ich mit I2C auf einen STM32F4 reasisieren:

Master Slave

Adddr

1
  ACK

Steuerung

1
  ACK

FüllByte

1
  (N)ACK

Auf NACK kommt ein STOP. Bei ACK geht es weiter.

Mit dem lesen des Datenregisters wird ja die nächste Datenübertragung ausgelöst und die Einstellung von ACK gespeichert.

Ob ACK oder NACK kann aber erst nach auslesen des DR festgestellt werden.

Kennt jemand einen Trick, wie ich das DR lesen kann OHNE die nächste Datenübertragung auszulösen?

Danke.

VG Peter

Gast #7660666
Lesenswert?

Wastl schrieb:

Schreib lieber mal in Klartext was du eigentlich erreichen willst.

Das hat er getan.

Sein Slave soll nach dem Lesen eines empfangenen Bytes entscheiden, ob er das mit ACK oder NACK beantworten will. Wer STM32 kennt, der weiß dass das dort nicht so einfach geht, weil man das ACK/NACK Flag schon vor dem Empfang des betroffenen Bytes festlegen muss.

Kennt jemand einen Trick, wie ich das DR lesen kann OHNE die nächste Datenübertragung auszulösen?

Ich habe das zum Glück so noch nicht gebraucht. In meinem konkreten Fall konnte ich einfach ein weiteres (dummy) Byte empfangen und dieses dann mit NACK beantworten.

Ich bin gespannt, ob es dafür eine "saubere" Lösung gibt.

OP #7662375
Lesenswert?

moin,

wenns so nicht geht, baut man sich ein eigenes DR.

Dazu auf den SCL einen EXTI Interrupt mit steigender Flanke setzen.

Nach I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED , die Pause zwischen 1.( ADDR ) und 2.( 1.Daten-) Byte, wird ein Counter auf 8 gesetzt.

Mit einem DummyRead des DR wird das 2. Byte gestartet.

Nun löst jeder SCL einen INT aus. Dieser rotiert SDA in eine Variable...mein DR.

@ Steve sauber genug?

VG Peter

OP #7662390
Lesenswert?

Hi Steve,

im Prinzip ist es die Nachbildung des Lesens in der I2C Unit.

So wie die HW den Datenstrom von SDA per SCL in ein Register reinschiebt.

Ich klemme mich auf SDA/SCL und greife die Daten ab. Meine ISR schieb SDA in eine Varible mit dem selben Wert wie DR. Somit kann ich vor lesen des I2C-DR schon feststellen was kommt und kann (N)ACK wie gefordert setzen.

Mein Problem ist damit gelöst.

VG Peter

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