本文介绍如何在树莓派上配置 CAN 总线模块 MCP2515,并使用基于SocketCAN的工具Can-utils实现 CAN 消息的收发。
MCP2515 概述:
Microchip 的 MCP2515 是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持 CAN V2.0B 技术规范。
该器件主要由三个部分组成:
- CAN 模块,包括 CAN 协议引擎、验收滤波寄存
器、验收屏蔽寄存器、发送和接收缓冲器。- 用于配置该器件及其运行的控制逻辑和寄存器。
- SPI 协议模块。
MCP2515 芯片结构框图
图片和芯片概述引自 MCP2515 参考手册
获取硬件
淘宝上有许多商家在售 MCP2515 SPI 转 CAN 的控制器通信模块,并且这些模块大都集成了 CAN 收发器。这些模块可能看起来样式不同,但是基本的针脚接法是一致的。
模块结构图
模块电路图
图片引自某淘宝卖家
接线
RPi Pin RPi Label CAN Module
02---------5V------------VCC
06---------GND-----------GND
19---------GPIO10--------MOSI (SI)
21---------GPIO9---------MISO (SO)
22---------GPIO25--------INT
23---------GPIO11--------SCK
24---------GPIO8---------CS
树莓派引脚图,引自pinout.xyz
使能树莓派 SPI 并加载 MCP2515 内核驱动
为了激活 MCP2515 的驱动,需要在文件/boot/config.txt加如下几行:
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi1-1cs
如果内核是 4.4.x 之前的版本,需要修改最后一行:
dtparam=spi=on
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25
dtoverlay=spi-bcm2835-overlay
可以通过**uname -a**
查看树莓派内核:
MCP2515 device tree overlay 的具体参数说明请参考/boot/overlays/README
:
Name: mcp2515-can0
Info: Configures the MCP2515 CAN controller on spi0.0
Load: dtoverlay=mcp2515-can0,<param>=<val>
Params: oscillator Clock frequency for the CAN controller (Hz)
spimaxfrequency Maximum SPI frequence (Hz)
interrupt GPIO for interrupt signa
修改配置后重启树莓派查看 MCP2515 是否加载成功:
pi@piv2:~ $ ls /sys/bus/spi/devices/spi0.0/net
can0
看到 can0 说明已经加载成功
启动 CAN 接口
使用 ip link 命令启动 can 接口:
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 信息:
pi@raspberrypi:~ $ ifconfig can0
can0: flags=193<UP,RUNNING,NOARP> mtu 16
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)
RX packets 23 bytes 52 (52.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 23 bytes 52 (52.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果需要修改参数配置,需要先关闭 can 接口:
pi@raspberrypi:~ $ sudo ip link set can0 down
可以通过 help 查看支持的配置参数:
pi@raspberrypi:~ $ ip link set can0 type can help
Usage: ip link set DEVICE type can
[ bitrate BITRATE [ sample-point SAMPLE-POINT] ] |
[ tq TQ prop-seg PROP_SEG phase-seg1 PHASE-SEG1
phase-seg2 PHASE-SEG2 [ sjw SJW ] ]
[ dbitrate BITRATE [ dsample-point SAMPLE-POINT] ] |
[ dtq TQ dprop-seg PROP_SEG dphase-seg1 PHASE-SEG1
dphase-seg2 PHASE-SEG2 [ dsjw SJW ] ]
[ loopback { on | off } ]
[ listen-only { on | off } ]
[ triple-sampling { on | off } ]
[ one-shot { on | off } ]
[ berr-reporting { on | off } ]
[ fd { on | off } ]
[ fd-non-iso { on | off } ]
[ presume-ack { on | off } ]
[ restart-ms TIME-MS ]
[ restart ]
[ termination { 0..65535 } ]
Where: BITRATE := { 1..1000000 }
SAMPLE-POINT := { 0.000..0.999 }
TQ := { NUMBER }
PROP-SEG := { 1..8 }
PHASE-SEG1 := { 1..8 }
PHASE-SEG2 := { 1..8 }
SJW := { 1..4 }
RESTART-MS := { 0 | NUMBER }
如果想要开机自动挂载 CAN 接口,在 / etc/network/interfaces 添加:
auto can0
iface can0 can static
bitrate 500000
测试收发 CAN 消息
pi@raspberrypi:~ $ sudo apt-get install can-utils
使用 cansend 发送单条 CAN 消息:
pi@raspberrypi:~ $ cansend can0 123#AABBCCDDEEFF
使用 cangen 发送随机 CAN 消息:
pi@raspberrypi:~ $ cangen can0
使用 Python 库收发 CAN 消息
python-can :为不同的 can 控制器硬件设备提供通用的接口和一系列的消息收发工具。
cantools : CAN 数据库解析,CAN 消息、诊断 DID 编解码,candump 输出解码。
使用 cantools 对 candump 输出解码:
0x123 在数据库 DBC 中的定义:
CAN 相关文章:
CANoe 精选教程 | 自动化测试功能 - Test Module/Test Unit
不同格式 CAN 数据库(DBC、Excel、arxml 等)相互转化
https://zhuanlan.zhihu.com/p/173648955