Mein Arduino läuft mit 16MHz Taktfrequenz; Ein anderer Mikrocontroller läuft mit einer Taktrate von 13 MHz. Wenn ich die digitale Ausgabe direkt von einem Ausgangspin des ersteren zum Eingangspin des letzteren sende, kommt es zu einem Datenverlust und die Übertragung wird beschädigt.
Frage 1: Wie bringe ich die MCUs dazu, die Daten ordnungsgemäß und ohne Beschädigung zu übertragen? Muss ich sie irgendwie synchronisieren oder sollte ich ein anderes Gerät in der Mitte als eine Art Puffer verwenden (oder vielleicht um Daten mit einer niedrigeren Rate zu senden)?
Frage 2: Wenn ich Daten mit einer niedrigeren Rate von MCU#1 zu MCU#2 senden kann, gibt es dann einen Phasenunterschied, der zu einer Datenbeschädigung führen würde?
Die Punkte, die Sie machen, sind absolut gültig. Was Sie vermissen, sind einige Details, die Sie erhalten könnten, wenn Sie mehr über Kommunikationsprotokolle lesen. Hier sind einige davon.
Der Grund dafür ist, dass bis auf einige Ausnahmen (Transceiver, Buffer etc.) die übertragenen Daten entweder beschafft oder irgendwie verarbeitet werden müssen. Eingaben von der Benutzeroberfläche funktionieren sicherlich in einer völlig anderen Zeitdimension. Und wenn Ihr Controller mehrere Sekunden braucht, um 1 MB Daten zu verarbeiten, wäre es sinnlos, sie mit einer Geschwindigkeit von 16 Mbit/s zu übertragen.
In der Kommunikation wird häufig der Begriff "Bandbreite-Distanz-Produkt" verwendet. Dies ist ein weiterer Grund, warum direkte MCU-zu-MCU-Verbindungen selten so hohe Datenraten verwenden.
Zum Beispiel haben Xmega-MCUs periphere Taktgeber, die mit der 2- oder sogar 4-fachen CPU-Geschwindigkeit laufen. Außerdem verfügen Controller mit USB-Schnittstellen oft über eigene Oszillatoren.
Bei synchronen Protokollen wie SPI (oder I2C auf der Slave-Seite) kommen ihre Taktsignale von verschiedenen MCUs. Die Hardware kann also diesen Takt verwenden, um Daten in den/aus dem Puffer zu verschieben und den Prozessor nur am Ende einer Nachricht einzubeziehen. Fortgeschrittenere MCUs mit DMA-Unterstützung können die Daten sogar zwischen verschiedenen Peripheriegeräten oder Speicher verschieben, ohne die CPU überhaupt zu involvieren.
Asynchrone Protokolle wie UART oder CAN erfordern synchronisierte Uhren. Sie beginnen mit der Zeitmessung beim Startbit und tasten die Eingänge dann einmal ungefähr in der Taktmitte (UART) oder bis zu dreimal bei etwa 75 % des Taktimpulses (CAN) ab. Offensichtlich hängt die Datenintegrität von der Taktgenauigkeit ab. Während CAN-Controller ihre Uhren mithilfe von Phasenverschiebungsinformationen anpassen können, können einfachere UARTs dies nicht.
Eine gängige Praxis, um eine bessere UART-Synchronisation zu erreichen, besteht darin, Quarze mit Frequenzen zu verwenden, die leicht auf übliche serielle Baudraten teilbar sind. Anstatt beispielsweise die oben genannten Xmega-Controller mit ihren maximalen 32 MHz zu betreiben, sieht man sie oft mit 14,7456 Kristallen, die mit 29,5 MHz laufen.
Unabhängig vom Protokoll macht die Kombination aus Hardwarepufferung und DMA-Übertragungen die Übertragungsbandbreite ziemlich unabhängig von CPU-Takten.
Darüber hinaus können Sie normalerweise eine parallele Busverbindung zwischen MCU und Hochgeschwindigkeits-Transceivern wie LAN- oder LVDS-Displays sehen. Dies liegt daran, dass der Durchsatz des Kommunikationsbusses schneller wird, als er seriell durch einen einzelnen MCU-Pin übertragen werden kann.
Sie haben Ethernet in einem Ihrer Kommentare erwähnt. Sie sollten sich darüber im Klaren sein, dass bei Ethernet-Geschwindigkeiten von 1 Gbit/s keine 16-MHz-MCU eine Chance hat, diese Datenverkehrslawine zu verarbeiten. Für diese Geschwindigkeiten sollten Sie sich nach viel leistungsfähigerer Hardware umsehen, wie sie beispielsweise in RPi verwendet wird.
Übrigens ist dieser letzte Punkt nur eine andere Form von Punkt 1, dh wenn Sie die Datenrate nicht auf etwas reduzieren können, das Ihre MCU verarbeiten kann, folgt logischerweise, dass Sie einen schnelleren Prozessor benötigen, um den Datenfluss zu bewältigen.
Sie haben ganz recht mit Ihrer Analyse des Problems, und es ist natürlich gelöst.
Die Lösung ist ein serielles Protokoll Ihrer Wahl. Ein Mikrocontroller verfügt normalerweise über eines oder mehrere der üblichen Inter-IC-Kommunikationsprotokolle:
UART ist "taktlos", daher muss jede Seite über eine Taktrate entscheiden. Die Geschwindigkeit ist niedrig genug, dass jeder Empfänger die richtigen Bits finden kann, und löst das "Phasen"-Problem, indem zusätzliche Bits eingefügt werden, die immer niedrig oder hoch neben einem Bit der entgegengesetzten Polarität sein werden.
SPI und I2C haben zusätzlich zu den Daten eine Uhr. Der Empfänger verarbeitet die Daten nur dann, wenn sich die Uhr ändert. Normalerweise kümmert sich die Hardware um alles. I2C hat eine standardisierte Taktgeschwindigkeitsbegrenzung, während SPI keine solche Begrenzung hat.
Unter diesen ist SPI wohl am einfachsten in diskreter Hardware zu implementieren. Es ist im Wesentlichen nicht mehr als ein Schieberegister und kann direkt mit einer Reihe billiger und gängiger Logikchips verbunden werden. Es gibt auch keine untere Geschwindigkeitsbegrenzung, und Jitter ist kein Problem, da es nur von der Uhr gesteuert wird, sodass es einfach in Software auf einem langsamen Prozessor implementiert werden kann.
Anton Stafejew
Ahorn
Ahorn
Anton Stafejew
Anton Stafejew
Ahorn
Anton Stafejew
Ahorn
Anton Stafejew