Das Überprüfen des CAN-Busses ist kostenlos oder nicht


8

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.


1
Swanand, Sie erhalten möglicherweise bessere Antworten auf Ihre Fragen, wenn Sie etwas länger warten, um die Antwort zu akzeptieren. Dies ist eine internationale Gemeinschaft, und einige Experten können möglicherweise nicht sofort reagieren.
W5VO

@ W5VO Ich werde mich beim nächsten Mal daran erinnern! Danke für den Vorschlag! :)
Swanand

Antworten:


10

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.


1
Gute Antwort! Wenn ich mich richtig erinnere, dominiert das Senden einer '0' gegenüber einer '1', was zu der Arbitrierung mit der niedrigsten Adresse führt. Eine nette Eigenschaft davon ist, dass, wenn der verlierende Knoten stoppt, wenn er anhalten soll, keine Datenbeschädigung auf dem Bus auftritt.
W5VO

Gute Antwort !! Wird sehr dankbar sein, wenn Sie dies einfach klären könnten: Nehmen wir an, die Bezeichner sind "1011001" und "1000110", wenn das dritte Bit erreicht ist, sendet der erste Sender "1" und der zweite "0"; Gemäß dem CAN-Protokoll ist das dominante Bit 0 und überschreibt das rezessive Bit. Jetzt hält der Bus also "0"; Das erste Modul erkennt dies und stoppt die Übertragung, während das zweite Modul die Übertragung fortsetzt. Ist mein Verständnis richtig?
Febin Sunny

@FebinSunny Ja ... Was du gesagt hast ist richtig!
Swanand

1
Diese Antwort ist weder "gut" noch "großartig". In der Tat ist es völlig falsch . Erstens, Sender nicht „halten die beiden Linien auf dem gleichen Potential“ rezessives Bit zu senden. Es hört einfach auf, Leitungen auseinander zu ziehen, und die Abschlusswiderstände gleichen das Potential aus. Zweitens ist die Adresse des sendenden Knotens nicht Teil des Arbitrierungsfeldes in der CAN-Spezifikation, obwohl einige übergeordnete CAN-basierte Protokolle sie als Teil der Nachrichten-ID verwenden. Drittens hat nichts davon mit der Erkennung eines Leerlaufbusses zu tun
Maple

7

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.


Ich mochte den 2. Trick! Das ist rein logisch und großartig!
Swanand

2
Sie vermissen den Hauptpunkt der Busarbitrierung - dass das allererste in einem CAN-Paket die Adresse ist.
W5VO

1
Das war nicht wirklich seine Frage; Die Frage war, wie ein Controller feststellt, ob es Aktivität im Bus gibt
CoderTao

@ W5VO-CAN-Frames haben keine Adresse, es sei denn, ein höheres Protokoll macht sie zu einem Teil der Nachrichten-ID.
Maple

@CoderTao Während Bit-Stuffing nicht ist, wie Controller Leerlaufbus erkennt, sind Sie insofern richtig, als es eine wichtige Rolle in diesem Prozess spielt, indem Sie sicherstellen, dass übertragene Daten nicht mit Ende des Frames verwechselt werden können
Maple

3

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 :)


2

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.


Ich weiß das schon .... Meine Frage war nicht über Schiedsgerichtsbarkeit zu Beginn .... Es war ungefähr zwischen der Übertragung ....
Swanand

1

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 .


Es gibt einen Bus mit mehreren aktiven Knoten. Ein neuer Knoten wird angeschlossen, wenn keine Kommunikation stattgefunden hat. Woher weiß dieser neue Knoten, dass der Bus inaktiv ist? 10 aufeinanderfolgende rezessive Bits werden übertragen, wenn dieser neue Knoten nicht im Bild war.
Swanand

"Wired-AND-Signalisierung" bedeutet, dass rezessive Bits nicht als solche "übertragen" werden, sondern dass der Sendeknoten kein dominantes Potential erzeugt. Sie werden jedoch empfangen , dh die empfangenden Knoten tasten den Bus in Bitintervallen ab und sehen ein rezessives Bit auf der Leitung. Wenn dieser neue Knoten den Bus 10 Mal abtastet und jedes Mal ein rezessives Bit sieht, wenn er den Bus als inaktiv betrachtet.
Maple

Es gibt keinen Unterschied zwischen "10 aufeinanderfolgenden rezessiven Bits, die übertragen wurden, als dieser neue Knoten nicht im Bild war" und dem Ruhezustand des Busses danach. Wenn keine Kommunikation besteht, gibt das Lesen des Busses das rezessive Bit ("1") zurück. Es spielt also keine Rolle, wann Sie mit dem Sampling beginnen, während oder nach dem letzten dominanten Bit. Solange der Empfänger 10 Bits sieht, kann er mit dem Senden beginnen. Übrigens sendet niemand 10 Bits. Der letzte Sender "sendet" 11 rezessive Bits, 3 Unterbrechungen + 8 Suspend. Wenn der wartende Knoten nach dem 10. mit dem Senden beginnt, verliert der letzte Sender die Arbitrierung und gibt den Bus an den neuen Knoten ab
Maple

0

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.


Was ist, wenn es die erste Übertragung auf dem Bus sein wird? In diesem Fall gibt es keine "Unterbrechungsfrist". Weitere Informationen finden Sie in der Antwort von @ Doc.
Swanand
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.