Hallo
Ich habe einen STM32G0B1CBT6. Ich möchte damit einen "man in the middle" bei einer I2C Kommunikation realisieren:
(Source, Master) <------> (STM32, Slave)
(STM32, Master) <------> (Sink, Slave)
Sobald Source auf dem STM schreiben will, wird die Kommunikation per Clock stretch pausiert. Das von Source geschriebene Byte wird an Sink weiter geschickt. Der Slave verarbeitet dann die Daten. Wenn Source lesen will, wird nach Adressübertragung per Clock Stretch gewartet, die Daten von Slave gelesen und dann an Source übertragen.
Mein Problem ist, dass wenn der STM vom Master ein Byte empfängt ich noch nicht weiß, ob mit ACK oder NACK geantwortet werden soll. Diese Information ist erst vorhanden, wenn der STM das Byte an Sink weitergeleitet und ACK/NACK von Sink erhalten hat.
Auszug aus der Registerbeschreibung von CR2:
Bit 15 NACK: NACK generation (slave mode) The bit is set by software, cleared by hardware when the NACK is sent, or when a STOP condition or an Address matched is received, or when PE=0.
0: an ACK is sent after current received byte.
1: a NACK is sent after current received byte.
Das Verhalten ist genau wie beschrieben. Abhänging von dem Bit wird ein ACK oder NACK erzeugt. Das Problem ist nun, dass während des Transfers noch gar nicht bekannt ist, ob ACK oder NACK richtig ist. Nach den 8Bits müsste ein Clock Stretch für die Verarbeitung erfolgen und abhängig davon soll dann (N)ACK gesetzt werden.
Übersehe ich etwas oder ist es tatsächlich nicht möglich erst die Daten zu empfangen und dann zu entscheiden, ob ACK oder NACK gesetzt werden soll?
Vielen Dank.