Was ist das allgemeine Protokoll zum Senden von Informationen von einem System zum anderen? Nehmen wir zum Beispiel an, wir haben einige Informationen, die über einen längeren Zeitraum vom Mikrocontroller gesammelt wurden, die wir an einen anderen Mikrocontroller senden möchten. Ich habe von SPI- und I2C-Schnittstellen gehört, aber ich bin mir nicht sicher, wann Sie eine Methode einer anderen vorziehen und wie Sie sie implementieren. Gibt es neben SPI und I2C noch andere Methoden, die üblich sind? Ist der Implementierungsprozess für verschiedene Mikrocontroller ähnlich? Analysiert es im Grunde Datenbytes, die ich auf dem empfangenden Mikrocontroller mache?
SPI und I2C sind sich insofern ähnlich, als sie eher zum Anschließen von Peripheriegeräten an einen Controller oder eine CPU verwendet werden als zum tatsächlichen Übertragen von Daten zwischen Systemen. USB ist eine weitere Schnittstelle, die die Leute anscheinend als Kommunikationssystem behandeln möchten, das in Wirklichkeit ein peripherer Anschlussbus ist.
Die Kommunikation zwischen Systemen ist nicht genau wie das Anschließen eines Geräts an einen Bus. Der Busanschluss ermöglicht es dem Prozessor, direkt auf Register in einem Gerät zu klopfen, während eine Kommunikationsschnittstelle es Ihnen ermöglicht, Datenströme zu senden/empfangen. Ein an einen Bus angeschlossenes Gerät benötigt im Allgemeinen einen Gerätetreiber, während es bei der Kommunikation wirklich egal ist, was am anderen Ende angeschlossen ist, soweit es den Host-Computer betrifft.
Natürlich wird dies die ganze Zeit eine unschärfere Grenze. Dinge wie PCI und ISA sind unbestreitbar Busse; I2C, SPI, USB sind wohl Busse; wobei RS232, RS485 und Ethernet definitiv Kommunikationsschnittstellen sind. Aber dann gibt es Dinge wie CAN-Bus und 1553, bei denen es definitiv darum geht, Daten zu bewegen, aber auf eine sehr komplizierte Art und Weise.
Es gibt nicht die eine Art, Daten zu senden, es gibt viele verschiedene Arten zu kommunizieren, abhängig von der Entfernung, der Datenrate, der Umgebung, der Anwendung ...
Die unterste Schicht ist die physikalische Schicht , die die Bits tatsächlich bewegt.
SPI und I²C sind für kurze Distanzen in einem Gerät, wo es nicht viel Rauschen gibt, das die Übertragung stören könnte.
Für eine nicht zu schnelle Kommunikation über Entfernungen bis zu einigen zehn Metern ist die serielle Kommunikation über RS-232 eine gute Wahl.
Wenn es mehr Rauschen oder größere Entfernungen gibt, werden differentielle Signale verwendet, zum Beispiel in RS-485. Für eine schnellere Datenübertragung gibt es Ethernet, das sich immer mehr durchsetzt.
Dann gibt es noch diverse WLAN-Standards.
Auf der physikalischen Schicht gibt es weitere Schichten, die organisieren, wie die Daten gesendet werden, um Fehler bei der Übertragung, dem Routing in einem Netzwerk und vielen anderen Dingen zu erkennen und zu korrigieren. Beispielsweise ist das Internetprotokoll ein ziemlich komplexer Stapel aus mehreren Schichten, typischerweise über dem Ethernet-Protokoll.
Ein einfacher serieller UART kann verwendet werden (eine Tx- und eine Rx-Leitung ohne diskreten Takt) und kann leicht angepasst werden, um mit Optoisolatoren oder magnetischen Isolatoren zwischen verschiedenen Potentialen (sogar Primär- und Sekundärkreisen) zu kreuzen .
Soweit Protokolle gehen, wird alles mit definierten Befehlsbytes und einer Art Prüfsummenschema gut funktionieren. Es gibt wirklich kein allumfassendes Standardprotokoll, das für alle Kommunikationsarten geeignet ist. I2C hat Signalisierungsstandards (definiert Adressierung, Stopps, Starts usw.), aber das Protokoll dessen, was tatsächlich kommuniziert wird, liegt ausschließlich beim Entwickler.
PMBus ist beispielsweise ein Kommunikationsprotokoll für Stromversorgungen, das I2C als physikalisches Medium verwendet.
Wie @Jon feststellte, besteht ein Problem bei der Auswahl einer Kommunikationsschnittstelle darin, ob immer eine Einheit für die Initiierung der Kommunikation verantwortlich ist oder ob möglicherweise mehr als eine Einheit dafür verantwortlich ist. Eine damit zusammenhängende Frage ist, ob eine Entität immer bereit sein wird, unerbetene Mitteilungen zu empfangen. SPI wird häufig in Anwendungen verwendet, bei denen eine Seite immer bereit ist, Kommunikation zu empfangen. So etwas wie zum Beispiel ein 74HC595-Schieberegister ist niemals "besetzt". Während SPI gut für die Kommunikation zwischen einem Mikrocontroller und der Hardware ist, die der Mikrocontroller steuern soll, ist es wirklich nicht gut für die Kommunikation zwischen zwei Mikrocontrollern. Wenn zwei Prozessoren mit I2C-Hardware es zur Kommunikation verwenden, kann die Software so lange brauchen, wie sie möchte (innerhalb sehr großzügiger Einschränkungen), um mit dem fertig zu werden, was vor sich geht. ohne Datenverlust zu verursachen. Wenn ein Prozessor 100 Mikrosekunden benötigen würde, um jedes eingehende Byte zu verarbeiten, würde dies den Durchsatz stark einschränken, aber der Sender würde so langsam werden, dass der Empfänger mithalten kann. Die einzige Möglichkeit, die im Allgemeinen mit SPI passieren kann, besteht darin, einen separaten Draht für das Handshaking zu haben.
I2C ist wirklich ein wunderbares Protokoll. Die größten Einschränkungen, die es davon abhalten, das perfekteste Protokoll zu sein, das man sich vorstellen kann, sind
Persönlich würde ich gerne sehen, dass Controller-Anbieter eine Drei-Draht-Variante von SPI unterstützen, die Handshaking beinhaltet. Mir ist jedoch kein Controller bekannt, der dies tut.
Es gibt wirklich kein "allgemeines" Protokoll, was Sie letztendlich verwenden, hängt stark von der Anwendung ab. Damit wir Ihnen eine bessere Antwort geben können, müssen wir Ihre Anforderungen etwas besser verstehen. Sie erwähnen, dass Sie separate Mikrocontroller haben möchten, die als Subsysteme miteinander kommunizieren.
Einige Fragen zu dieser Anwendung:
Wenn Sie Frage 1 mit NEIN beantwortet haben:
Wenn es in diesem Projekt nur 2 Mikrocontroller gibt, können Sie definitiv UART zwischen ihnen verwenden. Wenn beide die Kommunikation initiieren müssen, verwenden Sie die Flusskontrolle, andernfalls sollte es trivial sein, Daten in eine Richtung zu senden. In den meisten Fällen sollte es "schnell genug" sein, vorausgesetzt, Sie wählen eine der höheren Baudraten. I2C und SPI eignen sich normalerweise nur für Master/Slave-Architekturen.
Wenn Sie Frage 1 mit JA (mehr als 2 Controller) beantwortet haben:
Jetzt brauchen Sie also etwas Skalierbareres, bei dem Sie adressierbare Geräte auf einen gemeinsamen Bus ziehen können. Die Antwort auf diese Folgefragen hilft Ihnen bei der Entscheidung zwischen I2C und SPI (Master-Slave) oder so etwas wie CAN (Multi-Master).
Ihr Mikrocontroller verfügt höchstwahrscheinlich über ein UART-Peripheriegerät, die anderen (insbesondere CAN) sind möglicherweise nur auf High-End-Chips verfügbar. In jedem Fall sollte es reichlich Dokumentation darüber geben, wie diese Peripheriegeräte verwendet werden, um Bytes zu verschieben.
In keiner bestimmten Reihenfolge scheinen die beliebtesten Physical-Layer-Instanzen für 2 CPUs in derselben Box zu sein:
Diese Instanzen der physikalischen Schicht (sowie andere Instanzen der physikalischen Schicht für 2 CPUs in getrennten Boxen) liefern typischerweise einen Strom von Bytes an die Software, die die höheren Ebenen des Kommunikationssystems implementiert.
Kluge Programmierer schreiben die Software so, dass der Hardware-Typ, wenn er beschließt, eine Instanz der physikalischen Schicht herauszureißen und durch eine völlig andere Instanz der physikalischen Schicht zu ersetzen, nur ein paar Funktionen neu schreiben muss, um ihren Ausgangsstrom von Bytes zu speisen zur Hardware und liest einen Strom von Bytes von der Hardware zurück, und alle Protokolle auf höherer Ebene arbeiten unverändert weiter.
Das Protokoll zum Senden von Informationen von einer CPU zu einer anderen CPU beinhaltet fast immer die Interpretation des Bytestroms als eine Reihe von Paketen:
Einige Leute scheinen Spaß daran zu haben, völlig neue, benutzerdefinierte, inkompatible Protokolle zu erstellen, indem sie (2) eine von vielen Arten von Header-Strukturen mit (3a) einer von vielen Arten von Serialisierungsdaten mit (3b) einer von vielen Arten von mischen und abgleichen Escape dieser serialisierten Daten mit (4) einer von vielen Arten von Anhängern.
Zu den einfachsten Protokollen zum Einkapseln von Daten in ein Paket gehören:
Zu den etwas komplizierteren Protokollen zum Einkapseln von Daten in ein Paket gehören:
Es gibt eine lange Liste von Protokollen unter
Vielleicht möchten Sie „Protocol Design Folklore“ von Radia Perlman lesen , in dem beschrieben wird, wie Protokolldesign schief gehen kann.
Kein einzelnes „allgemeines“ Protokoll. Die Wahl kann (zum Beispiel) abhängen von:
In vielen Fällen müssen Sie die physikalische Schicht (Signalpegel) von der Datenverbindungsschicht unterscheiden (+/- die Art und Weise, wie Daten codiert werden) (siehe OSI-Modell, untere 2..4 Schichten). Mögliche physikalische Schichten sind zum Beispiel:
Sie können eine Zeile verwenden, um Daten und Uhrzeitinformationen zu übertragen, oder diese in mehrere Zeilen aufteilen. Letzteres war früher beliebt, aber heutzutage neigen die meisten neuen / schnellen Protokolle dazu, eine Leitung (oder ein Paar Leitungen, die als eine fungieren) zu verwenden.
Es gibt viele Möglichkeiten, Daten zu codieren und auf einer Leitung zu takten. RS232 verwendet traditionell NRZ, es gibt Machester-Kodierung und die verschiedenen Formate, die auf Festplatten mit merkwürdigen Namen verwendet werden, Zeile 2.7 RLL.
Um es zusammenzufassen: Es gibt unzählige Möglichkeiten, zwischen Systemen zu kommunizieren. Und ich habe Konnektoren oder übergeordnete Aspekte wie Fehlererkennung und -wiederherstellung, Datenkodierung, Komprimierung und Verschlüsselung noch nicht einmal erwähnt ...
sternenblau
O_O
Kortuk
Nur Jeff
darron
Casey