Kommunikation zwischen zwei Mikrocontrollern mit SPI, I2C und einer Art Puffer?

Ich habe zwei Mikrocontroller, die beide ziemlich ausgereizt sind. MC1 muss MC2 ein 14-Bit-Messergebnis zur Verfügung stellen. MC1 kann mit SPI kommunizieren und MC2 kann mit I2c kommunizieren, aber sie arbeiten asynchron.

Gibt es eine Art einfachen IC, mit dem MC1 mithilfe von SPI einen Wert im IC speichern kann, und MC2 diesen Wert dann mithilfe von I2c nach Belieben des anderen lesen kann?

Dual-Port-RAM wird oft als Lösung für den Low-Level-Austausch angesehen. Wenn die Austauschrate nicht sehr hoch ist, bietet Dual-Port-i2c-FRAM (EEPROM) möglicherweise sogar Ihre Schnittstelle
Siehe CAT24C208 von ON als Beispiel für ein serielles i2c-EEPROM mit zwei Ports. Würde so etwas funktionieren? Wenn ja, kann ich als Antwort schreiben
Dual-Port kann auch mit einer anderen MCU ausgeführt werden, wie @MarcusMüller in seiner Antwort vorschlägt, siehe zum Beispiel dieses Entwicklungsboard: ti.com/tool/TIDA-00230
Scheint, als würde man es auf die harte Tour machen. Welche Ressourcen sind jeweils übrig. und welche bitrate brauchst du?
Nun, es gibt ultragünstige MCUs, die Bridge/Pufferung übernehmen können. Der kleinste MSP430 kommt mir in den Sinn, da es genau dafür einen Anwendungshinweis gibt, aber wahrscheinlich könnte ein TinyAVR oder irgendein M0 die Arbeit erledigen.
Warum sind I2C oder SPI die einzigen beiden Optionen? Wäre UART eine Option, sogar ein Bit-Bang-Software-UART?

Antworten (4)

Ich würde @Voltage Spike zustimmen, wahrscheinlich ist das Upgrade einer der beiden MCUs die einfachste Lösung.

Wenn es jedoch wirklich nur darum geht, Daten ein- und auszulagern, dann wäre das eine Aufgabe für eine andere MCU. Ich kann verstehen, dass Sie zögern würden, noch mehr Software auf ein Board zu bringen. Aber ehrlich gesagt, würde es sicherlich am einfachsten klingen, das SPI-Peripheriegerät auf dieser dritten MCU für DMA in einen großen Puffer und einen I²C-Handler einzurichten, um MC2 die neuesten Daten auf Abruf zu geben.

Beachten Sie, dass dies meines Erachtens tatsächlich dafür spricht, die Aufgabe von MC1 von der dritten MCU übernehmen zu lassen: Wenn das Datenvolumen gering genug ist, um es über I²C abzufragen, würde es keinen etwas modernen Cortex-M0+ zur Schnittstelle drängen mit jedem ADC, den Sie haben, oder übernehmen Sie einen wesentlichen Teil der Berechnung dieses 14-Bit-Werts.

Es wäre viel einfacher, eine MCU in einem anderen Paket mit besseren Fähigkeiten zu finden und eine vorhandene MCU aufzurüsten, als etwas dazwischen hinzuzufügen.

Eine andere Sache, die Sie vielleicht in Betracht ziehen sollten, ist die Suche nach Hardware-SPI- oder I2C-Peripheriegeräten, wenn Sie sie derzeit nicht verwenden (fast jede moderne MCU hat so etwas). Ein Hardware-SPI empfängt Informationen, speichert sie dann im Speicher, ohne den SPI abzufragen, und schaltet dann einen Interrupt um, damit Sie die Informationen abrufen können. Gleiches gilt für Hardware-I2C.

Wenn das Ihren Anforderungen nicht entspricht, könnte ein FPGA (wie im Gitterteil) für die von Ihnen beschriebene Schnittstelle verwendet werden, die jedoch viel schwieriger und zeitaufwändiger zu implementieren ist.

Es gibt I2C/SPI-Brücken mit eingebauten Puffern wie die SC18IS602B, die für diesen Zweck geeignet sein könnten.

Können Sie einen I2C-Master in Software auf MC1 implementieren? Du brauchst nur 2 GPIOs. Natürlich würde es einige Zeit dauern, aber wenn Ihre Übertragung kurz und selten genug ist, könnte es machbar sein.

Da I2C synchron ist und Sie die Master-Seite implementieren, haben Sie keine strengen Timing-Anforderungen. Sie könnten mit Ihrer Hauptprogrammschleife fortfahren, nachdem Sie jedes Bit gesetzt haben. In diesem Fall wären die Laufzeitanforderungen minimal, nur ein einziger Speicherbefehl für jedes Bit und ein Verzweigungsbefehl. Alternativ könnten Sie einen Timer-Interrupt so einstellen, dass er beispielsweise bei einer Frequenz von 100 kHz auslöst und jedes Bit im Interrupt überträgt. In diesem Fall hätten Sie mehr Overhead, da Sie den Interrupt betreten und verlassen müssen.

Wenn Sie es auch in Software auf MC2 implementieren (z. B. mit einem GPIO-Interrupt für den Taktleitungseingang), muss es nicht einmal I2C mit seinem Overhead für Startbedingung, Adresse usw. sein. Sie könnten die 14 Bit einfach seriell und synchron übertragen. Wenn Sie mehr als 2 GPIOs zur Verfügung haben, können Sie sogar mehrere Bits parallel übertragen.