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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.