2-CH CAN FD HAT
| |||||||||||||||||||||
| |||||||||||||||||||||
| |||||||||||||||||||||
|
目录
产品概述
2-CH CAN FD HAT 是微雪电子为树莓派开发的一款隔离式的双通道CAN 通信功能的扩展板,支持CAN FD。最高传输速率可高达8Mbps,具备有多重保护。
特点
- 基于树莓派设计,适用于Raspberry Pi Zero/Zero W/Zero WH/2B/3B/3B+/4B。
- 支持8~24V的外部宽电压同时给树莓派和2-CH CAN FD HAT进行供电或者由树莓派直接给2-CH CAN FD HAT进行供电。
- 支持CAN FD,最高传输速率可高达8Mbps。
- 预留控制接口,方便其他逻辑电压为3.3V/5V的控制器控制。
- CAN总线采用电气隔离,隔离电压可达5 kV。
- 板载多个保护器件,具有短路保护,静电保护,有效抑制闪电和ESD,每通道均提供500W的雷击浪涌保护。
- 接口带有120Ω终端电阻,可通过跳帽进行切换。
- 可配置双通道CAN的工作方式,分别是双通道公用一组SPI或两通道分别使用两组独立的SPI。
- 提供完善的配套资料手册及例程。
产品参数
- 输入电压: 8~26V
- 逻辑电压: 3.3V/5V
- CAN控制芯片: MCP2517FD
- CAN收发器: MCP2562FD
- 产品尺寸: 65.0x56.5mm
- 固定孔通经: 3.0mm
接口说明
CAN接口总线
功能引脚 | 树莓派接口 (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) | 10(CE0) | CAN_0片选 |
INT_0 | 25 | 6 | CAN_0中断输出 |
MISO_1 | 9/19(MISO) | 13/24(MISO) | SPI_1数据输出 |
MOSI_1 | 10/20(MOSI) | 12/28(MOSI) | SPI_1数据输入 |
SCK_1 | 11/21(SCLK) | 14/29(SCLK) | SPI_1时钟输入 |
CS_1 | 7(CE1)/26 | 11(CE1)/25 | CAN_1片选 |
INT_1 | 16 | 27 | CAN_1中断输出 |
硬件说明
=CAN总线
CAN 模块的功能是处理所有 CAN 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 SPI 接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作。通过读取相应的寄存器可以检查通讯状态和错误。 会对在 CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。
由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。
MCP2517FD是Microchip公司生产的一款CAN FD(灵活数据速率)控制器,完全支持经典格式(CAN2.0)和CAN灵活数据速率(CAN FD)格式的CAN成帧。仲裁比特率高达1Mbps,数据比特率高达8Mbps,SPI时钟速度高达20MHz符合ISO11898-1:2015标准。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2517FD 自带的32个灵活的滤波器和屏蔽对象可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件,更多详细请参考数据手册。
MCP2562FD是Microchip公司生产的第二代高速CAN收发器,它用于 CAN协议控制器与物理CAN总线之间的接口,支持CAN FD所需的更高数据速率,改善了最大传播延迟以支持更长的总线长度。MCP2562FD符合甚至超过汽车对CAN FD传输速率(5 Mbps)的要求、低静态电流、电磁兼容性(EMC)及静电放电(ESD)的要求,符合ISO-11898-5 物理标准及AEC-Q100 0级的测试标准,最多可连接最多可连接112个节点,更多详细请参考数据手册。
树莓派使用
在使用树莓派演示该例程时,需注意的是由于树莓派属于3.3V逻辑系统,需改变将2-CH CAN FD HAT的逻辑电压引脚跳帽到3.3V,如下图所示。
安装必要的函数库
- 安装BCM2835, 打开树莓派终端,并运行一下指令
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz tar zxvf bcm2835-1.60.tar.gz cd bcm2835-1.60/ sudo ./configure sudo make sudo make check sudo make install # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
- 安装wiringPi
sudo apt-get install wiringpi #对于树莓派4B可能需要进行升级: cd bcm2835-1.60/ wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错
- 安装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
- 在官网上找到对应产品,在产品资料打开下载路径,在wiki中下载示例程序:
- 得到解压包,解压并将程序复制到树莓派中。
前置工作
- 安装例程依赖的Linux 内核驱动
- 浏览目录:
ls
- 运行安装程序
sudo ./install.sh
- 等待安装完成则会显示:
- 重启树莓派以应用所有设置:
sudo reboot
- 待树莓派重启后,查看SPI信息:
dmesg | grep spi
A工作方式:
B工作方式:
注:B工作模式可能会提示CAN重命名提示,不影响使用,可忽视。
配置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 sudo ifconfig can0 txqueuelen 65536 sudo ifconfig can1 txqueuelen 65536
bitrate xxxxxx (bps) dbitrate xxxxxx (bps)
- 可配置成以下模式:
[ 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
- 查看ifconfig:
ifconfig
- 开始测试:
若手上只有一个2-CH CAN FD HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:
- 打开两个终端窗口:
其中一个终端输入接收CAN0数据指令:
candump can0
另外一个终端输入发送CAN1数据指令:
cansend can1 000##11.22.33.44
- 演示效果如下:(左边为接收,右边为发送)
若手上有两个2-CH CAN FD HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。
Python例程
- 浏览目录:
- 接收端运行receive.py:
sudo python reveive.py
- 发送端运行send.py:
sudo python send.py
需注意的是这里的发送端是使用CAN1发送,接收端则是CAN0,具体修改可以参照下面的代码分析。
代码分析
本例程是基于python平台,确保以及安装了python-can库在发送之前要先创建一个can设备,因为前面只是启用MCP2517FD内核:
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,则代码如下:
can1 = can.interface.Bus(channel = 'can1', bustype = 'socketcan_ctypes')# socketcan_native
- 第二步:创建信息
msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False)
- 第三步:发送信息
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
|
|
|
|
|
|
|