activer can0 pour utiliser MCP2515 (module CAN BUS)

Des infos, des conseils sur les bus DSI,CSI, I2C, SPI... du Raspberry Pi

Modérateur : Francois

Répondre
tyd01
Messages : 3
Enregistré le : jeu. 16 nov. 2017 10:41

activer can0 pour utiliser MCP2515 (module CAN BUS)

Message par tyd01 » jeu. 16 nov. 2017 11:39

Avant-propos : désolé pour la mise en forme mais je ne parviens pas à activer les BBCodes...

Bonjour,

je souhaite faire dialoguer mon raspberry (pi zero w) avec un arduino (1seul pour commencer, plusieurs par la suite) à l'aide d'un bus CAN. Pour cela je me sert de modules MCP2515.

Toutefois je ne parviens pas à activer la connexion réseau can0, j'ai essayer de suivre des tutos mais je suis bloqué dés le début avec l'activation de l'overlay.

Il y'a quelques jours encore, je ne m'étais jamais intéressée au système de device-tree. Je pensais qu'il suffisait de faire un copier coller de la bonne ligne dans /boot/config.txt et que ça allait fonctionner ( :lol: retrospection :lol: ).
C'est en fouillant sur google à la recherche d'explication que je suis tombé sur l'article en anglais de raspberry.org sur le device-tree, et son équivalent en français sur ce site. A partir de là, j'ai mieux compris le fonctionnement de tout ça et j'ai pu commencer à chercher l'origine de mon problème.

Voila les opérations que j'ai effectuées :

Code : Tout sélectionner

pi@raspberrypi:~ $ sudo apt-get update && sudo apt-get upgrade
Ensuite j'ai ajouté les modifications suivantes sur mon fichier /boot/config.txt

Code : Tout sélectionner

disable bluetooth and switch ttyS0 and ttyAMA0 (ttyAMA0 on GPIO)
dtoverlay=pi3-disable-bt

#can module
dtoverlay=mcp2515-can0
dtparam=oscillator=8000000
dtparam=spimaxfrequency=500000
dtparam=interrupt=12

#debug
dtdebug=1
Après redémarrage, j'ai testé les overlays chargés, et les connexions disponibles :

Code : Tout sélectionner

pi@raspberrypi:~ $ dtoverlay -l
No overlays loaded
pi@raspberrypi:~ $ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.16  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::d8dc:1d60:3b9c:4077  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:ad:9e:9b  txqueuelen 1000  (Ethernet)
        RX packets 2086  bytes 167759 (163.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 310  bytes 72120 (70.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
Apparemment l'overlay mcp2515-can0 n'a pas été chargé correctement, jetons un coup d'oeil au boot debug log :

Code : Tout sélectionner

pi@raspberrypi:~ $ sudo vcdbg log msg
...
001940.104: brfs: File read: 818 bytes
001946.049: dtdebug: Opened overlay file 'overlays/mcp2515-can0.dtbo'
001947.933: brfs: File read: /mfs/sd/overlays/mcp2515-can0.dtbo
001957.141: Loaded overlay 'mcp2515-can0'
001957.172: dtparam: oscillator=8000000
001957.422: dtdebug: Found override oscillator
001957.469: dtdebug:   override oscillator: cell target clock-frequency @ offset 0 (size 4)
001958.012: dtparam: spimaxfrequency=500000
001958.271: dtdebug: Found override spimaxfrequency
001958.318: dtdebug:   override spimaxfrequency: cell target spi-max-frequency @ offset 0 (size 4)
001959.059: dtparam: interrupt=12
001959.321: dtdebug: Found override interrupt
001959.363: dtdebug:   override interrupt: cell target brcm,pins @ offset 0 (size 4)
001959.761: dtdebug:   override interrupt: cell target interrupts @ offset 0 (size 4)
001960.541: dtdebug: Found fragment 0 (offset 72)
001963.377: dtdebug: merge_fragment(/soc/spi@7e204000,/fragment@0/__overlay__)
001963.404: dtdebug:   +prop(status)
001964.228: dtdebug: merge_fragment() end
001964.286: dtdebug: Found fragment 1 (offset 148)
001967.319: dtdebug: merge_fragment(/soc/spi@7e204000/spidev@0,/fragment@1/__overlay__)
001967.344: dtdebug:   +prop(status)
001968.198: dtdebug: merge_fragment() end
001968.256: dtdebug: Found fragment 2 (offset 228)
001969.759: dtdebug: merge_fragment(/soc/gpio@7e200000,/fragment@2/__overlay__)
001971.805: dtdebug: merge_fragment(/soc/gpio@7e200000/can0_pins,/fragment@2/__overlay__/can0_pins)
001971.831: dtdebug:   +prop(brcm,pins)
001972.738: dtdebug:   +prop(brcm,function)
001973.656: dtdebug:   +prop(phandle)
001974.566: dtdebug: merge_fragment() end
001974.595: dtdebug: merge_fragment() end
001974.666: dtdebug: Found fragment 3 (offset 352)
001979.382: dtdebug: merge_fragment(/clocks,/fragment@3/__overlay__)
001982.751: dtdebug: merge_fragment(/clocks/can0_osc,/fragment@3/__overlay__/can0_osc)
001982.777: dtdebug:   +prop(compatible)
001983.185: dtdebug:   +prop(#clock-cells)
001983.631: dtdebug:   +prop(clock-frequency)
001984.078: dtdebug:   +prop(phandle)
001984.529: dtdebug: merge_fragment() end
001984.559: dtdebug: merge_fragment() end
001984.631: dtdebug: Found fragment 4 (offset 504)
001987.753: dtdebug: merge_fragment(/soc/spi@7e204000,/fragment@4/__overlay__)
001987.780: dtdebug:   +prop(#address-cells)
001988.590: dtdebug:   +prop(#size-cells)
001991.648: dtdebug: merge_fragment(/soc/spi@7e204000/mcp2515@0,/fragment@4/__overlay__/mcp2515@0)
001991.672: dtdebug:   +prop(reg)
001992.458: dtdebug:   +prop(compatible)
001993.239: dtdebug:   +prop(pinctrl-names)
001994.090: dtdebug:   +prop(pinctrl-0)
001994.961: dtdebug:   +prop(spi-max-frequency)
001995.841: dtdebug:   +prop(interrupt-parent)
001996.659: dtdebug:   +prop(interrupts)
001997.498: dtdebug:   +prop(clocks)
001998.365: dtdebug:   +prop(phandle)
001999.236: dtdebug: merge_fragment() end
...
Je ne vous ai reporté que la partie traitant le chargement de l'overlay en question, on voit que le système traite correctement les instructions que je lui ai donné dans le fichier config.txt.

Dans ce cas, est-ce que le module est correctement intégré à mon device-tree :

Code : Tout sélectionner

pi@raspberrypi:~ $ dtc -I fs /proc/device-tree
...
 mcp2515@0 {                              
         compatible = "microchip,mcp2515";
         clocks = <0x43>;                 
         interrupt-parent = <0xb>;        
         interrupts = <0xc 0x2>;          
         phandle = <0x44>;                
         reg = <0x0>;                     
         pinctrl-0 = <0x42>;              
         spi-max-frequency = <0x7a120>;   
         pinctrl-names = "default";       
 };                                       
...
Le module est bien là.

A ce niveau, ce qui me semble suspect, c'est de ne pas voir de propriété status sur ce nœud.

Est-ce que le module doit être physiquement branché pour que le système le détecte lors du boot et l'active ?
Et si oui, est-ce que le module doit être connecté sur un bus CAN actif également ?

Répondre

Retourner vers « Les BUS interfaces »