Blue Flower

Pi-CAN-Duo

Einleitung

Dies ist ein DUAL CAN-Port Modul für den Raspberry Pi 2B, 3B, 3B+

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.

 

Schaltplan PI-CAN-Duo
Abb. 1 Schaltplan PI-CAN-Duo

 Layout

Toplayer
Abb. 1.2 Bestückungsseite PI-CAN-Duo

 

Bottomlayer PI-CAN-Duo
Abb.1.3 Leiterbahnseite PI-CAN-Duo

 Aufbau

 

PI-CAN-Duo eingebaut
Abb 1.4 PI-CAN-Duo eingebaut

Abb. 1.5 PI-CAN-Duo komplett verbaut

Hardware  (Version 0.2)

 Schaltplan

PI-CAN-Duo V0.2 Schaltplan (PDF)

 Aufbau
PI-CAN-Duo Version 0.2

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