2-CH CAN FD HAT 是为树莓派开发的一款隔离式的双通道CAN 通信功能的扩展板,支持CAN FD。仲裁波特率高达1Mbps,数据波特率也突破传统CAN2.0的1Mbps限制,具备有多重保护。
功能引脚 | 树莓派接口 (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 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 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接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件,更多详细请参考数据手册。
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,如下图所示。
- 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/
- sudo apt-get install wiringpi
- #对于树莓派4B可能需要进行升级:
- wget https://project-downloads.drogon.net/wiringpi-latest.deb
- sudo dpkg -i wiringpi-latest.deb
- gpio -v
- # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错
- #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
- cd ~
- wget 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/
- sudo chmod -R 777 Linux_Driver/
- cd Linux_Driver/
- ls
- sudo ./install.sh
- sudo reboot
- dmesg | grep spi
A工作方式:
B工作方式:
注意1:出厂默认A模式,可通过更改电阻来实现B模式,A模式中两路CAN分别使用两组独立的SPI,B模式则是两路CAN公用一组SPI。如下图所示:
注意2:因为采用了兼容的检测方式,所以在初始化时会有额外的信息,不影响正常使用,可忽视
- 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
若手上只有一个2-CH CAN FD HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:
其中一个终端输入接收CAN0数据指令:
- candump can0
另外一个终端输入发送CAN1数据指令:
- cansend can1 000##111.22.33.44
若手上有两个2-CH CAN FD HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。
- sudo python reveive.py
- sudo python send.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')
can0 = can.interface.Bus(channel = 'can0', bustype = 'socketcan_ctypes')# socketcan_native
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.send(msg)
os.system('sudo ifconfig can0 down')
os.system('sudo ifconfig can1 down')
msg = can0.recv(10.0) recv()中定义超时接收时间。
更多请参考:https://python-can.readthedocs.io/en/stable/interfaces/socketcan.html
本例程是基于Pierre Molinaro的MCP2517FD的例程进行改写,以适应2-CH CAN FD HAT,在此对Pierre Molinaro的付出表示感谢。在该例程中需要两个Arduino板子及两个2-CH CAN FD HAT,需注意的是Arduino属于5V逻辑系统,需改变将2-CH CAN FD HAT的逻辑电压引脚跳帽到5V,如下图所示:
功能引脚 | 开发板 |
5V | 5V |
GND | GND |
MISO_0 | D12 (MISO) |
MOSI_0 | D11 (MOSI) |
SCK_0 | D13 (SCK) |
CS_0 | D10 |
INT_0 | D2 |