CAN-Interceptor

Der CAN-Interceptor ist ein kleines Gerät, mit der CAN-Bus abgehört werden kann. Dieses Gerät schickt die empfangenen CAN-Bus Nachrichten über USB zu einem PC, wo diese Daten angezeigt und gespeichert werden können. Es ist aber auch möglich, Nachrichten über den CAN-Bus zu senden, entweder einmalig oder auch in regelmäßigen Intervallen. Sicherlich gibt es schon einige Geräte solche auf dem Markt bzw. zum Nachbauen, aber ich habe halt Spaß am Basteln. Und lernen tut man dabei auch noch was.

Gerenderte Platine
Gerenderte Platine

Hardware

Wie in meinen letzten Projekten kommt auch hier ein Mikrocontroller von Renesas zum Einsatz. Der mit 20MHz getaktete MCU R8C/23 hat bereits einen CAN-Controller integriert. Die Anbindung an den CAN-Bus läuft über den Transceiver PCA82C250 oder TJA1050, und die USB-Kommunikation erledigt ein FT232RL, der die Daten in dieser Anwendung mit 1,25MBaud überträgt. Mein zweiter Entwurf, der hier zu sehen ist, wurde bis auf das Nötigste abgespeckt, so das er die Form eines USB-Sticks hat.

Schaltplan

Herunterladen :
Eagle Schaltplan : herunter laden (63 KiB)
Eagle Platinenlayout : herunter laden (26 KiB)
Bauteilliste : HTML
Firmware *.mot : herunter laden (2 KiB)
Firmware Quellcode : herunter laden (75 KiB)

Schnittstellenprotokoll

Das Protokoll ist sehr Hardware nahe für den CAN-Controller ausgelegt, damit auch bei hohen Datenraten auf dem CAN-Bus keine Nachrichten verloren gehen. Auch auf die Datenübertragungssicherheit habe ich nicht die höchste Priorität gelegt. Es wird keine zusätzliche Prüfsumme verwendet.

Jedes Datenpaket wird durch einen Startbyte (Hex: AA) eingeleitet, und durch ein Endbyte (Hex: A5) abgeschlossen. Hat ein Byte des Datenpakets eines dieser Werte muss es doppelt gesendet werden. Folgend auf das Startbyte wird immer die Länge des Datenpakets gesendet. Bei der Länge zählen alle Bytes des Datenpakets mit außer das Start- und das Endbyte. Außerdem ist bei der Länge zu beachten, dass die verdoppelten Bytes nur einfach gezählt werden. Hier nun ein Beispiel für ein Datenpaket : (Das "$" soll Hexadezimalwerte kennzeichnen)

Start Länge Kommando Identifier Daten Ende
$AA $07 $81 $39 $06 $12 $AA $AA $34 $A5

In diesem Beispiel ist bei den Datenbytes zu sehen, dass Bytes $AA verdoppelt wurde. Es sind also real nur 3 Datenbytes vorhanden. Die Länge von 7 setzt sich nun wie folgt zusammen : 1 Byte das Längenbyte selbst, 1 Byte Kommando, 2 Byte Identifier und 3 Datenbytes. Bei den Werten die mehrere Bytes umfassen, also mehr als 8 Bit haben, wie dies bei dem Identifier oder dem Zeitstempel der Fall ist, wird das niederwertigste Byte (LSB) zuerst gesendet. In diesem Beispiel soll also eine Nachricht über den CAN-Bus, mit der ID $639 und den Daten $12, $AA, $34, geschickt werden

Datenrichtung PC zum CAN-Dongle

CAN-Controller zurücksetzen und initialisieren.

Start Länge Kommando Daten Ende
$AA $06 $20 Dat0 Dat1 Dat2 Dat3 $A5

Filtermasken setzen.

Die Masken sind nur für das Empfangen von CAN-Botschaften von Bedeutung. Im Moment ist die Software für "Basic CAN" ausgelegt, das bedeutet, die Masken für Slot 14 und 15 müssen gleich sein.

Start Länge Kommando Maske Ende
$AA $04 Cmd LSB MSB $A5

CAN-Controller Hallo oder auch Ping.

Start Länge Kommando Ende
$AA $02 $24 $A5

Dieses Kommando fordert den CAN-Dongle auf, sich zurück zu melden. Damit kann geprüft werden, ob der CAN-Dongle noch angeschlossen ist. Außerdem wird die USB-Baudrate auf 625000kBps hochgesetzt. Dem CAN-Dongle wird also quasi mitgeteilt, dass er mein eigenes Protokoll verwenden soll. Zum zurücksetzen der Baudrate muss der CAN-Dongle zurückgesetzt oder aus und ein geschaltet werden (abziehen und wieder anstecken).

Nachrichtenslot setzen.

Start Länge Kommando Identifier Daten Ende
$AA L Cmd LSB MSB Dat0 Dat1 Dat2 ... $A5

Hier gibt es einige Besonderheiten in Zusammenhang mit dem Remote-Bit.

Sollen die Remote-Daten nur empfangen, aber nicht automatisch beantwortet werden, sind im Kommando die Bits 7/6 auf 01 und das Remote-Bit auf 1 zu setzen. Außerdem werden keine Datenbytes übertragen.

Soll der CAN-Dongle automatisch auf eine Remote-Anforderung antworten, sind im Kommando die Bits 7/6 auf 01 und das Remote-Bit auf 1 zu setzen, und es muss mindestens ein Datenbyte übermittelt werden.

Um eine Remote-Anforderung zu senden, werden im Kommando die Bits 7/6 auf 10 gesetzt und das Remote-Bit aktiviert. Die Anzahl der Datenbytes muss auf die Anzahl der zu empfangenen Bytes gesetzt werden. Die Anzahl der Datenbytes des Remote-Empfangers wird dabei überschrieben. Der Slot wird anschließend automatisch zum Empfangsslot, um die automatische Antwort zu empfangen.

Datenrichtung CAN-Dongle zum PC

Bestätigung für CAN-Controller zurücksetzen und initialisieren.

Start Länge Kommando Daten Ende
$AA $03 $20 Dat0 $A5

Hallo Rückmeldung.

Start Länge Kommando Ende
$AA $02 $24 $A5

Der CAN-Dongel schickt dieses Kommando als Antwort auf das Hallo-Kommando. Danach ändert er die USB-Baudrate auf 625000kBps. Der CAN-Dongle kann danach nur noch mit dieser Baudrate angesprochen werden.

CAN Fehlerstatus übermitteln.

Start Länge Kommando Daten Ende
$AA $05 $2f Dat0 Dat1 Dat2 $A5

Nachricht vom CAN-Bus empfangen.

Start Länge Kommando Zeitstempel Identifier Daten Ende
$AA L Cmd LSB ... MSB LSB MSB Dat0 Dat1 Dat2 ... $A5

Das Lawicel-Protokoll

Zusätzlich zu meinem eigenen Protokoll unterstützt der CAN-Interceptor-Dongle das Lawicel-Protokoll. Dieses Protokoll ist zwar sehr ineffizient, weil quasi jedes Byte, welchen über den CAN-Bus geht, zwei Byte auf dem USB-Bus bedeutet. Dies fällt allerdings bei kleinen CAN-Baudraten nicht ins Gewicht. Außerdem wird bei meinem Protokoll eine viel höhere Baudrate zwischen CAN-Interceptor-Dongle und PC verwendet. Fremde Programme die über das Lawicel-Protokoll mit dem CAN-Interceptor-Dongle kommunizieren, müssen auf eine Baudrate von 115200 Baud eingestellt werden.
Da im CAN-Interceptor-Dongle kein SJA1000 CAN-Controller steckt, kann das Lawicel-Protokoll nicht zu 100% umgesetzt werden. Abweichungen gibt es in folgenden Punkten :

Zur Nachrichtenfilterung gibt es auch noch einiges zu sagen. Der CAN-Controller des R8C/23 verwendet hardwaremäßig eine komplett andere Methode zum Filtern der Nachrichten. Deswegen habe ich versucht, die Filterung des SJA1000 softwaremäßig nachzubilden. Ich müsste hierzu noch ein paar Performancetests durchführen.
Die Remote Nachrichten (RTR) werden von der Software CANHacker noch nicht richtig verarbeitet. Deswegen funktioniert das ganze noch nicht so gut.
Eins muss auch noch beachtet werden. Nach dem Einschalten des CAN-Interceptor-Dongle nimmt er die Daten beider Protokolle an. Wurde einmal eine CAN-Verbindung mit meinem Protokoll aufgebaut, kann nicht mehr mit dem Lawicel-Protokoll kommuniziert werden. Dies liegt an der erhöhten Baudrate der USB-Schnittstelle. Die Programme, die das Lawicel-Protokoll unterstützen, unterstützen diese Baudrate nicht. Um wieder das Lawicel-Protokoll zu verwenden muss der CAN-Interceptor-Dongle einmal zurückgesetzt werden. Dies erreicht man durch abziehen und wieder einstecken in die USB-Schnittstelle.

Firmware des CAN-Dongles

Zu der Firmware ist nicht viel zu sagen. Sie ist in C geschrieben. Das Programm nimmt die Nachrichten von der CAN-Schnittstelle entgegen, speichert sie zwischen und schickt sie dann per USB zum PC.

Hier die Firmware zum herunterladen :
Kompilierte MOT-Datei : kommt später (xxx KiB)
C-Quellcode : kommt später (xxx KiB)

PC-Software

Damit der PC mit dem CAN-Dongle kommunizieren kann muss der Treiber für das USB-UART-Interface installiert werden. Das USB-UART-Interface ist ein Chip von FTDI, der FT232R. Die Links zu dem Treiber findest du unten in diesem Abschnitt.

Die PC-Software schreibe ich mit Delphi 7, also quasi in Pascal. Mit ein paar Änderungen könnte man das auch mit Lazarus zum laufen bekommen. Ich habe das nur unter Windows XP getestet. Für den Anfang habe ich auch noch keinen großen Wert darauf gelegt, dass die Bedienung DAU sicher ist. Außerdem sollte man sich mal anschauen, wie der CAN-Controller funktioniert. Das wird die Bedienung des Programms erleichtern.

Screenshot

Einen Installer gibt es vorerst auch nicht. Das ist aber auch nicht weiter tragisch, da das Programm nur aus einer einzigen EXE-Datei besteht. Es gibt also keine DLLs oder ähnliches. Es wird beim Start des Programms nur eine INI-Datei angelegt.

Hier ist der aktuelle Stand der PC-Software :
Gezipte Windows EXE : Version xxx herunter laden (413 KiB)
Delphi Quellcode : Version xxx herunter laden (151 KiB)

Treiber herunter laden :
Chiphersteller : Download-Seite von FTDI

Auf den hier aufgelisteten Seiten könnt ihr weitere Infos oder ähnliche Projekte finden.

©2007