RS485 CAN HAT (B)
| |||||||||||||||||
| |||||||||||||||||
说明
RS485 CAN HAT (B) 是微雪电子为树莓派开发的一款的带 RS485 和 CAN 通信功能的扩展板,具备 RS485、CAN 通信功能。
特点
- 基于 Raspberry Pi 40PIN GPIO 接口设计,适用于 Raspberry Pi 系列主板
- 具备一路 CAN,采用控制器 MCP2515,搭配 CAN 收发器,可实现 SPI 转 CAN
- 具备两路 RS485,采用 SC16IS752 与 SP3485 双芯片组合方案,可实现 SPI 转 RS485
- 板载电源转换电路,支持 8~28V 宽电压供电,可同时给树莓派供电
- 板载一体式电源隔离,可提供稳定的隔离电压,隔离端无须额外供电
- 板载一体式数字隔离,可进行信号隔离,可靠性高、抗干扰强、功耗低
- 板载 TVS (瞬态电压抑制管),可有效抑制电路中的浪涌电压和瞬态尖峰电压,防雷防静电
- 板载自恢复保险丝和保护二极管,可确保电流和电压稳定输出,防过流过压,提高抗冲击能力
- 板载 120Ω 终端电阻,可通过跳线帽设置使能
- 板载端子和排针两种接线方式,接线更方便
- 引出 SPI 控制接口,方便接入其他控制器控制
产品参数
扩展接口 | 2 路 RS485 + 1 路 CAN |
---|---|
通信接口 | SPI |
CAN控制器 | MCP2515 |
CAN收发器 | SIT65HVD230DR 或 SN65HVD23D |
CAN通信速率 | 1Mbps 以内 |
串口扩展芯片 | SC16IS752 |
RS485收发器 | SP3485 |
RS485通信速率 | 300~921600 bps |
供电方式 | 外部供电端子或树莓派 |
外部供电范围 | DC 8~28V |
工作电压 | 3.3V |
产品尺寸 | - mm |
接口说明
- CAN总线(CAN_0,通过SPI0控制)
功能引脚 | 树莓派接口(BCM) | 描述 |
---|---|---|
5V | 5V | 5V电源正 |
GND | GND | 电源地 |
SCLK_0 | 11(SCK) | SPI时钟输入 |
MOSI_0 | 10(MOSI) | SPI数据输入 |
MISO_0 | 9(MISO) | SPI数据输出 |
CE_0 | 8(CE0)[1] | 数据/命令选择 |
INT_0 | D25[2] | 中断输出 |
- RS485总线(RS485_0 & RS485_1,通过SPI1控制)
功能引脚 | 树莓派接口(BCM) | 描述 |
---|---|---|
5V | 5V | 5V电源正 |
GND | GND | 电源地 |
SCLK_1 | D21 | SPI时钟输入 |
MOSI_1 | D20 | SPI数据输入 |
MISO_1 | D19 | SPI数据输出 |
CE_1 | D18 | 数据/命令选择 |
INT_1 | D24[3] | 中断输出 |
默认焊点切换说明
硬件说明
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总线
本产品采用SC16IS752作为控制芯片,SC16IS752是双通道高性能的UART扩展芯片,支持SPI和I2C两种接口通信,本模块使用SPI接口。板载电源隔离、ADI磁耦隔离、板载TVS(瞬态电压抑制管)、自恢复保险丝和保护二极管和自动收发转换电路。可有效抑制电路中的浪涌电压和瞬态尖峰电压,防雷防静电,防过流过压,提高抗冲击能力,可进行信号隔离,具有靠性高、抗干扰强、功耗低等优点。
通信协议
CS:从机片选,当CS为低电平的时候,芯片使能
SCLK: SPI通信时钟
MOSI/SI:SPI通信主机发送,从机接收
MIS0/SO:SPI通信主机接收,从机发送
时序:CPHL=0, CPOL=0 (SPI0)
【备注】具体关于SPI通信的相关信息,可以自行网上搜索资料了解
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管脚是设置接收与发送;
本模块用硬件自动控制的收发:
数据接收:TXD此时为高电平, 为休闲状态。这时候MOS管导通,SP3485芯片的RE引脚为低电平,数据接收使能,RO开始接收数据,将485AB口接受到的数据传到MCU。
数据发送:TXD会有一个下拉的电平,表示开始发送数据,此时MOS管截止,DE引脚为高电平,数据发送使能。此时,如果发送的数据为‘1’的时候,MOS管会处于导通,虽然接收会变为有效状态但由于芯片在发送阶段时是高阻状态,所以还是保持发送状态,正常传输‘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
python
sudo apt-get update sudo apt-get install python-serial sudo pip install python-can
安装python3库
sudo apt-get update sudo apt-get install python3-pip sudo pip3 install RPi.GPIO sudo apt-get install python3-serial
配置驱动
修改配置文件
将模块插在树莓派上,然后修改开机脚本config.txt
sudo nano /boot/config.txt
在最后一行加入如下:
dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25,spimaxfrequency=1000000 dtoverlay=sc16is752-spi1,int_pin=24
保存退出后,重启树莓派:
sudo reboot
检查是否正确配置
重启后,SC16IS752和mcp251x的驱动会加载到系统内核中,运行命令查看是否初始化成功:
dmesg | grep -i '\(can\|spi\)'
如果不接上模块可能提示如下:
请检查是否连接上模块。是否开启SPI并开启MCP2515内核驱动。是否已经进行过重启。
RS485
此时也可以运行
ls /dev
查看RS485总线是否正确配置,如果正确配置将会多出如下设备:
在2020-05-27的树莓派系统中gpiochip3没有了变成了gpiochip2
CAN
开启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使用
硬件连接
本演示程序使用了一个树莓派,一个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/9/92/RS485_CAN_HAT_B.zip unzip RS485_CAN_HAT_B.zip sudo chmod 777 -R RS485_CAN_HAT_B/ cd RS485_CAN_HAT_B
C 程序
注意:
1.确保硬件接线是正确的,即H-H,L-L连接
2.确保两边的波特率设置一致的,默认的例程设置的波特率为1Mbps
3.如果长时间发送数据有丢帧现象,可以尝试降低波特率解决
- 发送,树莓派打开终端,运行:
cd RS485_CAN_HAT_B/CAN/wiringPi/send/ make clean make sudo ./can_send
- 阻塞接收,树莓派打开终端,运行:
cd RS485_CAN_HAT_B/CAN/wiringPi/receive/ make clean make sudo ./can_receive
接收程序是阻塞的,直到读取到数据就结束。
注意:该程序仅能接收帧ID为123的数据,如需接收其它ID数据可自行修改程序
以USB转CAN调试工具为例,效果为:
python 程序
树莓派打开终端,运行:
#发送端: sudo python can_send.py cd RS485_CAN_HAT_B/CAN/python/ #先运行接收程序,再从电脑发送数据: sudo python can_reveive.py
RS485使用
硬件连接
详细连接:
- C和python例程运行需要一个额外的RS485转串口模块连接通道1才可以看到效果。
- Python中test.py需要通道1和通道2连接。
功能引脚 | 树莓派接口(BCM) | 描述 |
---|---|---|
5V | 5V | 5V电源正 |
GND | GND | 电源地 |
SCLK_1 | D21 | SPI时钟输入 |
MOSI_1 | D20 | SPI数据输入 |
MISO_1 | D19 | SPI数据输出 |
CE_1 | D18 | 数据/命令选择 |
INT_1 | D24 | 中断输出 |
测试
- 下载并运行测试例程
sudo apt-get install p7zip-full wget https://www.waveshare.net/w/upload/9/92/RS485_CAN_HAT_B.zip unzip RS485_CAN_HAT_B.zip sudo chmod 777 -R RS485_CAN_HAT_B.zip cd RS485_CAN_HAT_B/
C 程序
cd c make clean make sudo ./main
- 此处演示的为:RS485_0的通道1与USB TO RS485的A.B连接如下图:
将USB TO RS485连接到电脑,打开串口助手,选择对应的串口,设置波特率115200。
- 执行C程序,电脑发送任何数据,模块将数据返回执行C程序,如下图:
(注意: 需要加回车换行才可以,不然数据不会返回;示例的程序目录以实际为主。)
python 程序
cd python cd examples sudo python3 main.py
该程序与C程序的硬件连接与现象相同:
当手上没有USB TO RS485时,可以尝试下面的测试例程:
- 将通道1的A,B与通道2的A,B连接:
- 运行test.py,可以得到如下效果:
sudo python3 test.py
Modbus应用实例
本实例使用树莓派一个、RS485 CAN HAT扩展板一个、Mobus RTU Relay继电器模块一个。
硬件连接
- 将扩展板安装到树莓派上,然后按A-A、B-B的顺序将扩展版的RS485接口与Modbus模块的RS485接口对应连接;
- 分别为树莓派和Modbus模块接通电源。
下载例程
- 下载例程:
wget https://www.waveshare.net/w/upload/b/ba/RS485_Modbus_RTU_Relay_Code.zip
- 解压后进入所在路径:
unzip RS485_Modbus_RTU_Relay_Code.zip cd RS485_Modbus_RTU_Relay_Code/Modbus_RTU_Relay_Code/Python3
- 运行程序
sudo python main.py
- 程序运行现象为继电器按编号从CH1到CH8依次开启再从CH1到CH8依次关闭,不断循环。
- 更多程序可参考Mobus RTU Relay模块wiki界面,注意需要将程序中串口号进行修改。
资料
文档
程序
数据手册
FAQ
- 确定两边的波特率一致;
- 例程中设置的是固定的帧ID:0X123,请设置好您的CAN另外一端的发送接收CAN ID都是x0123;
- 主流的Ubuntu系统或最新的bookworm系统,config.txt文件通常在/boot/firmware 文件夹
- 或者将树莓派的SD卡通过读卡器在电脑下(或者其它能识别SD卡的主机)读取和更改config.txt文件。
0) 考虑是库安装问题,请参考以下步骤安装库 安装python3-venv包,如果还没安装的话 sudo apt install python3-venv 创建一个新的虚拟环境 python3 -m venv myenv &&source myenv/bin/activate 激活虚拟环境 source myenv/bin/activate 现在你可以在虚拟环境中安装requests pip install requests 1) 此外也可以尝试改用以下指令安装 sudo apt install python3-rpi.gpio sudo apt-get install pipx pipx install rpi.gpio