2-CH CAN HAT 是专为树莓派开发的一款隔离式的双通道CAN 通信功能的扩展板,具备有多重保护。
功能引脚 | 树莓派接口 (BCM) | 树莓派接口 (WPI) | 描述 |
5V | 5V | 5V | 5V电源正 |
GND | GND | GND | 电源地 |
MISO | 9(MISO) | 13(MISO) | SPI时钟输入 |
MOSI | 10(MOSI) | 12(MOSI) | SPI数据输入 |
SCK | 11(SCLK) | 14(SCLK) | SPI数据输出 |
CS_0 | 8(CE0) | 10(CE0) | CAN_0片选 |
INT_0 | 25(默认)/24 | 6(默认)/5 | CAN_0中断输出 |
CS_1 | 7(CE1) | 11(CE1) | CAN_1片选 |
INT_1 | 23(默认)/22 | 4(默认)/3 | CAN_1中断输出 |
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,如下图所示。
- 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
将模块插在树莓派上,然后修改开机脚本config.txt
- sudo nano /boot/config.txt
在最后一行加入如下:
- dtparam=spi=on
- dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=23
- dtoverlay=mcp2515-can1,oscillator=16000000,interrupt=25
- sudo reboot
- dmesg | grep spi
- sudo ip link set can0 up type can bitrate 1000000
- sudo ip link set can1 up type can bitrate 1000000
- sudo ifconfig can0 txqueuelen 65536
- sudo ifconfig can1 txqueuelen 65536
- ifconfig
若手上只有一个2-CH CAN HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:
- sudo apt-get install can-utils
其中一个终端输入接收CAN0数据指令:
- candump can0
另外一个终端输入发送CAN1数据指令:
- cansend can1 000#11.22.33.44
若手上有两个2-CH CAN HAT,可以直接将CAN_H,CAN_L两两相连。效果跟上述一样,需注意匹配好通信速率,识别ID,输出接口序号。
- sudo python reveive.py
- sudo python send.py
需注意的是这里的发送端是使用CAN1发送,接收端则是CAN0,具体修改可以参照下面的代码分析。
本例程是基于python平台,确保以及安装了python-can库
在发送之前要先创建一个can设备,因为前面只是启用MCP2515内核:
- os.system('sudo ip link set can0 type can bitrate 100000')
- os.system('sudo ifconfig can0 up')
上面这条则是通过对CAN0的配置初始化并启用,且指定CAN0作为发送/接收接口。如需改成CAN1,则代码如下:
- os.system('sudo ip link set can1 type can bitrate 100000')
- os.system('sudo ifconfig can1 up')
- can0 = can.interface.Bus(channel = 'can0', bustyp = 'socketcan_ctypes')
- can0 = can.interface.Bus(channel = 'can1', bustyp = 'socketcan_ctypes')
- 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
- cd 2-CH_CAN_HAT_Code/wiringPi/receive/
- make clean
- sudo make
- sudo ./can_receive
- cd 2-CH_CAN_HAT_Code/ wiringPi/receive/
- make clean
- sudo make
- sudo ./can_send