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.
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.
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 |
- Länge : Das Datenpaket ist immer 6 Byte lang.
- Kommando : Ist immer $20.
- Dat0 : Die einzelnen Bit schalten einige Funktionen ein bzw. aus.
- Bit 1 : Loop back Modus.
- Bit 3 : Basic CAN, diese Bit muss immer gesetzt sein.
- Bit 4 : Bus error, schickt bei einem Fehler auf dem CAN-Bus eine Nachricht zum PC.
- Bit 5 : Listen only, Lauschmodus. Es kann nichts auf den CAN-Bus gesendet werden.
- Dat1 : Dient der Baudrateneinstellung (Reg. cclkr).
- Dat2 : Dient der Baudrateneinstellung (Reg. c0conrl des CAN-Controllers).
- Dat3 : Dient der Baudrateneinstellung (Reg. c0conrh des CAN-Controllers).
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 |
- Länge : Das Datenpaket kann 4 oder 6 Byte lang sein, je nachdem ob Standard (11 Bit) oder Erweiterte (29 Bit)Identifier verwendet werden.
- Kommando : Das Kommando hängt davon ab, welche Maske übertragen wird.
- $21 für die Maske der Slots 0 bis 13.
- $22 für die Maske des Slots 14.
- $23 für die Maske des Slots 15.
- Bit = 0 : 2 Byte lange Maske für 11 Bit Identifier.
- Bit = 1 : 4 Byte lange Maske für 29 Bit Identifier.
- Maske : Je nach Kodierung des Bits 4 des Kommandos müssen 2 oder 4 Byte übertragen werden. Ist ein Bit der Maske gesetzt bedeutet dies, dass die entsprechenden Bits der Identifier der Nachricht auf dem CAN-Bus und des Nachrichtenslot im CAN-Controller übereinstimmen müssen. Ist ein Bit in der Maske nicht gesetzt, muss das Bit der Identifier nicht übereinstimmen.
CAN-Controller Hallo oder auch Ping.
Start | Länge | Kommando | Ende |
---|---|---|---|
$AA | $02 | $24 | $A5 |
- Länge : Das Datenpaket ist immer 2 Byte lang.
- Kommando : Ist immer $24.
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 |
- Länge : Die Länge des Datenpaket hängt von der Länge des Identifiers und der Anzahl der Datenbytes ab.
- Kommando : In den Bits des Kommandos sind mehrer Dinge kodiert.
- Bit 7 und 6 :
- 11 - Slot ist inaktiv, es werden kein Identifier und keine Datenbytes übertragen.
- 10 - Nachricht senden.
- 01 - Slot für Empfang vorbereiten, es wird zwar ein Identifier übertragen aber keine Datenbytes
- Bit 5 : 0 - Normal, 1 - Remote
- Bit 4 : 0 - 11 Bit ID (ID Länge 2 Byte), 1 - 29 Bit ID (ID Länge 4 Byte)
- Bit 3 bis 0 : Nummer des Nachrichtenslots. Zu beachten ist, das Slot 14 und 15 beim "Basic CAN" immer gleich gesetzt werden müssen.
- Bit 7 und 6 :
- Identifier : Je nach Kodierung des Bits 4 des Kommandos müssen 2 oder 4 Byte übertragen werden. Wird der Slot deaktiviert, wird kein Identifier übertragen.
- Daten : Die Datenbytes werden nur beim senden einer CAN-Nachricht übertragen. Es können 0 bis 8 Datenbytes übertragen werden.
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 |
- Länge : Das Datenpaket ist immer 3 Byte lang.
- Kommando : Ist immer $20.
- Dat0 : Gibt die Firmwareversion zurück.
Hallo Rückmeldung.
Start | Länge | Kommando | Ende |
---|---|---|---|
$AA | $02 | $24 | $A5 |
- Länge : Das Datenpaket ist immer 2 Byte lang.
- Kommando : Ist immer $24.
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 |
- Länge : Das Datenpaket ist immer 5 Byte lang.
- Kommando : Ist immer $2f.
- Dat0 : CAN-Controller Status.
- Dat1 : Empfangs-Fehler.
- Dat2 : Sende-Fehler.
Nachricht vom CAN-Bus empfangen.
Start | Länge | Kommando | Zeitstempel | Identifier | Daten | Ende | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
$AA | L | Cmd | LSB | ... | MSB | LSB | MSB | Dat0 | Dat1 | Dat2 | ... | $A5 |
- Länge : Die Länge des Datenpaket hängt von der Länge des Identifiers und der Anzahl der Datenbytes ab.
- Kommando : In den Bits des Kommandos sind mehrer Dinge kodiert.
- Bit 7 und 6 :
- 11 - ungültig.
- 10 - ungültig.
- 01 - Kennung für empfangene Nachricht.
- Bit 5 : 0 - Normal, 1 - Remote
- Bit 4 : 0 - 11 Bit ID (ID Länge 2 Byte), 1 - 29 Bit ID (ID Länge 4 Byte)
- Bit 3 bis 0 : Nummer des Nachrichtenslots. Zu beachten ist, das Slot 14 und 15 beim "Basic CAN" immer gleich gesetzt werden müssen.
- Bit 7 und 6 :
- Zeitstempel : Im CAN-Dongle läuft eine Stoppuhr mit, die die Millisekunden zählt. In den 3 Bytes des Zeitstempels wird dem PC der Zeitpunkt des Nachrichtenempfangs mitgeteilt.
- Identifier : Je nach Kodierung des Bits 4 des Kommandos müssen 2 oder 4 Byte übertragen werden.
- Daten : Es können 0 bis 8 Datenbytes empfangen werden.
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 :
- S-Kommando : Eine Baudrate von 800kBps wird nicht unterstützt. Bei einem 20MHz Quarz kann das Teilungsverhältnis nicht so eingestellt werden, dass diese Baudrate herauskommt. Mit einem anderen Quarz und angepasster Software würde dies aber auch gehen.
- s-Kommando : Wird nicht unterstützt. Es können nur die Standard Baudraten benutzt werden. Um dies zu umgehen, könnte die Liste der Standard Baudraten erweitert werden oder der Parameter des Kommandos müsste sich am CAN-Controller des R8C/23 und nicht am SJA1000 orientieren.
- F-Kommando : Dieses Kommando wird nur eingeschränkt unterstützt. Dies ist in den unterschiedlichen CAN-Controllern begründet. Im Augenblick werden nur die Bits 5 und 7 unterstützt.
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.
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
Links
Auf den hier aufgelisteten Seiten könnt ihr weitere Infos oder ähnliche Projekte finden.
- Wikipedia
Natürlich gibt es auch bei Wikipedia einen Beitrag zum CAN-Bus. - mikrocontroller.net
Wenn jemand einen IC zum Thema CAN-Bus sucht, sollte er man hier vorbei schauen. - www.canhack.de
Dies ist auch ein Forum wo es um den CAN-Bus im Auto geht. - Lawicel AB, Schweden
Die Entwickler des Lawicel-Protokolls
©2007