Ich habe viel über CAN-Bus-Schiedsverfahren gelesen, aber meine Fragen wurden nicht beantwortet.
Wenn ein Knoten bereits die Daten auf dem Bus überträgt und zwischen einem anderen Knoten die Datenübertragung initiieren möchte, wie erfährt dieser "andere Knoten", dass der Bus ausgelastet ist?
Alle Dokumente (die ich lese) setzen voraus, dass beide Knoten gleichzeitig mit der Übertragung beginnen und dann einer mit dem ersten dominanten Bit den Bus erhält, aber niemand hat den Zustand erklärt, den ich wissen möchte.
Antworten:
Die kurze Antwort lautet, dass der Knoten die CAN-Leitungen überwachen muss, um für eine bestimmte Zeit inaktiv zu sein, bevor er versucht zu senden. Wenn also ein anderer Knoten sendet, muss er ruhig bleiben, bis der andere Knoten fertig ist.
Ein CAN-Bus basiert auf Differenzsignalisierung. Die beiden Leitungen CAN-High (CAN +) und CAN-Low (CAN-) liegen beide im Leerlauf, wenn der Bus im Leerlauf ist. Zum Senden von Bits legt ein CAN-Sender eine Differenzspannung an die Leitungen von etwa 2 Volt an.
Ein CAN-Sender erkennt zuerst, ob der Bus inaktiv ist, und beginnt zu senden, wenn dies der Fall ist. Das Schiedsverfahren funktioniert so, dass ein Sender den Bus während des Sendens überwacht. Die Übertragung erfolgt wie oben beschrieben, indem entweder die beiden Leitungen auf dem gleichen Potential oder auf einem Differenzpotential gehalten werden. Wenn also der Sender ein bisschen sendet, indem er die Leitungen auf dem gleichen Potential (sic) hält, aber sieht, dass die beiden Sendeleitungen ein Differenzpotential haben, bedeutet dies, dass ein anderer Knoten sendet und der erste Sender die Arbitrierung verloren hat. Es muss dann aufhören zu senden.
Wenn ein Knoten zum ersten Mal mit dem Senden beginnt, sind die übertragenen Bits bis zur Adresse des sendenden Knotens, die offensichtlich unterschiedlich sind, gleich. Wenn zwei Knoten gemeinsam senden, senden sie synchron, bis der Adressenteil erreicht ist. Wenn sich die Adresse unterscheidet, bemerkt ein Knoten einen Potentialunterschied auf den Leitungen, selbst wenn er keinen auf die Leitungen setzt. Dann weiß es, dass es verloren hat und muss es erneut versuchen. Der gewinnende Knoten sendet weiter, ohne zu wissen, dass es auch ein anderer Knoten versucht hat. Natürlich erstreckt sich diese Logik auch auf mehr als zwei Knoten.
Ich hoffe das hilft.
quelle
Ich kenne zwei Möglichkeiten, um das Problem zu beheben:
Erstens würde der CAN-Controller immer den Bus überwachen; Wenn eine Nachricht auf dem Bus erkannt wird, beginnt der Empfangsprozess. Jetzt, da es sich im Empfangszustand befindet, weiß es, dass der Bus verwendet wird, wenn eine Übertragung angefordert wird.
Zweitens hat der CAN-Transceiver durch Bit-Stuffing nicht länger als fünf Zyklen das gleiche Bit (es sei denn, ein Busfehler wird erkannt. In diesem Fall werden bis zu 12 dominante Bits hintereinander angezeigt). Die Ausnahme ist, wenn auf dem Bus nichts übertragen wird und immer ein passives Bit gelesen wird. Ein Controller, der gerade startet, kann fünf Zyklen lang auf den Bus hören, bevor er "wahrscheinlich frei" erklärt.
Ich garantiere nicht, dass dies die tatsächlichen Prozesse sind, aber basierend auf meinen (begrenzten) Kenntnissen über CAN würden diese funktionieren.
quelle
Wie CoderTao sagt, überwacht der CAN-Controller den Bus kontinuierlich, sodass er weiß, wann bereits eine Übertragung läuft. Die einzige Zeit, in der eine Kollision auftreten kann, ist, wenn beide Knoten "gleichzeitig" zu senden beginnen - innerhalb einer Bitzeit voneinander (+ eine kleine zusätzliche Zeit für die Busausbreitung). Daher sind dies die einzigen Fälle, die Sie in Dokumenten gefunden haben :)
quelle
Die Knotenadresse bestimmt die Priorität, wobei niedrigere Adressen eine hohe Priorität haben. Die Übertragung beginnt mit dem Knoten, der seine Adresse sendet. Gleichzeitig sendet es, es hört zu. Angenommen, Knoten drei und zwei senden gleichzeitig. Als letztes Bit der Adresse sendet Knoten drei eine 1 und Knoten zwei eine 0. Aufgrund der 0 wird die Datenleitung in den Zustand 0 heruntergezogen. Knoten drei sehen, dass anstelle der 1, die er sendet, die Leitung eine 0 ist und die Übertragung stoppt.
CAN wurde erstmals in PKW und LKW eingesetzt. Einige Sensoren mussten eine viel höhere Priorität haben als andere. Zum Beispiel musste die Antiblockierbremsung eine höhere Priorität haben als die Waschflüssigkeit mit niedriger Windschutzscheibe.
quelle
Die CAN-Spezifikation enthält vier Schlüsselelemente, mit denen CAN-Controller den Leerlaufbusstatus erkennen können:
Die drahtgebundene UND-Signalisierung ermöglicht es, dass das von einem der Knoten übertragene dominante Bit von allen anderen Knoten erkannt wird, die gleichzeitig das rezessive Bit senden. Wenn also ein Knoten, der ein rezessives Bit sendet, einen dominanten Zustand des Busses sieht, weiß er, dass der Bus besetzt ist .
Durch das Füllen von Bits wird sichergestellt, dass nicht mehr als 5 identische aufeinanderfolgende Bits vorhanden sind. An sich wird Bit-Stuffing verwendet, um die Synchronisation aufrechtzuerhalten. Ein Nebeneffekt davon ist jedoch, dass nicht mehr als 5 aufeinanderfolgende rezessive Bits innerhalb der Rahmenbits bis zum CRC-Begrenzer auftreten können.
Das Rahmenende ist eine Reihe von 7 rezessiven Bits am Ende eines Rahmens. Sie sind nicht vollgestopft, sodass sie von Controllern leicht erkannt werden können. Beachten Sie, dass der Bus während dieser Zeit noch nicht inaktiv ist, da EOF als Teil des Frames betrachtet wird.
Der Zwischenrahmenraum ist eine Reihe von 3 rezessiven Unterbrechungsbits zwischen den Rahmen, gefolgt vom Busleerlaufzustand. Kein Knoten darf während der Pause eine Übertragung initiieren, es sei denn, er möchte Fehler- oder Überlastungsrahmen senden . Darüber hinaus muss der Knoten, der den letzten Rahmen gesendet hat , nach der Unterbrechung auch 8 rezessive Suspend-Übertragungsbits senden , bevor eine weitere Übertragung initiiert wird. Diese letzte Anforderung ermöglicht es anderen Knoten, ausstehende Nachrichten zu senden, sodass kein Knoten den Bus auf unbestimmte Zeit "belasten" kann.
Nach alledem erkennen die Knoten den Leerlaufbuszustand wie folgt:
Empfangsknoten warten einfach auf 10 aufeinanderfolgende rezessive Bits , einschließlich EOF und Pause. Nach dieser Zeit betrachten sie den Bus als inaktiv und können versuchen, mit der eigenen Übertragung zu beginnen.
Der sendende Knoten sendet 11 aufeinanderfolgende rezessive Bits nach EOF des letzten übertragenen Rahmens. Wenn während dieser Zeit kein anderer Knoten die Übertragung initiiert, betrachtet er den Bus als inaktiv und kann versuchen, eine weitere Übertragung zu beginnen. Wenn während dieser Zeit ein dominantes Bit erkannt wird, wird der Knoten zum Empfänger.
Die obigen Informationen sowie zusätzliche Informationen zum Bit-Timing finden Sie in der von BOSCH entwickelten CAN-Spezifikation .
quelle
Ein bestimmter Knoten initiiert seine Übertragung nur nach der INTERMISSION-Periode (diese Dauer wird auch als SUSPENDED-Dauer bezeichnet. In dieser Periode werden 3 rezessive Bits nach der Übertragung des DATA / REMOTE-Rahmens an den Bus an den Bus übertragen. Dies zeigt an, dass der BUS ist im IDLE-Status), da während dieser Zeit keiner der Knoten die Übertragung initiiert. Nachdem sich der BUS im Leerlauf befindet, geht der Knoten, der den Bus zur Übertragung haben möchte, in die SCHIEDSVERFAHREN.
Nach der Übertragung des Interframe-Raums an den Bus versuchen die im CAN-Netzwerk vorhandenen Knoten, die Übertragung zu initiieren. Daher weiß ein bestimmter Knoten, ob der Bus besetzt ist oder nicht.
quelle