Funktionsweise des CAN-Bus

Inhaltsverzeichnis[Anzeigen]


1. Datenpaket

Ein Datenpaket (Data Frame) besteht aus einer Bitfolge. Diese lässt sich in mehrere Funktionsblöcke unterteilen.

1.1 Identifier

Der Identifier beinhaltet die Frame-ID. Diese kann beliebig vom Transmitter festgelegt werden. Die Frame-ID gibt jedem Paket einen eindeutigen Namen, sodass jeder Teilnehmer im Bus das Paket identifizieren kann, um zu  entscheiden, ob er das Paket empfangen möchte.

Der Identifier ist 11 bit lang, sodass 2048 verschiedene IDs zur verfügung stehen. Ein Paket kann auch mit Extended-Identifier erzeugt werden, welcher insgesamt 29 bits besitzt.


1.2 Data Field

Hier steht die zu übertragende Nachricht. Diese hat eine Maximale Länge von 8 byte. Längere Nachrichten müssen in mehrere Pakete gesplittet werden. Hierzu haben wir eine passende Bibliothek geschrieben, die diese Arbeit dem Enwickler abnimmt -> CANdalus

 

1.3 CRC Field

Hier wird steht eine Checksumme der Nachricht. Diese stellt sicher, dass das Paket korrekt beim Receiver empfangen wurde. Der CAN-Bus hat dabei eine Besonderheit. Jeder Teilnehmer erhällt  das Paket und prüft dieses auf Richtigkeit. Sollte nur ein Teilnehmer einen Fehler detektieren, wird das Paket verworfen und neu verschickt. Zusammen mit der üppigen Länge des CRC Feldes (15 bit), sind Übertragungsfehler zu beinahe 100% ausgeschlossen.

 

2. Filter und Masken

Da nicht jeder µ-Controller im Netzwerk jede Nachricht erhalten möchte, kann der CAN-Controller bestimmte Frame-IDs durch ein Whitelist-Verfahren filtern.

2.1 Funktionsweise

Vorweg sollte beachtet werden, dass die Frame-ID nicht als Zahl , sondern mehr als Bitfolge angesehen werden soll.


Jede ID durchläuft zurerst eine Mask, die definiert, welche Bits später vom Filter beachtet werden sollen. 1 bedeutet für Filter relevant. 0 wird vom Filter Ignoriert. Ein Beispiel:

Ein Paket hat die (zur veranschaulichung verkürzte) ID von: 101 und die Maske ist 111. So werden später alle drei bit vom Filter berücksichtigt. Bei gleicher ID und der Maske 110 werden nur die ersten beiden bits (von links nach rechts) berücksichtigt.

Die restlichen Bits werden nun mit der Filter-Bitfolge verglichen. Nur wenn all diese Bits der Frame-ID mit denen des Filters übereinstimmen, wird die Nachricht zum µ-Controller (in unserem Fall dem Arduino) weitergeleitet. Die folgende Beispiel-Grafik soll diesen Vorgang weiter Verdeutlichen:

Beispiel zu Masken und Filtern

Arduino 1 sendet ein Paket mit der Frame-ID 101 in das Netzwerk. Arduino 2 erhält dieses und ist glücklich :). Der  von ihm gesetzte Filter ist identisch mit der ID des Pakets. Arduino 3 erhält das Paket nicht und ist traurig :(. Seine Maske setzt jedes Bit als relevant. Da aber der Filter nicht identisch mit der Frame-ID ist, wird das Paket abgewiesen. Arduino 4 erhält das Paket trotz  einer Abweichung des Filters zur Frame-ID, da die Maske das differente Bit als zu ignorieren eingestuft hat. Somit ist auch Arudino 4 glücklich :D.

2.2 Mutliple Filter und Masken

Sollen nun zwei oder mehr IDs berücksichtigt werden ohne dabei eine Maske zu nutzen, kann der Filter im laufenden Betrieb auch neu gesetzt werden. Allerdings ist der Umschaltvorgang sehr träge. Unsere Tests haben ein willkürliches Verhalten bei einem Delay von weniger als 500 ms ergeben. Um diesem Problem entgegen zu wirken, können beim CAN-Bus bis zu sechs Filter und zwei Masken gleichzeitig gesetzt werden. Dabei laufen beide Masken parallel. Der ersten Makse (Mask 0) sind zwei Filter zugeordnet (Filter 0 und 1), der zweiten Maske (Mask 1) vier Filter (Filter 2, 3, 4 und 5). Beide Pfade besitzen ihren eigenen Puffer (Buffer 0 und 1) in dem die empfangenen Nachrichten zwischengespeichert.

Multi-Filter/Masken Schema

 

Auch die Filter laufen unter der jeweiligen Maske parallel. Es muss also nur eine Maske, die Frame-ID akzeptieren, damit die Nachricht beim Empäfnger ankommt. Die Masken gelten jeweils nur für die darunterliegenden Filter. Das folgende Beispiel verdeutlicht dies:

Beispiel zu Multi-Filtern/Masken

Natürlich können auch mehrere Nachrichten mit verschiedenen IDs über verschiedene Filter zeitnah empfangen werden. Dabei ist zu beachten, dass Buffer 0 immer als erstes verarbeitet wird. Kritische Daten sollten bevorzugt über diesen laufen. Auch werden Pakete mit einer niedrigen Frame-ID mit höherer Priorität in den CAN-Bus geschickt.


Ein kommentiertes Beispielprogramm zu den multiplen Filtern befindet sich im Anhang. Die Erklärung der CAN-Funktionen befindet sich in desem Wiki-Eintrag: klick mich.

Anhänge:
Diese Datei herunterladen (cannbus-multiple-filter-masken.zip)cannbus-multiple-filter-masken.zip[Beispielprogramm zu multiple FIlter/Masks]%2013-%04-%02 %1:%Apr%+02:00