Bus Controller Area Network (CAN): Implementación para ODROID-C1+ y ODROID-XU4

Esta página explica cómo habilitar el bus CAN en ODROID-C1/C1+/C0 a través de la interfaz HW SPI. También se incluyen instrucciones detalladas de cómo intercambiar información con una placa MCP2515 Bus Monitor.

Conexión H/W

Los siguientes productos son necesarios para configurar el hardware:

  • ODROID-C1+
  • Kit Tinkering C
  • Módulo MCP2515_CAN

Figura 1 - Bus CAN

Figura 2 - Kit Kinkering ODROID

Figura 3 - Circuito de referencia

Figura 4 - Diagrama de la placa de pruebas

Figura 5 - Ilustración de la placa de pruebas

Figura 6 - Conectados el módulo CAN y ODROID-C1 usando el kit tinkering

Before installing the software, you must modify the mcp2515 driver to set the amlogic GPIO IRQ. Apply este parche a tu kernel. Descomprime el archivo zip y escribe "git apply odroid-c1-mcp251x.patch". A continuación, edita arch/arm/boot/dts/meson8b_odroidc.dts y elimina el signo de línea comentada de la sección can0.

Habilitar el driver del kernel controlador de CAN

La configuración para la plataforma ODROID-C1 con un chip MCP2515 es: Linux Kernel Configuration > Networking support > CAN bus subsystem support > CAN device drivers > Platform CAN drivers with Netlink support > CAN bit-timing calculation > Microchip MCP251x SPI CAN controller

Luego, actualiza el kernel y el sistema de archivos root. Recurre a estas instrucciones para compilar e instalar el kernel.

Verificar la configuración de soporte CAN

Carga todos los drivers necesarios, usando la contraseña de sudo "odroid":

$ sudo su
# modprobe can_raw
# modprobe spicc
# modprobe mcp251x mcp251x_enable_dma=1
Luego, verifica el driver CAN host:
# ls /sys/class/net/
can0  eth0  ip6tnl0  lo  sit0
# ifconfig can0
can0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          NOARP  MTU:16  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Encender el hardware CAN

Ajusta la tasa de bits antes de realizar cualquier operación, similar al siguiente ejemplo donde la tasa de bits de la interfaz can0 está configurada en 125 kbps:

# ip link set can0 type can bitrate 125000 triple-sampling on
# ifconfig can0 up
# ifconfig
can0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          UP RUNNING NOARP  MTU:16  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
 
eth0      Link encap:Ethernet  HWaddr 00:1e:06:10:18:1c  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:40 
 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1360 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1360 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:108256 (108.2 KB)  TX bytes:108256 (108.2 KB)

Instalar las utilidades SocketCAN

El paquete "can-utils" es un conjunto de drivers CAN y herramientas de red para Linux. Permite interactuar con dispositivos bus CAN de forma similar a otros dispositivos de red.

$ sudo apt install can-utils
Escribe los siguientes comandos para realizar una prueba de circuito cerrado en un único puerto CAN:
# ifconfig can0 down
# ip link set can0 type can bitrate 125000 loopback on
# ifconfig can0 up
# ip -details link show can0
5: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN mode DEFAULT group default qlen 10
    link/can  promiscuity 0 
    can <LOOPBACK,TRIPLE-SAMPLING> state ERROR-ACTIVE restart-ms 0 
          bitrate 125000 sample-point 0.875 
          tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
          mcp251x: tseg1 3..16 tseg2 2..8 sjw 1..4 brp 1..64 brp-inc 1
          clock 10000000
El siguiente comando muestra el mensaje recibido desde el bus CAN:
$ candump can0
En un segundo terminal, el siguiente comando envía 3 bytes sobre el bus (0x11, 0x22, 0x33) con el identificador 500:
$ cansend can0 500#11.22.33
Para probar la conexión CAN-bus entre 2 placas ODROID-C1, primero conecta los pines CANL y CANH de dos placas ODROID-C1.

Figura 7 - Conectando los pines CANL y CANH de dos placas ODROID-C1

Enciende ambas placas, luego escribe lo siguiente en el intérprete de comandos de ambas placas para configurar el dispositivo bus CAN:

$ modprobe can_raw
$ modprobe spicc
$ modprobe mcp251x mcp251x_enable_dma=1
$ ip link set can0 type can bitrate 125000 triple-sampling on
$ ifconfig can0 up
Escribe lo siguiente en el intérprete de comandos de la placa 1 (utilizada para probar la recepción de dispositivos can0):
$ candump can0
Escribe lo siguiente en el intérprete de comandos de la placa 2 (utilizado para probar el envío de paquetes de datos a través del dispositivo can0):
$ cansend can0 500#11.22.33
Llegados a este punto, la placa 1 recibirá el paquete de información enviado desde la placa 2:
# candump can0
  can0  500   [3]  11 22 33
  can0  500   [3]  11 22 33
Para comentarios, preguntas y sugerencias, visita la página de la Wiki en https://wiki.odroid.com/odroid-c1/application_note/gpio/can-bus.

Be the first to comment

Leave a Reply