🛠 Bus CAN : exploiter les deux contrôleurs DCAN avec can-utils
Objectifs
L'AM335x embarque DEUX contrôleurs CAN (DCAN) — un argument industriel massif face aux cartes grand public. Vous allez exposer le CAN0 sur les broches P8_17/P8_18 (les broches MCASP0 muxées en DCAN par l'overlay communautaire KCP-0001), configurer l'interface avec ip link, et échanger des trames avec can-utils entre deux nœuds.
Matériel
- 2 BeagleBone Black (ou 1 BBB + 1 second nœud CAN)
- 2 transceivers CAN 3,3 V (classe SN65HVD230 / TJA1050 en version 3,3 V) sur les broches P8_17/P8_18
- 2 résistances de terminaison 120 Ω (une à chaque extrémité du bus)
- Filage : CAN_H vers CAN_H, CAN_L vers CAN_L, masse commune entre les cartes
Code complet
sudo apt install can-utils device-tree-compiler
# Exposer CAN0 sur P8_17/P8_18 :
# - ancienne image : overlay KCP-0001 via le capemanager
echo cape_can | sudo tee /sys/devices/platform/bone_capemanager/slots
# - image récente : l'overlay est embarqué (KCP-0001) ou chargé via configfs
ls /sys/class/net/ # can0 doit apparaître
# Configurer l'interface (impérativement interface DOWN pour changer le débit)
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000
sudo ip link set can0 up
ip -details link show can0
# Émettre / écouter
candump can0 &
cansend can0 123#DEADBEEF
# Test seul sur une carte : activer le loopback interne
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000 loopback true
sudo ip link set can0 up
cansend can0 321#CAFEBABE && candump -n 1 can0
Vérification attendue
En loopback, candump reçoit la trame 321#CAFEBABE envoyée par cansend. En bus à deux cartes, cansend sur l'une fait apparaître la trame dans candump sur l'autre ; ip -details montre le bitrate 500000 actif et l'interface en UP.
Erreurs fréquentes
- Oublier les résistances de terminaison 120 Ω aux deux extrémités : trames corrompues, erreurs de CRC, interface qui passe en bus-off.
- Bitrates différents entre les deux nœuds : aucune trame ne passe sans message d'erreur explicite — toujours vérifier les deux côtés.
- Changer le bitrate interface active : ip link set type can bitrate exige le DOWN préalable.
- Relier CAN_H/CAN_L directement aux broches 3,3 V : il faut un transceivers différentiel ; les broches seules ne font pas un bus CAN.
- Oublier la masse commune entre les deux cartes : le différentiel ne « flotte » pas aussi bien qu'on le croit.
- L'overlay CAN est absent des images modernes par défaut : vérifier la présence de can0 avant de câbler (dmesg | grep -i can).
Autres tutoriels pour cette carte
- Premier boot de la BeagleBone Black avec un seul câble mini-USB
- Comprendre les triggers en pilotant les 4 LED utilisateur
- Bouton et LED avec Adafruit_BBIO, la bibliothèque historique
- Lire l'ADC 12 bits sans griller le SoC : la règle des 1,8 V
- Ajouter une horloge temps réel sur le bus I2C des capes
- Micro-HDMI : exploiter les limites d'affichage de la BBB
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash