RS485 CAN HAT
| |||||||||||||||||
| |||||||||||||||||
说明
RS485 CAN HAT 是微雪电子为树莓派开发的一款的带 RS485 和 CAN 通信功能的扩展板,具备 RS485、CAN 通信功能。
特点
- 基于Raspberry Pi 40pin GPIO接口,适用于Raspberry Pi系列主板
- 具备CAN功能,使用SPI接口CAN控制器MCP2515,搭配收发器SN65HVD230
- 具备RS485功能,使用UART控制,半双工通讯,收发器为SP3485
- 板载TVS(瞬态电压抑制管),RS485通讯可有效抑制电路中的浪涌电压和瞬态尖峰电压,防雷防静电
- 预留控制接口,方便其他控制器控制
- 提供完善的配套资料手册(提供wiringPi与python例程)
产品参数
- 工作电压: 3.3V
- CAN控制芯片: MCP2515
- CAN收发器: SN65HVD230
- 485收发器: SP3485
- 产品尺寸: 65mmx30mm
- 固定孔通经: 3.0mm
接口说明
- CAN总线
功能引脚 | 树莓派接口(BCM) | 描述 |
3V3 | 3V3 | 3.3V电源正 |
GND | GND | 电源地 |
SCK | SCK | SPI时钟输入 |
MOSI | MOSI | SPI数据输入 |
MISO | MISO | SPI数据输出 |
CS | CE0 | 数据/命令选择 |
INT | 25 | 中断输出 |
- RS485总线
功能引脚 | 树莓派接口(BCM) | 描述 |
3V3 | 3V3 | 3.3V电源正 |
GND | GND | 电源地 |
RXD | RXD | 串口接收 |
TXD | TXD | 串口发送 |
RSE | 4 | 设置收发 |
对于RSE引脚,可以选择不使用,模块出厂默认使用的是硬件自动接收与发送。
硬件说明
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 相连,用于接收数据。
RS485总线
SP3485接口芯片是一种RS-485驱动芯片。用于RS-485通信的低功耗收发器。 采用单一电源+3.3V工作,采用半双工通讯方式。RO和DI端分别为接收器的输出和驱动器的输入端;(RE) ̅和DE端分别为接收和发送的使能端,当(RE) ̅为逻辑0时,器件处于接收状态;当DE为逻辑1时,器件处于发送状态;A端和B端分别为接收和发送的差分信号端,当A-B>+0.2V时,RO输出逻辑1;当A-B<-0.2V时,RO输出逻辑0。A和B端之间加匹配电阻,一般可选100Ω的电阻。
其中:SP3485芯片的RE与DE管脚是设置接收与发送;
本模块默认的出厂设置是采用硬件自动的收发,也可以选择软件上控制管脚来选择发送与接收,可以通过焊接板上的0欧姆电阻来选择控制方式。
硬件自动控制:
数据接收:P_TX此时为高电平, 为休闲状态。这时候三级管导通,SP3485芯片的RE引脚为低电平,数据接收使能,RO开始接收数据,将485AB口接受到的数据传到MCU。
数据发送:P_TX会有一个下拉的电平,表示开始发送数据,此时三极管截止,DE引脚为高电平,数据发送使能。此时,如果发送的数据为‘1’的时候,三极管会处于导通,虽然接收会变为有效状态但由于芯片在发送阶段时是高阻状态,所以还是保持发送状态,正常传输‘1’。
注意:使用自动收发由于三级管的通断的速度问题,会导致自动收发的波特率无法做到太高,如果需要很高的波特率建议使用手动收发。
树莓派使用
安装库
如果使用bookworm系统,只能使用lgpio库,bcm2835跟wiringPi无法安装与使用,python库可以不安装,直接运行程序即可
BCM2835
#打开树莓派终端,并运行以下指令 wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz tar zxvf bcm2835-1.71.tar.gz cd bcm2835-1.71/ sudo ./configure && sudo make && sudo make check && sudo make install # 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
wiringPi
#打开树莓派终端,并运行以下指令 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 gpio -v # 运行gpio -v会出现2.70版本,如果没有出现说明安装出错
lgpio
wget https://github.com/joan2937/lg/archive/master.zip unzip master.zip cd lg-master sudo make install # 更多的可以参考官网:https://github.com/gpiozero/lg
python3
sudo apt-get update sudo apt-get install python3-serial sudo apt-get install python3-can
CAN使用
本演示程序使用了两个树莓派以及两个RS485 CAN HAT模块
提供python与c语言程序
前置工作
将模块插在树莓派上,然后修改开机脚本config.txt
sudo nano /boot/config.txt
在最后一行加入如下:
dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25,spimaxfrequency=2000000
其中oscillator=12000000,是板载的晶振大小12M,如下图
- 如果购买日期早于2019年8月份,配置有所差别,详情见FAQ部分:
保存退出后,重启树莓派:
sudo reboot
重启后,运行命令查看是否初始化成功:
sudo dmesg | grep -i '\(can\|spi\)'
如果不接上模块可能提示如下:
请检查是否连接上模块。是否开启SPI并开启MCP2515内核驱动。是否进行重启。
确定好两边树莓派都这样处理了,把两个模块的H与L对应连接
如果使用的是其他的CAN设备,确定连线H-H,L-L即可
- 开启CAN:
sudo ip link set can0 up type can bitrate 1000000 sudo ifconfig can0 txqueuelen 65536
- 更多相关CAN内核指令可以查看:
https://www.kernel.org/doc/Documentation/networking/can.txt
- 查看ifconfig:
ifconfig -a
小工具简单测试
- 本演示程序使用了一个树莓派,一个RS485 CAN HAT (B)模块以及一个USB-CAN-A模块,提供python与c语言程序
- 开启CAN:
sudo ip link set can0 up type can bitrate 1000000 sudo ifconfig can0 txqueuelen 65536
更多相关CAN内核指令可以查看:
https://www.kernel.org/doc/Documentation/networking/can.txt
查看ifconfig:
ifconfig
- 安装can-utils:
sudo apt-get install can-utils
- 接收:
终端输入接收数据指令:
candump can0
该接收工具是阻塞的,不加参数时运行该工具会一直处于接收状态,使用Ctrl+C退出。
关于该工具的参数说明可使用:
candump -h
- 发送
终端输入发送数据指令:
cansend can0 000#11.22.33.44
- 自检
终端输入指令:
sudo ip link set can0 down #若之前已开启总线,需要先关闭总线 sudo ip link set can0 up type can bitrate 1000000 loopback on #以环回模式开启总线 sudo ifconfig can0 txqueuelen 65536 cangen can0 -I i -L 8 #-I 设置设备ID,'i'为递增模式;-L 设置数据长度
此时会向CAN不断发送设备ID递增,长度为8,内容随机的数据。同时该命令默认开启环回模式,可在另一个终端窗口运行:
candump can0
运行后可以也接收到上面发送的数据:
测试结束后可以分别在两个终端使用Ctrl+C结束运行。
sudo ip link set can0 down sudo ip link set can0 up type can bitrate 1000000 loopback on #关闭环回模式
下载例程
在树莓派终端运行:
sudo apt-get install unzip wget https://www.waveshare.net/w/upload/4/4e/RS485_CAN_HAT_Code.zip unzip RS485_CAN_HAT_Code.zip sudo chmod 777 -R RS485_CAN_HAT_Code/
C
- 阻塞接收,树莓派打开终端,运行:
cd RS485_CAN_HAT_Code/CAN/wiringPi/receive/ make clean make sudo ./can_receive
- 发送,树莓派打开终端,运行:
cd RS485_CAN_HAT_Code/CAN/wiringPi/send/ make clean make sudo ./can_send
python
树莓派打开终端,运行:
cd RS485_CAN_HAT_Code/CAN/python/ #先运行接收: sudo python reveive.py #发送端: sudo python send.py
与其他的CAN设备应该如何使用
1.确保硬件接线是正确的,即H-H,L-L连接
2.确保两边的波特率设置一致的,默认的例程设置的波特率为100K
3.确保两边的CAN ID是一致的,否则无法接收到
4.如果长时间发送数据有丢帧现象,可以尝试降低波特率解决
RS485使用
本演示程序使用了两个树莓派以及两个RS485 CAN HAT模块
提供python与wiringPi语言程序
前置工作
开启Uart接口
打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config 选择Interfacing Options -> Serial,关闭shell访问,打开硬件串口
打开/boot/config.txt文件,找到如下配置语句使能串口,如果没有,可添加在文件最后面。
enable_uart=1
对于树莓派3B用户,串口用于蓝牙,需要注释掉:
#dtoverlay=pi3-miniuart-bt
树莓派5/2B/zero和部分改过配置的树莓派,用户串口设备号可能为ttyAMA0;可以用以下命令行确认,serial0为选用的串口设备号,如下图:
ls -l /dev/serial*
然后重启树莓派:
sudo reboot
确定好两边树莓派都这样处理了,把两个模块的A与B对应连接
如果使用的是其他的485设备,确定连线A-A,B-B即可
C
- 阻塞接收,树莓派打开终端,运行:
cd RS485_CAN_HAT_Code/485/WiringPi/receive make clean make sudo ./485_receive
- 发送,树莓派打开终端,运行:
cd RS485_CAN_HAT_Code/485/WiringPi/send make clean make sudo ./485_send
python例程
cd RS485_CAN_HAT_Code/485/python/ #先运行接收: sudo python receive.py #发送端: sudo python send.py
故障排查
如果485通信不正常,请分步调试:
- 确认是否禁止了从串行登录树莓派shell;
- 确定树莓派的硬件版本,如果是树莓派ZERO/3B,则程序中的串口可能需要修改成/dev/ttyAMA0;
- 确定485的A,B是否与控制的485设备A,B一一对应;
- 可以先使用USB to 485设备与RS485 CAN HAT通信,保证树莓派的设置没有问题;
FAQ
- 确定两边的波特率一致;
- 例程中设置的是固定的帧ID:0X123,请设置好您的CAN另外一端的发送接收CAN ID都是x0123;
- 确定树莓派的硬件版本,如果是树莓派ZERO/3B,则程序中的串口需要修改成/dev/ttyAMA0;
- 检查树莓派的串口通信是否开启了流控;
- 确定485的A,B是否与控制的485设备A,B一一对应;
- 可以先使用USB to 485设备与RS485 CAN HAT通信,保证树莓派的设置没有问题;
- 检察串口通信参数的奇数偶数位校验的设置。
- 最新的树莓派Bookworm系统或主流的Ubuntu系统config.txt文件通常在/boot/firmware 文件夹
sudo nano /boot/firmware config.txt
- 在最后一行加入如下:
dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=12000000,interrupt=25,spimaxfrequency=2000000 enable uart=1
或者将树莓派的SD卡通过读卡器在电脑下(或者其它能识别SD卡的主机)读取和更改config.txt文件。
打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config 选择Interfacing Options -> Serial,关闭shell访问,打开硬件串口
树莓派5/3B/2B/zero,用户串口设备号为ttyAMA0;可以用以下命令行确认,serial0为选用的串口设备号,如下图:
树莓派5/2B/ZERO串口设备号为ttyAMA0;可以用以下命令行确认,serial0为选用的串口设备号,如下图:
ls -l /dev/serial*
ls -l /dev/tty*
- 树莓派3B/2B/zero用户,串口用于蓝牙,注释掉后就是S0, 树莓派4 默认没有该语句:
#dtoverlay=pi3-miniuart-bt
然后重启树莓派:
sudo reboot
传感器那边发送过来的可能是hex数据(有时候还需要先发送hex数据给传感器请求数据),按照以下步骤收发hex数据:
wget https://www.waveshare.net/w/upload/0/00/RS485-CAN-HAT-For-Hex.zip unzip RS485-CAN-HAT-For-Hex.zip sudo chmod 777 RS485-CAN-HAT-For-Hex.zip cd RS485-CAN-HAT-For-Hex #接收Hex sudo python3 RS485-CAN-HAT-send-hex.py #发送Hex sudo python3 RS485-CAN-HAT-receive-hex.py
指的是数据处理后输出的部分变慢的话,提高上位机的性能应该有帮助;也可以考虑每次读取前清空缓存只读最新数据进行处理。
可以不接GND使用,接GND信号可能会更稳定,连接GND以获得更好的性能、可靠性和抗干扰能力,长距离通信的话,建议还是接上GND。
- 上位机和下位机的CAN速率要一致
- 两端的120欧姆平衡电阻都打开
- 发送方的帧ID要和接收方的滤波ID对应
进去myenv 后再安装对应的python 库,在myenv环境里所有指令不带sudo
sudo apt install python3-venv python3 -m venv myenv &&source myenv/bin/activate source myenv/bin/activate pip install requests
或者
sudo rm /usr/lib/python3.11/EXTERNALLY-MANAGED
- 下载64位Arm wiringpi
wget https://gitee.com/LJYSCIENTIST/raspberry-pi-software-storage/raw/master/wiringpi-2.60-1_arm64.deb
- 安装64 位Arm wiringpi
sudo dpkg -i wiringpi-2.60-1_arm64.deb
技术支持
联系人:黄工
EMAIL:3005423122@qq.com
电话:0755-83040712
QQ:3005763927
微信:扫下方二维码添加