2-CH CAN FD HAT

来自Waveshare Wiki
跳转至: 导航搜索
Sense HAT (B)
{{{name2}}}
{{{name3}}}
功能简介
特性 树莓派传感器扩展
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
' 无特性,不解释
接口 CAN RPi

说明

更新说明

在2022年4月左右我们推出了‘Rev2.1’版本(该版本及后续版本背面板名下有版本号)
2-CH FAN FD HAT diffVer.jpg
新版本特性:

  1. DC电路进行优化,新版本从DC接口供电能够给树莓派供电并稳定工作
  2. 背面增加堆叠配置电阻,通过修改电阻可以实现最多5路CAN接口拓展(三块拓展板)
  3. 默认配置支持官方驱动,驱动安装操作更简单;同时预留配置电阻以支持老版本驱动(老版本使用第三方驱动),实现完全兼容老版本

新版本使用只有驱动安装方式不同,详细见‘驱动安装’章节

  • 新版本仅支持内核版本为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中断输出

2-CH-CAN-FD-HAT-details-inter.jpg

总线说明

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接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件,更多详细请参考数据手册。
Hardware station.png

树莓派使用

硬件连接

接入树莓派使用时,必须加上增高座,然后排针穿过底板,效果如下:

注意:扩展板的排座是是无铅贴片工艺焊锡的,插拔排座的时候,尽量借助工具撬开排座,注意需要两侧均匀晃动撬动插拔;如果是用手作用直接作用在pcba上去掰动的话,因为排座和排针连接处数量多,总体插上去后还是很牢固,这样作业插拔很容易导致pcba和排座部分直接脱离虚焊的。

2-CH-CAN-FD-HAT-hardware-connnected.png

PS:使用 Bullseye 分支的系统时,建议使用“apt" 替换“apt-get”;且 Bullseye 分支的系统只支持 Python3。

在使用树莓派演示该例程时,需注意的是由于树莓派属于3.3V逻辑系统,需改变将2-CH CAN FD HAT的逻辑电压引脚跳帽到3.3V,如下图所示。
Use.png

前置工作

开启SPI接口

  • 打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config
选择Interfacing Options -> SPI -> Yes 开启SPI接口

RPI open spi.png
然后重启树莓派:

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 中添加:

上述是基于Raspbian OS系统下,若用在Ubuntu系统下,则config.txt路径一般是在: /boot/firmware/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,如下图所示
2-CH-CAN-FD-HAT-B-Mode.jpg

请在 /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 配置区选择 CE1D13CAN_1 配置区选择 SPI1_CE1D23,硬件改动参考下图:
2-CH-CAN-FD-HAT-2pcs.png

然后在 /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 中添加:

上述是基于Raspbian OS系统下,若用在Ubuntu系统下,则config.txt路径一般是在: /boot/firmware/config.txt
  • 在最后一行加入如下:
dtparam=spi=on
dtoverlay=waveshare-can-fd-hat-mode-a
  • 重启树莓派以应用所有设置:
sudo reboot
  • 待树莓派重启后,查看SPI信息:
dmesg | grep spi

A工作方式:
Pre-work3.png
B工作方式:
Pre-work4.png
注意1:出厂默认A模式,可通过更改电阻来实现B模式,A模式中两路CAN分别使用两组独立的SPI,B模式则是两路CAN共用一组SPI。如下图所示:
2-CH-CAN-17.jpg
注意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):数据比特率
相关比特率的设置参考示例,如下
2-CH-CAN-FD-HAT-sample-cmd.png

如果接收不到其他设备发送的 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

Pre-work5.png

CAN测试

  • 开始测试:

若手上只有一个2-CH CAN FD HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:
Test-1.png

  • 安装can-utils:
sudo apt-get install can-utils
  • 打开两个终端窗口:

其中一个终端输入接收CAN0数据指令:

candump can0

另外一个终端输入发送CAN1数据指令:

cansend can1 000#11.22.33.44
  • 演示效果如下:(左边为接收,右边为发送)

CAN-FD-test-88.png 若手上有两个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"
一般推荐固定到CAN10,CAN11以上。

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
因python-can版本升级为4.0.0后,对应代码改动如下,否则会报错:
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)
因python-can版本升级为4.0.0后,对应代码改动如下,否则会报错
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,如下图所示:
Arduino-1.png

  • 将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,打开两个串口监视器,可看到以下结果(左边为发送次数,右边为接收的数据):

2-CH-Can-hat-ardiuno-2.png

FAQ

是的,该版本目前确实存在bug,如果遇到此问题,建议重新烧录或降级为20240724或更早之前发布的版本,即可解决问题。


这似乎也是raspbian os新版本的一个bug(请见:https://github.com/raspberrypi/linux/issues/6407),可降级为20240724或更早之前发布的镜像版本,或尝试执行指令修复:。

sudo rpi-update pulls/6466


不支持与2-CH CAN HAT叠加使用,但可以2个2-CH CAN FD叠加使用。


CAN FD的理论速率上限是8Mbps,但实际应用,通信速率会受通信环境的干扰和通信距离等因素影响,具体以实际环境实测为准。


如果出现初始化失败,可以重启树莓派或者其他主控平台开发板,确保连线是否正确,及逻辑电压跳帽引脚是否选择正确。


G为信号地,也称隔离地。在工业环境当中,CAN受周围环境多变,为确保稳定性,两通信模块的G需要相连接。


芯片受周围所测环境、通信距离、线材、软件等多因素的影响。在高速通信时,数据波特率可能达不到所所标称的最高熟虑,用户需根据实际测量,确保稳定,选择适合的通信速度。


若初始化成功,且速度设置合适后,仍不可以正常通信。请检查下两块2-CH CAN FD HAT 的CAN_H是否与另外一块CAN_H相连,CAN_L是否与另外一块CAN_L相连,需注意的是这两条线不能接反,H对应H,L对应L。若没问题,请检查程序配置的CAN口是否正确,比如需要用到CAN0,程序代码却配置CAN1。同时也需要检查硬件是否连接正确且CAN接口存不存在短路问题,如下图所示,CAN接口与树莓派的HDMI接口误触引起短路,使得CAN不能正常通信,这时需要使用购买2-CH CAN FD HAT时配送的配件2×20PIN长排座进行增高处理。2-CH CAN FD HAT-15.png


理论上只要CAN ID不同,是可以接多个CAN设备进行通信的。但是,具体可接的数量受CAN子设备的通信量和电气负载等多种因素限制,需要自行根据实际应用实际测试。假设子设备通信数据量大,且实时性要求很高的话,有可能同时带2~3个设备都不行。


售后

联系人:林工
EMAIL:services@waveshare.net
电话:0755-83040712
QQ:3004506335
微信:扫下方二维码添加
Lxw.jpg

说明:进行售后服务前,请准备好客户信息(定货单位、定货人等),以供验证