本文介绍如何在树莓派上配置 CAN 总线模块 MCP2515,并使用基于SocketCAN的工具Can-utils实现 CAN 消息的收发。

MCP2515 概述:

Microchip 的 MCP2515 是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持 CAN V2.0B 技术规范。
该器件主要由三个部分组成:

  1. CAN 模块,包括 CAN 协议引擎、验收滤波寄存
    器、验收屏蔽寄存器、发送和接收缓冲器。
  2. 用于配置该器件及其运行的控制逻辑和寄存器。
  3. SPI 协议模块。

MCP2515的CAN总线模块-树莓派上使用 - 图1

MCP2515 芯片结构框图

图片和芯片概述引自 MCP2515 参考手册

获取硬件

淘宝上有许多商家在售 MCP2515 SPI 转 CAN 的控制器通信模块,并且这些模块大都集成了 CAN 收发器。这些模块可能看起来样式不同,但是基本的针脚接法是一致的。

MCP2515的CAN总线模块-树莓派上使用 - 图2

模块结构图

MCP2515的CAN总线模块-树莓派上使用 - 图3

模块电路图

图片引自某淘宝卖家

接线

  1. RPi Pin RPi Label CAN Module
  2. 02---------5V------------VCC
  3. 06---------GND-----------GND
  4. 19---------GPIO10--------MOSI (SI)
  5. 21---------GPIO9---------MISO (SO)
  6. 22---------GPIO25--------INT
  7. 23---------GPIO11--------SCK
  8. 24---------GPIO8---------CS

树莓派引脚图,引自pinout.xyz

MCP2515的CAN总线模块-树莓派上使用 - 图4

使能树莓派 SPI 并加载 MCP2515 内核驱动

为了激活 MCP2515 的驱动,需要在文件/boot/config.txt加如下几行:

  1. dtparam=spi=on
  2. dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
  3. dtoverlay=spi1-1cs

如果内核是 4.4.x 之前的版本,需要修改最后一行:

  1. dtparam=spi=on
  2. dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
  3. dtoverlay=spi-bcm2835-overlay

可以通过**uname -a**查看树莓派内核:

MCP2515的CAN总线模块-树莓派上使用 - 图5

MCP2515 device tree overlay 的具体参数说明请参考/boot/overlays/README

  1. Name: mcp2515-can0
  2. Info: Configures the MCP2515 CAN controller on spi0.0
  3. Load: dtoverlay=mcp2515-can0,<param>=<val>
  4. Params: oscillator Clock frequency for the CAN controller (Hz)
  5. spimaxfrequency Maximum SPI frequence (Hz)
  6. interrupt GPIO for interrupt signa

修改配置后重启树莓派查看 MCP2515 是否加载成功:

  1. pi@piv2:~ $ ls /sys/bus/spi/devices/spi0.0/net
  2. can0

看到 can0 说明已经加载成功

启动 CAN 接口

使用 ip link 命令启动 can 接口:

  1. pi@raspberrypi:~ $ sudo ip link set can0 up type can bitrate 500000 loopback on

bitrate 500000:比特率设置为 500k, 在这里比特率是波特率的两倍,所以波特率为 250k

loopback on : 将 MCP2515 的工作模式设置为环回模式

10.4 环回模式
环回模式允许器件内部的发送缓冲器和接收缓冲器之间进行报文的自发自收,而无需通过 CAN 总线。此模式可用于系统开发和测试。环回模式下,确认位 ACK 无效,器件接收自己发送的报文就象在接收来自其他节点的报文。环回模式是一种安静模式,即器件在此模式下不会发送任何报文(包括错误标志或确认信号)。该模式下 TXCAN 引脚处于隐性状态。

引自 MCP2515 中文手册。

启动成功后可以通过ifconfig can查看 can0 信息:

  1. pi@raspberrypi:~ $ ifconfig can0
  2. can0: flags=193<UP,RUNNING,NOARP> mtu 16
  3. unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)
  4. RX packets 23 bytes 52 (52.0 B)
  5. RX errors 0 dropped 0 overruns 0 frame 0
  6. TX packets 23 bytes 52 (52.0 B)
  7. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

如果需要修改参数配置,需要先关闭 can 接口:

  1. pi@raspberrypi:~ $ sudo ip link set can0 down

可以通过 help 查看支持的配置参数:

  1. pi@raspberrypi:~ $ ip link set can0 type can help
  2. Usage: ip link set DEVICE type can
  3. [ bitrate BITRATE [ sample-point SAMPLE-POINT] ] |
  4. [ tq TQ prop-seg PROP_SEG phase-seg1 PHASE-SEG1
  5. phase-seg2 PHASE-SEG2 [ sjw SJW ] ]
  6. [ dbitrate BITRATE [ dsample-point SAMPLE-POINT] ] |
  7. [ dtq TQ dprop-seg PROP_SEG dphase-seg1 PHASE-SEG1
  8. dphase-seg2 PHASE-SEG2 [ dsjw SJW ] ]
  9. [ loopback { on | off } ]
  10. [ listen-only { on | off } ]
  11. [ triple-sampling { on | off } ]
  12. [ one-shot { on | off } ]
  13. [ berr-reporting { on | off } ]
  14. [ fd { on | off } ]
  15. [ fd-non-iso { on | off } ]
  16. [ presume-ack { on | off } ]
  17. [ restart-ms TIME-MS ]
  18. [ restart ]
  19. [ termination { 0..65535 } ]
  20. Where: BITRATE := { 1..1000000 }
  21. SAMPLE-POINT := { 0.000..0.999 }
  22. TQ := { NUMBER }
  23. PROP-SEG := { 1..8 }
  24. PHASE-SEG1 := { 1..8 }
  25. PHASE-SEG2 := { 1..8 }
  26. SJW := { 1..4 }
  27. RESTART-MS := { 0 | NUMBER }

如果想要开机自动挂载 CAN 接口,在 / etc/network/interfaces 添加:

  1. auto can0
  2. iface can0 can static
  3. bitrate 500000

测试收发 CAN 消息

安装 SocketCAN工具 Can-utils

  1. pi@raspberrypi:~ $ sudo apt-get install can-utils

使用 cansend 发送单条 CAN 消息:

  1. pi@raspberrypi:~ $ cansend can0 123#AABBCCDDEEFF

MCP2515的CAN总线模块-树莓派上使用 - 图6

使用 cangen 发送随机 CAN 消息:

  1. pi@raspberrypi:~ $ cangen can0

MCP2515的CAN总线模块-树莓派上使用 - 图7

使用 Python 库收发 CAN 消息

python-can :为不同的 can 控制器硬件设备提供通用的接口和一系列的消息收发工具。

cantools : CAN 数据库解析,CAN 消息、诊断 DID 编解码,candump 输出解码。

使用 cantools 对 candump 输出解码:

MCP2515的CAN总线模块-树莓派上使用 - 图8

0x123 在数据库 DBC 中的定义:

MCP2515的CAN总线模块-树莓派上使用 - 图9

CAN 相关文章:

DBC 文件格式解析

CANoe 精选教程 | 自动化测试功能 - Test Module/Test Unit

不同格式 CAN 数据库(DBC、Excel、arxml 等)相互转化
https://zhuanlan.zhihu.com/p/173648955