Pi-CAN-Duo
Einleitung
Dies ist ein DUAL CAN-Port Modul für den Raspberry Pi 2B, 3B, 3B+, 4B
Mit Hilfe dieser Erweiterung soll mein Raspberry Pi 3B+ zu einem universellen CAN-Logger und CAN Analyse Tool ausgebaut werden. Somit lassen sich dann folgende Einsatzzwecke:
- CAN-Logger , CAN-Sniffer
- CAN-Gateway
- Einfache Zuordnung von welcher Seite die CAN-Botschaften gesendet werden
- Einfaches Filtern von CAN-Botschaften (mit Shell Befehle)
- Basic-Tools zur Protokollanalyse
- socketcand - Support: Simulatane CAN Analyse von mehreren Benutzern über Netzwerkverbindungen.
- Direkter Support vom Kernel
- Einfaches Programmieren eigener CAN-Applikationen z.B. mit Python
- ... und vieles mehr - Vorallem macht es mit dem Raspi einfach mehr Spaß :-)
realisieren.
Hardware (Version 0.1)
Schaltplan
Die Schaltung besteht im Wesentlichen aus:
- 2 x MCP2515 - CAN-Controller
- 2 x SNHVD232D - 3,3V CAN-Bus Treibern
- 1 x EEPROM - HAT ID Eeprom
- optionale Terminierung der CAN-Bus Leitungen mittels Jumper
Die CAN-Controller sind über den SPI-BUS an den Raspberry Pi angebunden und die SPI-Taktfrequenz beträgt 20MHz.
Hinweis: In dem Schaltplan sind für den CAN-Controller und Quarze jeweils zwei Bestückungsvarianten vorgesehen, so daß man die Bauform verwenden kann, die man gerade zur Hand hat, bzw. bei Handbestückung einfacher zu löten sind.
Layout
Aufbau
Hardware (Version 0.2)
Schaltplan
PI-CAN-Duo V0.2 Schaltplan (PDF)
Aufbau
Abb. 1.6 PI-CAN-Duo Hardware Version 0.2
Projekt-Status:
- Februar 2019 - 1.Prototypen Version 0.1
Hat sich bewährt und funktioniert prima (auch Gateway Funktionalitäten inkl. Filterfunktion und Modifikation),
bis auf die Statusanzeige von den CAN LEDs für die CAN-Schnittstellen bei CAN Aktivität - August 2019 - 2.Protoypen Version 0.2
Bug-fix : Status-Anzeige bei CAN Aktivität
Software
Konfiguration des Raspberry Pi
Das CAN Modul verwendet 2 MCP2515 die über SPI angebunden sind:
-
CAN 1
-
GPIO 25 Rx-IRQ
-
-
CAN 2
-
GPIO 24 Rx-IRQ
-
Folgende Schritte sind jetzt für die Konfiguration erforderlich:
-
SPI mit sudo raspi-config aktivieren
-
/boot/config.txt folgendes einfügen, bzw. kontrollieren ob diese Einträge schon gesetzt sind.
dtparam=spi=on # Syntax für Raspberry 2 # dtoverlay=mcp2515-can1-overlay,oscillator=20000000,interrupt=24 # dtoverlay=mcp2515-can0-overlay,oscillator=20000000,interrupt=25 # Syntax für Raspberry 3/4 ist hier aktiviert dtoverlay=mcp2515-can1,oscillator=20000000,interrupt=24 dtoverlay=mcp2515-can0,oscillator=20000000,interrupt=25 dtoverlay=spi-bcm2835-overlay
can1 wird zuerst angegeben, damit das can0 Interface mit can0 angesprochen werden kannl.
- sudo reboot - Raspberry rebooten und kontrollieren, ob die SPI Controller korrekt erkannt wurde:
pi@raspberrypi:~ $ dmesg |grep spi [ 4.133354] mcp251x spi0.0 can0: MCP2515 successfully initialized. [ 4.145085] mcp251x spi0.1 can1: MCP2515 successfully initialized.
- Linux can-utils installieren mit:
sudo apt-get install can-utils
- Kernel Module laden (can-gw wird nur benötigt wenn man auch die Gateway Funktion mit cangw nutzen will.
sudo modprobe can sudo modprobe can-gw
damit cangw bei jedem Neustart automatisch geladen wird, sollte man es der Datei: /etc/modules eintragen:
# /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # für meine i2c Tests i2c-dev # CAN Gasteway support from Linux Kernel 3.2 can-gw
- CAN0 mit 100000 kBit/s starten:
sudo ip link set can0 up type can bitrate 100000
- und mit candump oder cansniffer testen ob was
- empfangen wird:
candump can0 cansniffer -c can0
Tipps und Tricks
- Für das Senden bzw. Logfiles abspielen empfiehlt es sich die Sendebuffer zu erhöhen:
sudo ip link set can0 txqueuelen 1000 sudo ip link set can1 txqueuelen 1000
- aktuellen Status der CAN-Schnittstellen anzeigen:
pi@raspberrypi:~/dev/socketcand $ ip -det link show can0 3: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 1000 link/can promiscuity 0 can state ERROR-ACTIVE restart-ms 200 bitrate 500000 sample-point 0.850 tq 100 prop-seg 8 phase-seg1 8 phase-seg2 3 sjw 1 mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1 clock 10000000numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
Wenn das Interface (CAN) im ERROR-ACTIVE State ist, ist alles in Ordnung. :-)
Ebenso habe ich noch die Automatic Bus Off Recovery zeit auf 200 ms gesetzt. (s. weiter unten)
Automatic Bus Off Recovery
Um das CAN-Interface nach einem Bus-Off oder Error-Passiv Zustand automatisch wieder zu starten, darf der restart-ms - Wert nicht 0 sein, sondern es muss die Zeit in ms angegeben werden mit der ein Restart durchgeführt werden soll. ( can state ERROR-PASSIVE restart-ms 0 )
Beispiel um die Zeit auf 200 ms zusetzen.
sudo ip link set canX type can restart-ms 200
Der Restart-Parameter kann auch oben beim Autostart hinzugefügt werden (/etc/network/interfaces)
Autostart (z.B. CAN-Bus mit 100 kBit/s beim Booten initialisieren)
In /etc/network/interfaces können die Interfaces konfiguriert werden, so daß beim Booten z.B. mit 100kBit/s initialisiert werden.
auto can0
iface can0 inet manual
pre-up ip link set $IFACE type can bitrate 100000 listen-only off
up /sbin/ifconfig $IFACE up
down /sbin/ifconfig $IFACE down
auto can1
iface can1 inet manual
pre-up ip link set $IFACE type can bitrate 100000 listen-only off
up /sbin/ifconfig $IFACE up
down /sbin/ifconfig $IFACE down
Im obigen Beispiel wird keine Bus-Off Recovery-Zeit gesetzt.
Wenn die Baudrate nun nicht geändert werden soll, können die CAN-Schnittstellen einfach mit ifdown und ifup ab/eingeschaltet werden:
sudo ifdown can0
sudo ifup can0
Um den Sendbuffer automatisch beim Login zu setzen, kann man folgendes in ~/.profile eintragen:
sudo ip link set can0 txqueuelen 1000
sudo ip link set can1 txqueuelen 1000
#autostart routing:
sudo cangw -F
sudo cangw -A -s can1 -d can0
sudo cangw -A -s can0 -d can1
Python CAN
Mit Python lassen sich sehr einfache Programme schreiben mit der man auf die CAN-Schnittstelle Zurgreifen kann. Hier: Python-CAN - Erste Schritte
..... in arbeit .... später mehr
Links
hier noch ein paar weitere nützliche Tools um den Raspberry Pi zum CAN-Anaylzer auszu bauen:
- Caring Caribou - CAN Analyzing Toolkit
- can-utils - Hier die Sourcen auf Github falls man es selber kompilieren will
- cangv - einfacher CAN-Sniffer Ersatz für Extended IDs
- Python-CAN - V3.3.2 - Python CAN Modul