2-CH CAN HAT+
| ||||||||||||||||||||||
| ||||||||||||||||||||||
说明
产品简介
2-CH CAN HAT+是微雪(Waveshare)专为树莓派开发设计的一款隔离式、双通道CAN通信功能的扩展板,具备有多重保护、宽电压输入等特性
产品特点
- 基于树莓派设计,适用于Raspberry Pi Zero/Zero W/Zero WH/2B/3B/3B+/4B/5
- HAT+标准设计,板载EEPROM芯片
- 采用MCP2515与SN65HVD230双芯片组合方案,支持2路CAN接口通信
- 板载一体式电源隔离,可提供稳定的隔离电压,隔离端无需额外供电
- 板载数字隔离芯片,信号隔离通信更安全、稳定性更好、抗干扰性更强
- 板载SM24CANB(瞬态电压抑制管),防静电和瞬态尖峰电压
- 板载电平转换电路,可通过跳线帽切换3.3V/5V的工作电平
- 板载120Ω终端电阻,可通过跳线帽设置使能
- 引出SPI控制接口,方便接入STM32/Arduino等主控板
- 提供完善的配套资料手册及例程
产品参数
- 输入电压: 5V、7~36V
- 逻辑电压: 3.3V/5V
- CAN控制芯片: MCP2515
- CAN收发器: SN65HVD230
- 产品尺寸: 65.0x56.5mm
- 固定孔通经: 3.0mm
接口说明
CAN接口总线
功能引脚 | 树莓派接口 (BCM) |
树莓派接口 (WPI) |
描述 |
5V | 5V | 5V | 5V电源正 |
GND | GND | GND | 电源地 |
MISO | 19(SPI1 MISO)/9(SPI0 MISO) | 24(SPI1 MISO)/13(SPI0 MISO) | SPI时钟输入 |
MOSI | 20(SPI1 MOSI)/10(SPI0 MOSI) | 28(SPI1 MOSI)/12(SPI0 MOSI) | SPI数据输入 |
SCK | 21(SPI1 SCLK)/11(SPI0 SCLK) | 29(SPI1 SCLK)/14(SPI0 SCLK) | SPI数据输出 |
CS_0 | 17(SPI1 CE1)/8(SPI0 CE0) | 0(SPI1 CE1)/10(SPI0 CE0) | CAN_0片选 |
INT_0 | 22/23 | 3/4 | CAN_0中断输出 |
CS_1 | 16(SPI1 CE2)/18(SPI1 CE0)/7(SPI0 CE1) | 27(SPI1 CE2)/1(SPI1 CE0)/11(SPI0 CE1) | CAN_1片选 |
INT_1 | 13/24/25 | 23/5/6 | CAN_1中断输出 |
注:加粗为默认连接引脚
说明:
INT_0默认焊接的是PIN22, INT_1默认焊接的是PIN13,如果需要修改引脚,需要对PCBA上对应的焊点做改动,并且把/boot/config.txt(Pi5则为/boot/firmware/config.txt)对应的引脚也修改下。 如果需要把INT_1从默认的PIN13,修改成PIN24,则需要把PIN13处的0欧改焊接到PIN24处。
CAN总线
CAN 模块的功能是处理所有 CAN 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 SPI 接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作。通过读取相应的寄存器可以检查通讯状态和错误。 会对在 CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。
由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。
Microchip 的 MCP2515 是一款CAN协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2515 自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片不需要编写驱动,只需要打开设备树中的内核驱动即可使用。
更多详细请参考数据手册;
产品尺寸
树莓派使用
在使用树莓派演示该例程时,需注意的是由于树莓派属于3.3V逻辑系统,需改变将2-CH CAN HAT+的逻辑电压引脚跳帽到3.3V,如下图所示。
注意:接入树莓派2b、3b、4b和5板子使用时,请接上配套铜柱固定,避免CAN接线端子处背面触碰到HDMI接口导致短路,避免接错或接触不良:
安装必要的函数库
- 安装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
wiringPi
树莓派系统为32位
#打开树莓派终端,并运行以下指令 cd sudo apt-get install wiringpi #对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级: wget https://project-downloads.drogon.net/wiringpi-latest.deb sudo dpkg -i wiringpi-latest.deb gpio -v # 运行gpio -v会出现2.52版本,如果没有出现说明安装出错 #Bullseye分支系统使用如下命令: git clone https://github.com/WiringPi/WiringPi cd WiringPi ./build sudo gpio -v # 运行gpio -v会出现2.70版本,如果没有出现说明安装出错
树莓派系统为64位
使用指令拷贝资源包到树莓派
wget https://www.waveshare.net/w/upload/8/8c/WiringPi-master.zip
(可选,使用过解压指令可跳过这一步)安装解压环境
sudo apt-get install unzip
进入文件位置,执行解压指令
unzip WiringPi-master.zip
进入文件目录(进到“WiringPi-master”文件夹中)
cd WiringPi-master/
执行sudo ./build
sudo ./build
(可选,出现错误参考第4点)如果执行./build不成功就执行“chmod +x ./build”再执行“sudo ./build”
chmod +x ./build
- 安装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 pip 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中下载示例程序:
- 得到解压包,解压并将程序复制到树莓派中。
前置工作
开启SPI接口
- 打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config 选择Interfacing Options -> SPI -> Yes 开启SPI接口
sudo reboot
请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查
修改脚本config.txt
将模块插在树莓派上,然后修改开机脚本config.txt
sudo nano /boot/config.txt #pi5 为/boot/firmware/config.txt
在最后一行加入如下:
dtparam=spi=on dtoverlay=i2c0 dtoverlay=spi1-3cs dtoverlay=mcp2515,spi1-1,oscillator=16000000,interrupt=22 dtoverlay=mcp2515,spi1-2,oscillator=16000000,interrupt=13
- 重启树莓派以应用所有设置:
sudo reboot
- 待树莓派重启后,查看SPI信息:
dmesg | grep spi1
- 开启CAN:
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
- 更多相关CAN内核指令可以查看:
https://www.kernel.org/doc/Documentation/networking/can.txt
- 查看ifconfig:
ifconfig
- 关掉CAN设备:
sudo ifconfig can0 down sudo ifconfig can1 down
开始测试
若手上只有一个2-CH CAN HAT,可以将可通过将模块的CAN0_H与CAN1_H,CAN0_L与CAN1_L相连,如下图所示:
- 安装can-utils:
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,输出接口序号。
固定设备号
如果使用时发现 CAN 接口的系统设备号和板卡接口名称对不上,可以使用以下方法固定设备号:
- 在 /etc/udev/rules.d 目录下个创建一个 rules 文件:
sudo nano /etc/udev/rules.d/80-can.rules
- 将下面的内容添加到文件中:
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.1/net/can?", NAME="can0" ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi1.2/net/can?", NAME="can1"
- 如果是堆叠使用可以根据自己需求添加相应的命令,只需要修改 DEVPATH 和 NAME,例如将 spi0-0 命名为 can2:
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.1/net/can?", NAME="can3"
Python例程
- 浏览目录:
- 接收端运行receive.py:
sudo python reveive.py
- 发送端运行send.py:
sudo python send.py
需注意的是这里的发送端是使用CAN1发送,接收端则是CAN0,具体修改可以参照下面的代码分析。
代码分析
【Python例程】
本例程是基于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')
第一步:连接到CAN总线
can0 = can.interface.Bus(channel = 'can0', bustyp = 'socketcan_ctypes')
can1 = can.interface.Bus(channel = 'can0', bustype = 'socketcan')
- 需改成CAN1,则代码如下:
can0 = can.interface.Bus(channel = 'can1', bustyp = 'socketcan')
第二步:创建信息
msg = can.Message(arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7], extended_id=False)
msg = can.Message(is_extended_id=False, arbitration_id=0x123, data=[0, 1, 2, 3, 4, 5, 6, 7])
第三步:发送信息
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
【WringPi例程】
- 阻塞接收,树莓派打开终端,运行:
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
堆叠使用
- 2-CH CAN HAT+无法直接与本身堆叠使用,需要调整背面SPI片选后方可堆叠使用
- 与 2-CH CAN HAT 堆叠使用,仅config.txt配置需修改
dtparam=spi=on dtoverlay=i2c0 dtoverlay=spi1-3cs dtoverlay=mcp2515,spi1-1,oscillator=16000000,interrupt=22 dtoverlay=mcp2515,spi1-2,oscillator=16000000,interrupt=13 dtoverlay=mcp2515,spi0-0,oscillator=16000000,interrupt=23 dtoverlay=mcp2515,spi0-1,oscillator=16000000,interrupt=25
- 与 2-CH CAN FD HAT 堆叠使用,仅config.txt配置需修改
dtparam=spi=on dtoverlay=i2c0 dtoverlay=spi1-3cs dtoverlay=mcp2515,spi1-1,oscillator=16000000,interrupt=22 dtoverlay=mcp2515,spi1-2,oscillator=16000000,interrupt=13 dtoverlay=mcp251xfd,spi0-0,interrupt=25 dtoverlay=mcp251xfd,spi1-0,interrupt=24
FAQ
sudo apt update sudo apt upgrade uname -a