Multi-Master-SPI-Modus? Oder eine intelligente Möglichkeit, nur die Zeit zwischen zwei Mastern umzuschalten?

Ich habe ein LCD-Display, das von einem ziemlich leistungsstarken Mikro mit GPU und allem möglichen Zeug gespeist wird. Es stellt sich jedoch heraus, dass das Booten des Kerns über 5 Sekunden dauert. Aus Sicht der Benutzererfahrung sind 5 Sekunden, um nach dem Einschalten ein Startbild / eine Animation auf dem Bildschirm zu sehen, nicht akzeptabel.

Also dachte ich daran, ein separates, sehr billiges Mikro einzubauen, das die Master-Leitung für die ersten paar Sekunden halten und das Boot-Up-Image liefern kann. Es würde dann den SPI-Bus an das Hauptmikro übergeben.

Dies ist natürlich nicht der einzige Anwendungsfall des kleineren Mikros. Ich würde es auch für die gesamte Hintergrundbeleuchtung verwenden. Das größere Mikro geht möglicherweise in einen Ruhezustand und ich möchte, dass das kleinere Mikro das Display weiterhin eingeschaltet lässt. (Im Grunde teilt das Hauptmikro dem kleinen Mikro einfach mit, welche Helligkeit eingeschaltet bleiben soll, und eine Standardhelligkeit, falls das Hauptmikro schläft).

Gibt es eine Möglichkeit, das kleine Mikro für die ersten 5 Sekunden als Master zu halten und dann für den Rest der Zeit auf das Hauptmikro loszulassen (und es als Bonus an das kleine Mikro zurückzugeben, wenn das Hauptmikro in den Ruhezustand übergeht? )?

Danke!

Nur um das klarzustellen: SPI ist die Kommunikationsmethode zwischen den beiden Mikros, ebenso wie mit LCD, richtig? Haben Sie irgendwelche Ersatz-IOs auf dem kleinen Mikro und dem Hauptmikro, die verwendet werden können, um zwischen ihnen zu signalisieren?
Nun, ich werde SPI zwischen dem LCD und dem Hauptmikro und dem LCD und dem kleinen Mikro haben. Die Kommunikation zwischen dem kleinen Mikro und dem Hauptmikro wird höchstwahrscheinlich so etwas wie UART oder I2C sein. Würde das alles komplizierter machen?

Antworten (4)

Das Hauptproblem besteht hier wahrscheinlich darin, keinen geeigneten MUX auszuwählen - die meisten analogen Schalter werden wahrscheinlich funktionieren. Sondern wie man "GPU" und "MCU" synchronisiert. Da die MCU die meiste Zeit sprechen sollte, außer wenn die GPU übernimmt, sollte es ruhig sein.

Die GPU kann die SPI-Drähte nicht einfach nach Belieben durchtrennen, da dies eine laufende SPI-Übertragung korrumpieren würde. Dies kann sehr schlimme Nebenwirkungen haben, wenn die MCU beim Schreiben von Befehlen an das Display unterbrochen wird.

Sie können dies lösen, indem Sie die beiden Geräte die /SS-Leitungen des anderen abhören lassen und dies als Mittel zur "Schlichtung" verwenden.

GPU:

  • Wenn /SS line out von der MCU auf Low gezogen wird, bleiben Sie während der laufenden Übertragung ruhig.
  • Wenn /SS von der MCU hoch geht, schnappen Sie sich den Bus, indem Sie eine SPI-Übertragung starten und dadurch /SS von der GPU nach unten ziehen.

MCU:

  • Überprüfen Sie vor dem Starten einer SPI-Übertragung die /SS-Leitung von der GPU.
  • Wenn die /SS-Leitung von der GPU hoch ist, können wir senden.
  • Wenn die /SS-Leitung von der GPU niedrig ist, gehen Sie für eine bestimmte Zeit in den Passivmodus/Ruhezustand, bevor Sie es erneut überprüfen.

MUX:

  • Verdrahten Sie es so, dass die beiden unterschiedlichen /SS-Leitungen als Kanalauswahl verwendet werden und die Quelle von MOSI und CLK bestimmen. (MISO sollte für die meisten Displays nicht benötigt werden.) Entweder durch Finden eines geeigneten Schalters oder durch Invertieren des Signals eines der Master durch BJTs oder ähnliches.
  • Sie können die MCU /SS vielleicht rezessiv machen, indem Sie sie über einen 10k-Pull-Widerstand anschließen, sodass die GPU /SS sie überschreiben kann, ohne dass zwei Ausgänge konkurrieren. Ich nehme an, es gibt viele Möglichkeiten, dies zu lösen.
Ich bin das früher durchgegangen und mir wurde gesagt, dass keine Änderungen an der Platine mit der GPU vorgenommen werden können. Diese Platine verwendet Pegelumwandlungspuffer, und daher ist die SS-Leitung, die von hier zur LCD-Platine kommt, in eine Richtung gerichtet. Die GPU hätte also keine Möglichkeit zu sehen, ob die MCU die Leitung niedrig oder hoch gezogen hat. Also muss ich Ihre letzte Aussage mit dem HLP verwenden, das die MCU überschreibt.
@HassanNasir Sie müssen die GPU-Karte nicht ändern, nur die GPU-Firmware. Der MUX, Pegelwandler, Polaritätsumschalter usw. können auf einer Platine zwischen GPU-Platine und LCD-Platine platziert werden. Wenn die GPU jedoch nicht auf /SS hören kann, sehe ich nicht, wie Sie dies gut zum Laufen bringen können. Sie erhalten Anzeigestörungen, wenn die GPU die MCU unterbricht.
Anstatt auf die /SS-Leitung zu hören (was aufgrund von Pegelumwandlungspuffern nicht möglich ist), könnte es die i2c-Schnittstelle mit dem kleinen Mikro verwenden, um es zu überprüfen, bevor etwas gesendet wird?
@HassanNasir Einfach einen bidirektionalen Pegelwandler verwenden? 74HCT245 oder ähnlich.
Der Pegelwandler befindet sich auf der Platine mit dem Hauptmikro, der nicht verändert werden kann. Der Wechsel zu einem bidirektionalen Konverter würde zusätzliche Kosten verursachen, was es noch schwieriger machen würde, solche Änderungen vorzunehmen.

Es wäre wahrscheinlich am einfachsten, ein "kleines Mikro" auszuwählen, das zwei SPI-Schnittstellen hat. Verwenden Sie einen als Master, um das Display anzusteuern, und den anderen als Slave, der an das "große Mikro" angeschlossen ist.

Dann kann die Firmware Ihres kleinen Mikros entscheiden, ob sie die Transaktionen des großen Mikros an das Display weiterleitet oder ihre eigenen Befehle sendet.

Beachten Sie, dass das Senden von Daten an das Display auf diese Weise unkompliziert ist. Aber wenn das große Mikro etwas vom Display zurücklesen soll, ist etwas mehr Überlegung erforderlich.

Ist das möglich? Das Hauptmikro wird seine GPU verwenden, um mehrere Animationen mit einer hohen Bildrate an das LCD zu senden. Ich schätze, dass das kleinere Mikro zu diesem Zeitpunkt keine Verarbeitung durchführt, aber kann es immer noch als Medium zum Senden der SPI-Befehle fungieren? Ich nehme an, es sollte funktionieren, solange genügend Bandbreite auf dem SPI-Bus vorhanden ist?
Vielleicht nicht. Um ehrlich zu sein, bevor ich anfing, Hardware-Lösungen in Betracht zu ziehen, würde ich mir die Boot-Sequenz des großen Mikros genau ansehen, also sehen, ob nicht frühzeitig etwas Code eingefügt werden könnte, um das Display zu initialisieren und Ihren aufzustellen Splash-Bild. Was ist das überhaupt für ein Prozessor? Ich habe noch nie von einer GPU gehört, die an SPI ausgibt.
Das habe ich auch bedacht, als ich meine Antwort geschrieben habe. Es ist die einfachste Lösung, hat aber bestenfalls eine Latenz von 1 SPI-Frame. SPI zu LCD ist oft auch ziemlich schnell, so dass Sie die Daten möglicherweise "DMA-durch" führen müssen. Wenn diese Art von Verzögerung akzeptabel ist, dann ist dies die einfachste Lösung.

Der direkte Weg, um das zu implementieren, was Sie wollen, besteht darin, einige Schaltkreise zwischen den Prozessoren und dem Display einzufügen. Diese Schaltung kann zwei Formen annehmen:

  1. Verwenden Sie einen vier Bit breiten Multiplexer-Chip, der die vier SPI-Steuerleitungen (SPI_CS, SPI_CLK, MISO, MOSI) für jeden der beiden Master zur Anzeigeschnittstelle MUXen kann. Die Auswahlsteuerung für den MUX würde von Ihrer kostengünstigen MCU kommen.
  2. Verwenden Sie zwei separate 4 Bit breite Tristate-Puffer, um eine Master-Schnittstelle oder die andere zur SPI-Schnittstelle auf dem Display auszuwählen. Normalerweise würde für beide Master derselbe Teil verwendet, und daher wären zwei Steuerleitungen von der kostengünstigen MCU erforderlich, um den Tri-State der beiden Puffer (oder ein weiteres hinzugefügtes Inverter-Gate) zu steuern. Alternativ können Sie bei sorgfältiger Teileauswahl zwei Tristate-Pufferchips finden, einen mit aktiver High-Freigabe und der andere mit aktiver Low-Freigabe, die dann einfach miteinander verbunden und von einem Pin der kostengünstigen MCU gesteuert werden können.

Bei diesem Schema müssen Sie jedoch vorsichtig sein, wenn Sie die Anzeige tatsächlich von einem Master auf den anderen umschalten. Sie sollten vermeiden, zu wechseln, während auf der Schnittstelle eine aktive SPI-Transaktion ausgeführt wird. Einige Geräte könnten in diesem Fall verwirrt werden. Andere SPI-Geräte würden sich einfach erholen, indem sie das SPI_CS-Signal für eine gewisse Zeit auf den inaktiven Pegel treiben.

Quad-SPDT-Analogschalter würde auch wie http://www.ti.com/lit/ds/symlink/ts3a5018.pdf funktionieren . Dieser ist ein 3,3-V-Pegel, es gibt auch 5-V-Pegelschalter.