树莓派双通道隔离型CAN FD总线扩展板使用教程

产品概述

2-CH CAN FD HAT 是为树莓派开发的一款隔离式的双通道CAN 通信功能的扩展板,支持CAN FD。仲裁波特率高达1Mbps,数据波特率也突破传统CAN2.0的1Mbps限制,具备有多重保护。

特点

  • 基于树莓派设计,适用于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,数据波特率突破传统CAN2.0的1Mbps限制。
  • 预留控制接口,方便其他逻辑电压为3.3V/5V的控制器控制。
  • CAN总线采用电气隔离,隔离电压可达5 kV。
  • 板载多个保护器件,具有短路保护,静电保护,有效抑制闪电和ESD,每通道均提供500W的雷击浪涌保护。
  • 接口带有120Ω终端电阻,可通过跳帽进行切换。
  • 可配置双通道CAN的工作方式,分别是双通道公用一组SPI或两通道分别使用两组独立的SPI。
  • 提供完善的配套资料手册及例程。

产品参数

  • 输入电压: 8~26V
  • 逻辑电压: 3.3V/5V
  • CAN控制芯片: MCP2518FD
  • CAN收发器: MCP2562FD
  • 产品尺寸: 65.0x56.5mm
  • 固定孔通经: 3.0mm

接口说明

CAN接口总线

功能引脚树莓派接口
(BCM)
树莓派接口
(WPI)
描述
5V5V5V5V电源正
GNDGNDGND电源地
MISO_09(MISO)13(MISO)SPI_0时钟输入
MOSI_010(MOSI)12(MOSI)SPI_0数据输入
SCK_011(SCLK)14(SCLK)SPI_0数据输出
CS_08(CE0)10(CE0)CAN_0片选
INT_0256CAN_0中断输出
MISO_19/19(MISO)13/24(MISO)SPI_1数据输出
MOSI_110/20(MOSI)12/28(MOSI)SPI_1数据输入
SCK_111/21(SCLK)14/29(SCLK)SPI_1时钟输入
CS_17(CE1)/2611(CE1)/25CAN_1片选
INT_11627CAN_1中断输出

硬件说明

CAN总线

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,如下图所示。

安装必要的函数库

  • 安装BCM2835, 打开树莓派终端,并运行以下指令
  1. wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz
  2. tar zxvf bcm2835-1.60.tar.gz
  3. cd bcm2835-1.60/
  4. sudo ./configure
  5. sudo make
  6. sudo make check
  7. sudo make install
  8. # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
  • 安装wiringPi
  1. sudo apt-get install wiringpi
  2. #对于树莓派4B可能需要进行升级:
  3. wget https://project-downloads.drogon.net/wiringpi-latest.deb
  4. sudo dpkg -i wiringpi-latest.deb
  5. gpio -v
  6. # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错
  • 安装Python函数库
  1. #python2
  2. sudo apt-get update
  3. sudo apt-get install python-pip
  4. sudo apt-get install python-pil
  5. sudo apt-get install python-numpy
  6. sudo pip install RPi.GPIO
  7. sudo pip install spidev
  8. sudo pip2 install python-can
  9. #python3
  10. sudo apt-get update
  11. sudo apt-get install python3-pip
  12. sudo apt-get install python3-pil
  13. sudo apt-get install python3-numpy
  14. sudo pip3 install RPi.GPIO
  15. sudo pip3 install spidev
  16. sudo pip3 install python-can

前置工作

  • 下载及解压例程和驱动:
  1. cd ~
  2. wget wget https://www.waveshare.net/w/upload/4/46/2-CH-CAN-FD-HAT-Demo.7z
  3. 7z x 2-CH-CAN-FD-HAT-Demo.7z -o./2-CH-CAN-FD-HAT-Demo
  • 安装例程依赖的Linux 内核驱动:
  • 浏览目录及修改文件权限:
  1. cd ~/2-CH-CAN-FD-HAT-Demo/Raspberry_Pi/
  2. sudo chmod -R 777 Linux_Driver/
  3. cd Linux_Driver/
  4. ls


  • 运行安装程序
  1. sudo ./install.sh
  • 等待安装完成则会显示:


  • 重启树莓派以应用所有设置:
  1. sudo reboot
  • 待树莓派重启后,查看SPI信息:
  1. dmesg | grep spi

A工作方式: 

B工作方式:

注意1:出厂默认A模式,可通过更改电阻来实现B模式,A模式中两路CAN分别使用两组独立的SPI,B模式则是两路CAN公用一组SPI。如下图所示:

注意2:因为采用了兼容的检测方式,所以在初始化时会有额外的信息,不影响正常使用,可忽视

配置CAN,设置波特率,工作模式,是否开启FD及配置传输缓冲区大小:

  • 波特率设置:
  1. sudo ip link set can0 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on
  2. sudo ip link set can1 up type can bitrate 1000000 dbitrate 8000000 restart-ms 1000 berr-reporting on fd on
  3. sudo ifconfig can0 txqueuelen 65536
  4. 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:
  1. ifconfig


  • 开始测试:

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

  • 打开两个终端窗口:

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

  1. candump can0

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

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


若手上有两个2-CH CAN FD HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。

Python例程

  • 浏览目录:
  • 接收端运行receive.py:
  1. sudo python reveive.py
  • 发送端运行send.py:
  1. 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')

  • 第一步:连接到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相连接,具体接线如下表所示:
功能引脚开发板
5V5V
GNDGND
MISO_0D12 (MISO)
MOSI_0D11 (MOSI)
SCK_0D13 (SCK)
CS_0D10
INT_0D2
  • 将两个2-CH CAN FD HAT 的CAN_0的H、L两两相连,设置波特率为115200,打开两个串口监视器,可看到以下结果(左边为发送次数,右边为接收的数据):