Ich habe 2 MCUs und möchte sie über einen I2C-Bus miteinander verbinden. MCU1 ist der Controller, während MCU2 das Ziel ist. Nur diese 2 MCUs sind auf dem Bus. Diese Konfiguration ist fest und ich kann sie nicht ändern.
Es gibt 2 Szenarien. Im ersten Szenario befinden sich nur MCU1 und MCU2 am Bus, während in einem zweiten Szenario einige zusätzliche I2C-Geräte ebenfalls an diesen gemeinsamen Bus angeschlossen sind.
Mein Hauptzweck, sie wie oben zu verbinden, besteht darin, Daten von MCU2 (Ziel) an MCU1 (Controller) zu senden.
Was ich bisher über I2C verstehe, ist, dass es sich um ein Befehlsantwortprotokoll handelt. Der Controller gibt den Zielen Befehle, und dann antworten die Ziele auf diesen Befehl und senden ihre Daten an den Controller. Die Ziele können ihre Daten nicht selbst senden, ohne vorher den Befehl erhalten zu haben.
Wenn der Controller 32 Datenbytes vom Ziel empfangen möchte, welchen Befehl sendet er dann an das Ziel und wie bestätigt das Ziel dann, dass es den gültigen Befehl zum Senden von Daten erhalten hat? Ich denke, dies wird als "Blockmodus" -Datenübertragung bezeichnet.
Meine Zieladresse ist auf 0x08 festgelegt.
Glücklicherweise oder leider liegt es an Ihnen, ein Protokoll für dieses Szenario zu entwickeln, da Sie beide Seiten kontrollieren. Wie Sie sagen, kann der Slave nur auf vom Master initiierte Übertragungen reagieren. Ihr Master muss dann den Slave abfragen (in einem wiederkehrenden Zeitplan nach Daten fragen), es sei denn, Sie haben eine andere Möglichkeit für den Slave, zu kommunizieren, wenn die Daten bereit sind. (Letzteres wird üblicherweise mit einer separaten Interrupt-Leitung gelöst.) Master und Slave müssen sich beide auf eine spezielle Antwort einigen, wenn der Slave noch keine Daten verfügbar hat. Auch der Slave muss seine Antwort auf diesen „keine Daten“-Wert zurücksetzen, nachdem er vom Master abgefragt wurde, um zu vermeiden, dass dieselben Daten zweimal gesendet werden.
Der einfachere Weg wäre, die Rollen von Master und Slave zu tauschen, sodass der Master das Senden von Daten an den Slave initiiert.
Wenn Sie auch mit anderen Slaves auf demselben I2C-Bus kommunizieren müssen, sind Sie jedoch eingeschränkt, welches Gerät der Master sein kann, es sei denn, Sie verwenden den Multi-Master-Modus von I2C.
Welche bestimmten I2C-API-Aufrufe erforderlich sind, hängt davon ab, welches Gerät und welche HAL Sie verwenden. Auf physikalischer Ebene handelt es sich um ein vom Master initiiertes „I2C-Lesen“, bei dem der Master nach dem Senden der Slave-Adresse 32 Bytes liest.
Foxrider83
Alt-Rose