树莓派2-CH CAN HAT扩展板使用教程

产品概述

2-CH CAN HAT 是专为树莓派开发的一款隔离式的双通道CAN 通信功能的扩展板,具备有多重保护。

特点

  • 基于树莓派设计,适用于Raspberry Pi Zero/Zero W/Zero WH/2B/3B/3B+/4B
  • 采用MCP2515与SN65HVD230双芯片组合方案,支持2路CAN接口通信
  • 板载一体式电源隔离,可提供稳定的隔离电压,隔离端无须额外供电
  • 板载数字隔离芯片,信号隔离通信更安全、稳定性更好、抗干扰性更强
  • 板载SM24CANB(瞬态电压抑制管),防静电和瞬态尖峰电压
  • 板载电平转换电路,可通过跳线帽切换3.3V/5V的工作电平
  • 板载120Ω终端电阻,可通过跳线帽设置使能
  • 引出SPI控制接口,方便接入STM32/Arduino等主控板
  • 提供完善的配套资料手册及例程

产品参数

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

接口说明

CAN接口总线

功能引脚树莓派接口
(BCM)
树莓派接口
(WPI)
描述
5V5V5V5V电源正
GNDGNDGND电源地
MISO9(MISO)13(MISO)SPI时钟输入
MOSI10(MOSI)12(MOSI)SPI数据输入
SCK11(SCLK)14(SCLK)SPI数据输出
CS_08(CE0)10(CE0)CAN_0片选
INT_025(默认)/246(默认)/5CAN_0中断输出
CS_17(CE1)11(CE1)CAN_1片选
INT_123(默认)/224(默认)/3CAN_1中断输出

硬件说明

CAN总线

CAN 模块的功能是处理所有 CAN 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 SPI 接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作。通过读取相应的寄存器可以检查通讯状态和错误。 会对在 CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。
由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。
Microchip 的 MCP2515 是一款CAN协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2515 自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片不需要编写驱动,只需要打开设备树中的内核驱动即可使用。

更多详细请参考数据手册;
SN65HVD230 是德州仪器公司生产的 3.3V CAN 收发器,该器件适用于较高通信速率、良好抗干扰 能力和高可靠性 CAN 总线的串行通信。SN65HVD230 具有高速、斜率和等待 3 种不同的工作模式。 其工作模式控制可通过 Rs 控制引脚来实现。CAN 控制器的输出引脚 Tx 接到 SN65HVD230 的数据 输入端 D,可将此 CAN 节点发送的数据传送到 CAN 网络中;而 CAN 控制器的接收引脚 Rx 和 SN65HVD230 的数据输出端 R 相连,用于接收数据。

树莓派使用

在使用树莓派演示该例程时,需注意的是由于树莓派属于3.3V逻辑系统,需改变将2-CH CAN 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
  • 在官网上找到对应产品,在产品资料打开下载路径,在wiki中下载示例程序:
  • 得到解压包,解压并将程序复制到树莓派中。

前置工作

将模块插在树莓派上,然后修改开机脚本config.txt

  1. sudo nano /boot/config.txt

在最后一行加入如下:

  1. dtparam=spi=on
  2. dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=23
  3. dtoverlay=mcp2515-can1,oscillator=16000000,interrupt=25
  • 重启树莓派以应用所有设置:
  1. sudo reboot
  • 待树莓派重启后,查看SPI信息:
  1. dmesg | grep spi


  • 开启CAN:
  1. sudo ip link set can0 up type can bitrate 1000000
  2. sudo ip link set can1 up type can bitrate 1000000
  3. sudo ifconfig can0 txqueuelen 65536
  4. sudo ifconfig can1 txqueuelen 65536
  • 更多相关CAN内核指令可以查看:
  1. https://www.kernel.org/doc/Documentation/networking/can.txt
  • 查看ifconfig:
  1. ifconfig


开始测试

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


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

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

  1. candump can0

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

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


若手上有两个2-CH CAN 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平台,确保以及安装了python-can库
在发送之前要先创建一个can设备,因为前面只是启用MCP2515内核:

  1. os.system('sudo ip link set can0 type can bitrate 100000')
  2. os.system('sudo ifconfig can0 up')

上面这条则是通过对CAN0的配置初始化并启用,且指定CAN0作为发送/接收接口。如需改成CAN1,则代码如下:

  1. os.system('sudo ip link set can1 type can bitrate 100000')
  2. os.system('sudo ifconfig can1 up')
  • 第一步:连接到CAN总线
  1. can0 = can.interface.Bus(channel = 'can0', bustyp = 'socketcan_ctypes')
  • 需改成CAN1,则代码如下:
  1. can0 = can.interface.Bus(channel = 'can1', bustyp = 'socketcan_ctypes')
  • 第二步:创建信息
  1. msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False)
  • 第三步:发送信息
  1. can0.send(msg)
  • 需改成CAN1,则代码如下:
  1. can1.send(msg)
  • 最后同样要关闭can设备
  1. os.system('sudo ifconfig can0 down')
  • 需改成CAN1,则代码如下:
  1. os.system('sudo ifconfig can1 down')
  • 接收数据:
  1. msg = can0.recv(10.0)

recv()中定义超时接收时间。
更多请参考:https://python-can.readthedocs.io/en/stable/interfaces/socketcan.html

【WringPi例程】

  • 阻塞接收,树莓派打开终端,运行:
  1. cd 2-CH_CAN_HAT_Code/wiringPi/receive/
  2. make clean
  3. sudo make
  4. sudo ./can_receive
  • 发送,树莓派打开终端,运行:
  1. cd 2-CH_CAN_HAT_Code/ wiringPi/receive/
  2. make clean
  3. sudo make
  4. sudo ./can_send