2-CH CAN FD HAT
| |||||||||||||||||||||
| |||||||||||||||||||||
说明
更新说明
在2022年4月左右我们推出了‘Rev2.1’版本(该版本及后续版本背面板名下有版本号)
新版本特性:
- DC电路进行优化,新版本从DC接口供电能够给树莓派供电并稳定工作
- 背面增加堆叠配置电阻,通过修改电阻可以实现最多5路CAN接口拓展(三块拓展板)
- 默认配置支持官方驱动,驱动安装操作更简单;同时预留配置电阻以支持老版本驱动(老版本使用第三方驱动),实现完全兼容老版本
新版本使用只有驱动安装方式不同,详细见‘驱动安装’章节
- 新版本仅支持内核版本为5.4.77及之后的系统
产品参数
- 输入电压: 8~28V
- 逻辑电压: 3.3V/5V
- CAN控制芯片: MCP2518FD
- 产品尺寸: 65.0x56.5mm
- 固定孔通经: 3.0mm
接口说明
功能引脚 | 树莓派接口 (BCM) |
树莓派接口 (WPI) |
描述 |
5V | 5V | 5V | 5V电源正 |
GND | GND | GND | 电源地 |
MISO_0 | 9(MISO) | 13(MISO) | SPI_0数据输出 |
MOSI_0 | 10(MOSI) | 12(MOSI) | SPI_0数据输入 |
SCK_0 | 11(SCLK) | 14(SCLK) | SPI_0时钟输入 |
CS_0 | 8(CE0)/7(CE1) | 10(CE0)/11(CE1) | CAN_0片选 |
INT_0 | 25/13 | 6/23 | CAN_0中断输出 |
MISO_1 | 19(MISO)/9 | 24(MISO)/13 | SPI_1数据输出 |
MOSI_1 | 20(MOSI)/10 | 28(MOSI)/12 | SPI_1数据输入 |
SCK_1 | 21(SCLK)/11 | 29(SCLK)/14 | SPI_1时钟输入 |
CS_1 | 18(SPI1_CE0)/17/16/26 | 1/0/27/25 | CAN_1片选 |
INT_1 | 24/23/22/16 | 5/4/3/27 | CAN_1中断输出 |
总线说明
CAN 模块的功能是处理所有 CAN 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 SPI 接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作。通过读取相应的寄存器可以检查通讯状态和错误。 会对在 CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。
由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。
MCP2518FD是Microchip公司生产的一款CAN FD(灵活数据速率)控制器,完全支持经典格式(CAN2.0)和CAN灵活数据速率(CAN FD)格式的CAN成帧。仲裁比特率高达1Mbps,数据波特率也突破传统CAN2.0的1Mbps限制,SPI时钟速度高达20MHz符合ISO11898-1:2015标准。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2518FD 自带的32个灵活的滤波器和屏蔽对象可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件,更多详细请参考数据手册。
树莓派使用
硬件连接
接入树莓派使用时,必须加上增高座,然后排针穿过底板,效果如下:
在使用树莓派演示该例程时,需注意的是由于树莓派属于3.3V逻辑系统,需改变将2-CH CAN FD HAT的逻辑电压引脚跳帽到3.3V,如下图所示。
前置工作
开启SPI接口
- 打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config 选择Interfacing Options -> SPI -> Yes 开启SPI接口
sudo reboot
请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查
函数库安装
- 安装Python函数库
#python2 sudo apt-get update sudo apt-get install python-pip sudo apt-get install python-pil sudo apt-get install python-numpy sudo pip install RPi.GPIO sudo pip install spidev sudo pip2 install python-can #python3 sudo apt-get update sudo apt-get install python3-pip sudo apt-get install python3-pil sudo apt-get install python3-numpy sudo pip3 install RPi.GPIO sudo pip3 install spidev sudo pip3 install python-can
驱动安装(新版)
注意:在2022年4月左右我们推出了‘Rev2.1’版本(背面板名下有版本号),该章节仅适用于‘Rev2.1’及以后的版本,如果你是用的是旧版本请阅读‘驱动安装(旧版)’章节
可以通过修改0R电阻以灵活调整使用的SPI和中断引脚,选择以下任一模式即可
双SPI模式
'A' 模式(默认模式),分别用 SPI0-0 和 SPI1-0 控制两路CAN,板子正面的AB模式焊点无须做改动,即:
CAN_0 使用 SPI0-0,中断引脚为25,CAN_1 使用 SPI1-0,中断引脚为24。
修改config.txt脚本
请在 /boot/config.txt 中添加:
在最后一行加入如下:
dtparam=spi=on dtoverlay=spi1-3cs dtoverlay=mcp251xfd,spi0-0,interrupt=25 dtoverlay=mcp251xfd,spi1-0,interrupt=24
添加完成后重启,进入‘配置CAN’章节
单SPI模式
'B' 模式,使用 SPI0-0 和 SPI0-1 控制两路 CAN 输出,只需将模块正面的四个0R电阻挪到 'B' 模式位置,即:
CAN_0 使用 SPI0-0,中断引脚为25,CAN_1 使用 SPI0-1,中断引脚为24,如下图所示
请在 /boot/config.txt 中添加:
dtoverlay=spi1-3cs dtoverlay=mcp251xfd,spi0-0,interrupt=25 dtoverlay=mcp251xfd,spi0-1,interrupt=24
添加完成后重启,进入‘配置CAN’章节
堆叠模式
- 原理:修改背面的 CAN_x PIN SELECTION(x为0或1) 区域的 0R 电阻以改变CAN控制器使用的 CE 和 INT 引脚
- 注意:在需要堆叠使用时,硬件配置需要保持在双SPI模式('A' 模式,默认设置)
- CAN_0 有两组可选择:
CE_0 | INT_0 | config 设置 | 描述 |
---|---|---|---|
CE0 | D25 | dtoverlay=mcp251xfd,spi0-0,interrupt=25 | CAN_1 使用 SPI0-0,中断引脚为25 |
CE1 | D13 | dtoverlay=mcp251xfd,spi0-1,interrupt=13 | CAN_1 使用 SPI0-1,中断引脚为13 |
- CAN_1 有三组可选择:
CE_1" | INT_1 | config 设置 | 描述 |
---|---|---|---|
SPI1_CE0 | D24 | dtoverlay=mcp251xfd,spi1-0,interrupt=24 | CAN_1 使用 SPI1-0,中断引脚为24 |
SPI1_CE1 | D23 | dtoverlay=mcp251xfd,spi1-1,interrupt=23 | CAN_1 使用 SPI1-1,中断引脚为23 |
SPI1_CE2 | D22 | dtoverlay=mcp251xfd,spi1-2,interrupt=22 | CAN_1 使用 SPI1-2,中断引脚为22 |
细心的朋友可能会看到还有一组配置没有写出,这是为了兼容老版本预留,新用户可以无视
使用举例
- 你有两块板子需要使用4路CAN怎么配置呢?
答:第一块板子不做修改,第二块板子背面的 CAN_0
配置区选择 CE1 和 D13,CAN_1
配置区选择 SPI1_CE1 和 D23,硬件改动参考下图:
然后在 /boot/config.txt 最后添加:
dtparam=spi=on dtoverlay=spi1-3cs dtoverlay=mcp251xfd,spi0-0,interrupt=25 dtoverlay=mcp251xfd,spi0-1,interrupt=13 dtoverlay=mcp251xfd,spi1-0,interrupt=24 dtoverlay=mcp251xfd,spi1-1,interrupt=23
添加完成后重启,进入‘配置CAN’章节
兼容模式
- 新版本为了兼容标准SPI调整了一些默认设置,所以想要和老版本兼容需要做一些修改
- 兼容A模式:CE_1" 电阻选择到 D26;INT_1 电阻选择到 D16
- 兼容B模式:CE_1" 可以不修改,没有影响;INT_1 电阻选择到 D16
- 驱动安装参照‘驱动安装(旧版)章节’
驱动安装(旧版)
注意:在2022年4月左右我们推出了‘Rev2.1’版本,该章节仅适用于‘Rev2.1’之前的版本(背面没有版本信息),如果你是用的是新版本请阅读上一章节‘驱动安装(新版)’
请在 /boot/config.txt 中添加:
- 在最后一行加入如下:
dtparam=spi=on dtoverlay=waveshare-can-fd-hat-mode-a
- 重启树莓派以应用所有设置:
sudo reboot
- 待树莓派重启后,查看SPI信息:
dmesg | grep spi
A工作方式:
B工作方式:
注意1:出厂默认A模式,可通过更改电阻来实现B模式,A模式中两路CAN分别使用两组独立的SPI,B模式则是两路CAN共用一组SPI。如下图所示:
注意2:因为采用了兼容的检测方式,所以在初始化时会有额外的信息,不影响正常使用,可忽视
配置CAN
设置波特率,工作模式,是否开启FD及配置传输缓冲区大小:
- 波特率设置:
sudo ip link set can0 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on
bitrate xxxxxx (bps):仲裁比特率
dbitrate xxxxxx (bps):数据比特率
相关比特率的设置参考示例,如下
如果接收不到其他设备发送的 CAN FD 帧数据,可以尝试在命令最后追加 sample-point .8 dsample-point .8,注意:采样点设置(.8)需要和发送端相同
- 可配置成以下模式:
[ loopback { on | off } ]
[ listen-only { on | off } ]
[ triple-sampling { on | off } ]
[ one-shot { on | off } ]
[ berr-reporting { on | off } ]
FD是开启指令:
[ fd { on | off } ]
[ fd-non-iso { on | off } ]
更多相关CAN内核指令可以查看:
https://www.kernel.org/doc/Documentation/networking/can.txt
- 配置缓冲区
sudo ifconfig can0 txqueuelen 65536 sudo ifconfig can1 txqueuelen 65536
- 查看ifconfig:
ifconfig
CAN测试
- 开始测试:
若手上只有一个2-CH CAN FD HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:
- 安装can-utils:
sudo apt-get install can-utils
- 打开两个终端窗口:
其中一个终端输入接收CAN0数据指令:
candump can0
另外一个终端输入发送CAN1数据指令:
cansend can1 000#11.22.33.44
- 演示效果如下:(左边为接收,右边为发送)
若手上有两个2-CH CAN FD HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。
固定设备号
如果使用时发现 CAN 接口的系统设备号和板卡接口名称对不上,可以使用以下方法固定设备号:
- 在 /etc/udev/rules.d 目录下个创建一个 rules 文件:
sudo nano /etc/udev/rules.d/80-can.rules
- 将下面的内容添加到文件中:
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.0/net/can?", NAME="can0" ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.1/net/can?", NAME="can1" ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.0/net/can?", NAME="can1"
- 如果是堆叠使用可以根据自己需求添加相应的命令,只需要修改 DEVPATH 和 NAME,例如将 spi1-1 命名为 can3:
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.1/net/can?", NAME="can3"
Python例程
- 下载及解压例程和驱动(已下载可以跳过):
cd ~ wget https://www.waveshare.net/w/upload/4/46/2-CH-CAN-FD-HAT-Demo.7z 7z x 2-CH-CAN-FD-HAT-Demo.7z -o./2-CH-CAN-FD-HAT-Demo
- 进入程序目录:
cd 2-CH-CAN-FD-HAT-Demo/Raspberry_Pi/Python/
- 接收端运行receive0.py:
sudo python receive0.py
- 发送端运行send1.py:
sudo python send1.py
需注意的是这里的发送端是使用CAN1发送,接收端则是CAN0,具体修改可以参照下面的代码分析。
代码分析
本例程是基于python平台,确保以及安装了python-can库在发送之前要先创建一个can设备,因为前面只是启用MCP2518FD内核:
os.system('sudo ip link set can0 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on')
上面这条则是通过对CAN0的配置初始化并启用,且指定CAN0作为发送/接收接口。如需改成CAN1,则代码如下:
os.system('sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on')
第一步:连接到CAN总线
can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan_ctypes')# socketcan_native
can1 = can.interface.Bus(channel = 'can0', bustype = 'socketcan')
- 需改成CAN1,则代码如下:
can1 = can.interface.Bus(channel = 'can1', bustype = 'socketcan')# socketcan_native
第二步:创建信息
msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False)
msg = can.Message(is_extended_id=False, arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7])
第三步:发送信息
can0.send(msg)
- 需改成CAN1,则代码如下:
can1.send(msg)
- 最后同样要关闭can设备
os.system('sudo ifconfig can0 down')
- 需改成CAN1,则代码如下:
os.system('sudo ifconfig can1 down')
- 接收数据:
msg = can0.recv(10.0)
recv()中定义超时接收时间。
更多请参考:https://python-can.readthedocs.io/en/stable/interfaces/socketcan.html
Arduino使用
本例程是基于Pierre Molinaro的MCP2517FD的例程进行改写,以适应2-CH CAN FD HAT,在此对Pierre Molinaro的付出表示感谢。在该例程中需要两个Arduino板子及两个2-CH CAN FD HAT,需注意的是Arduino属于5V逻辑系统,需改变将2-CH CAN FD HAT的逻辑电压引脚跳帽到5V,如下图所示:
- 将2-CH CAN FD HAT与Arduino相连接,具体接线如下表所示:
功能引脚 | 开发板 |
5V | 5V |
GND | GND |
MISO_0 | D12 (MISO) |
MOSI_0 | D11 (MOSI) |
SCK_0 | D13 (SCK) |
CS_0 | D10 |
INT_0 | D2 |
- 将两个2-CH CAN FD HAT 的CAN_0的H、L两两相连,设置波特率为115200,打开两个串口监视器,可看到以下结果(左边为发送次数,右边为接收的数据):
FAQ
这似乎也是raspbian os新版本的一个bug(请见:https://github.com/raspberrypi/linux/issues/6407),可降级为20240724或更早之前发布的镜像版本,或尝试执行指令修复:。
sudo rpi-update pulls/6466