2-CH CAN HAT+是微雪(Waveshare)专为树莓派开发设计的一款隔离式、双通道CAN通信功能的扩展板,具备有多重保护、宽电压输入等特性
注:加粗为默认连接引脚
说明:
INT_0默认焊接的是PIN22, INT_1默认焊接的是PIN13,如果需要修改引脚,需要对PCBA上对应的焊点做改动,并且把/boot/config.txt(Pi5则为/boot/firmware/config.txt)对应的引脚也修改下。 如果需要把INT_1从默认的PIN13,修改成PIN24,则需要把PIN13处的0欧改焊接到PIN24处。
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接口导致短路,避免接错或接触不良:
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/
#打开树莓派终端,并运行以下指令 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版本,如果没有出现说明安装出错
使用指令拷贝资源包到树莓派
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
#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
sudo raspi-config 选择Interfacing Options -> SPI -> Yes 开启SPI接口
然后重启树莓派:
sudo reboot
请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查
将模块插在树莓派上,然后修改开机脚本config.txt
sudo nano /boot/config.txt #pi5 为/boot/firmwave/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
dmesg | grep spi1
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
https://www.kernel.org/doc/Documentation/networking/can.txt
ifconfig
sudo ifconfig can0 down sudo ifconfig can1 down
若手上只有一个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,输出接口序号。
如果使用时发现 CAN 接口的系统设备号和板卡接口名称对不上,可以使用以下方法固定设备号:
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"
ACTION=="add", SUBSYSTEM=="net", DEVPATH=="/devices/platform/soc/*/spi0.1/net/can?", NAME="can3"
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')
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
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
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
支持堆叠多个2-CH CAN HAT+扩展板,接口和驱动可通过背面电阻选择;如果是堆叠其他的HAT扩展板,如果接口和驱动没有冲突理论上是可以堆叠的,比如2-CH CAN HAT、2-CH CAN FD HAT、2-CH RS485 HAT是可以和2-CH CAN HAT+堆叠使用。
sudo apt update sudo apt upgrade uname -a
周一-周五(9:30-6:30)周六(9:30-5:30)
手机:13434470212
邮箱:services04@spotpear.cn
QQ:202004841