RS232 RS485 CAN Board
| ||||||||||||||||||||||
| ||||||||||||||||||||||
说明
产品简介
RS232-RS485-CAN-Board 是微雪 (Waveshare) 专为 Raspberry Pi 4B 和 Raspberry Pi 5 设计的一款隔离型工业接口扩展板。这款扩展板提供了多种工业通信接口,包括 2 路 RS485、1 路 RS232、1 路 CAN FD 和 1 路 CAN,每个接口都具备电气隔离保护。它采用了 SC16IS752 与 SP485、MCP2515 与 SN65HVD230 以及 MCP2518FD 与 MCP2562FD 等组合方案,通过 SPI 和 UART 接口轻松扩展多种通信功能。板载的 TVS 管、自恢复保险丝、保护二极管、数字隔离芯片以及一体式电源隔离设计,确保了电路的防雷、防静电、防过流、防过压和抗干扰能力。扩展板支持 7~36V 宽电压供电,配合定制的工业导轨外壳,方便在工业控制应用中集成。同时,预留的 PCIe 扩展接口和充足的内部空间,满足用户未来的功能扩展需求。产品还附带了丰富的配套资料和示例代码,助力用户轻松实现工业通信应用。
产品特点
- 兼容性广
- 适用于 Raspberry Pi 4B 和 Raspberry Pi 5,基于 Raspberry Pi 40pin GPIO 接口。
- 多种工业通信接口
- 提供 2 路 RS485、1 路 RS232、1 路 CAN FD 和 1 路 CAN 通信接口。
- 电气隔离保护
- 每个接口均具备电气隔离,确保通信的安全性和可靠性。
- 扩展灵活
- 采用 SC16IS752 与 SP485 组合方案,通过 SPI 接口扩展两路 RS485。
- 采用 MCP2515 与 SN65HVD230 组合方案,通过 SPI 接口扩展一路 CAN。
- 采用 MCP2518FD 与 MCP2562FD 组合方案,通过 SPI 接口扩展一路 CAN FD。
- 采用 Raspberry UART 与 SP3232EEN 组合方案,通过 UART 接口扩展一路 RS232。
- 防护功能强
- 板载 TVS (瞬态电压抑制管),防雷、防静电。
- 板载自恢复保险丝和保护二极管,防过流、过压,提高抗冲击能力。
- 电源隔离
- 板载一体式电源隔离,无需额外供电,确保 RS232、RS485、CAN、CAN FD 的电流和电压稳定输出,增强抗干扰能力。
- 信号隔离
- 板载数字隔离芯片,提升信号隔离的安全性、稳定性和抗干扰性。
- 灵活供电
- 支持 7~36V 宽电压供电,可结合 Pi5 Connector Adapter (B) 同时为树莓派和扩展板供电。
- 终端电阻可调
- 板载 120Ω 终端电阻,可通过跳线帽设置使能。
- 中断电阻预留
- 预留中断电阻焊盘,支持灵活切换中断引脚,避免占用特殊性引脚。
- 扩展与安装
- 针对 Raspberry Pi 5 预留 PCIe 扩展板接口,支持进一步功能扩展。
- 提供定制的工业导轨外壳,内部预留空间,支持堆叠扩展自定义功能。
- 配套资料完善
- 提供完整的配套资料,包括 Raspberry Python 和 C 示例程序以及用户手册等。
产品参数
产品类型 | 树莓派隔离型工业接口扩展板 | |||
适配主板 | Raspberry Pi 4B、Raspberry Pi 5 | |||
---|---|---|---|---|
通信接口 | SPI + UART | |||
工业接口 | ||||
接口说明 | 芯片方案 | 通信速率 | ||
1路隔离CAN FD | MCP2518FD + MCP2562FD | 5kbps - 8 Mbps | ||
1路隔离CAN | MCP2515 + SN65HVD230 | 5kbps - 1 Mbps | ||
2路隔离RS485 | SC16IS752 + SP485 | 300 bps - 921600 bps | ||
1路隔离RS232 | SP3232EEN | |||
可扩展性 | Pi5 可通过 PCIe 扩展 NVME、ETH、USB、4G/5G 等 | |||
Pi 4B/5 可通过 40PIN GPIO 堆叠部分 HAT 扩展板 (须引脚和尺寸不冲突) | ||||
供电方式 (二选一) | 转接板 Type-C 电源口 5V 供电 | |||
外部接线端子 DC 7-36V 宽电压供电 | ||||
产品尺寸 | 154.6 × 83.7 × 59 mm | |||
外壳 | 环保塑料外壳,支持导轨和挂壁安装 |
接口说明
引脚分配
CAN总线
CAN 模块的功能是处理所有 CAN 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 SPI 接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作。通过读取相应的寄存器可以检查通讯状态和错误。 会对在 CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。
由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。
Microchip 的 MCP2515 是一款CAN协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2515 自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片不需要编写驱动,只需要打开设备树中的内核驱动即可使用。可以与MCP2518FD使用通一通道,只需片选脚不同即可
MCP2518FD是Microchip公司生产的一款CAN FD(灵活数据速率)控制器,完全支持经典格式(CAN2.0)和CAN灵活数据速率(CAN FD)格式的CAN成帧。仲裁比特率高达1Mbps,数据波特率也突破传统CAN2.0的1Mbps限制,SPI时钟速度高达20MHz符合ISO11898-1:2015标准。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2518FD 自带的32个灵活的滤波器和屏蔽对象可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片,可以通过已编写好的设备树文件来驱动该器件。
更多详细请参考数据手册;
RS-485总线
控制器
本产品采用SC16IS752作为控制芯片,SC16IS752是双通道高性能的UART扩展芯片,支持SPI和I2C两种接口通信,本模块使用SPI接口。板载电源隔离、ADI磁耦隔离、板载TVS(瞬态电压抑制管)、自恢复保险丝和保护二极管和自动收发转换电路。可有效抑制电路中的浪涌电压和瞬态尖峰电压,防雷防静电,防过流过压,提高抗冲击能力,可进行信号隔离,具有靠性高、抗干扰强、功耗低等优点。
通信协议
CS:从机片选,当CS为低电平的时候,芯片使能
SCLK: SPI通信时钟
MOSI/SI:SPI通信主机发送,从机接收
MIS0/SO:SPI通信主机接收,从机发送
RS-232总线
本产品使用SP3232作为收发器使用,SP3232E 系列是一款 RS-232 收发器解决方案,适用于笔记本电脑或掌上电脑等便携式或手持式应用。 SP3232E 系列具有高效电荷泵电源,在 3.3V 工作电压下仅需要 0.1μF 电容器。该电荷泵使 SP3232E 系列能够通过 +3.3V 至 +5.0V 的单电源提供真正的 RS-232 性能。 SP3232E 是 2 个驱动器/2 个接收器设备。关断期间,电源电流降至 1μA 以下。更多详细请参考数据手册;
产品尺寸
组装说明
安装必要的函数库
- 安装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中下载示例程序:
- 得到解压包,解压并将程序复制到树莓派中。
前置工作
开启接口
- 打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config Interfacing Options ->Serial ->no -> yes,关闭串口调试功能。
- 选择
Interfacing Options -> SPI -> Yes 开启SPI接口
然后重启树莓派:
sudo reboot
请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查
修改脚本config.txt
将模块插在树莓派上,然后修改开机脚本config.txt
sudo nano /boot/config.txt #pi5 为/boot/firmwave/config.txt
在最后一行加入如下:
dtparam=spi=on dtoverlay=i2c0 dtoverlay=spi1-3cs dtoverlay=sc16is752-spi1,int_pin=25 dtoverlay=mcp2515,spi0-0,oscillator=16000000,interrupt=23 dtoverlay=mcp251xfd,spi0-1,interrupt=24
- 重启树莓派以应用所有设置:
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
CAN总线例程
- 浏览目录:
- 接收端运行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
RS-485总线例程
- 下载并运行测试例程
sudo apt-get install p7zip-full wget http://www.waveshare.net/w/upload/4/44/2-CH_RS485_HAT_code.7z 7z x 2-CH_RS485_HAT_code.7z sudo chmod 777 -R 2-CH_RS485_HAT cd 2-CH_RS485_HAT/
- 另外也可以下载我们Github上面的工程:
sudo git clone https://github.com/waveshare/2-CH-RS485-HAT cd 2-CH-RS485-HAT/
*注意目录稍微有些不一样
- C 程序
cd c make clean make sudo ./main
- PYTHON 程序
cd python cd examples sudo python3 main.py #或者 sudo python3 test.py
RS-232总线
RS-232使用较为方便,打开树莓派UART功能后可以直接使用/dev/ttyAMA0当做串口通信使用
FAQ
这似乎也是raspbian os新版本的一个bug(请见:https://github.com/raspberrypi/linux/issues/6407),可降级为20240724或更早之前发布的镜像版本,或尝试执行指令修复:。
sudo rpi-update pulls/6466
本产品已经使用了全部的树莓派SPI接口和UART口,不支持堆叠其他SPI驱动的拓展板,RS485会占用SPI1整个通道,无法接入更多。
- 确定485的A,B是否与控制的485设备A,B一一对应;
- 可以先使用USB to 485设备与模块通信,保证树莓派的设置没有问题;
- 检察串口通信参数的奇数偶数位校验的设置。
- 树莓派装了主流的ubuntu系统可以使用;
- Ubuntu 的config.txt文件通常在/boot/firmware 文件夹
- 树莓派版本的ubuntu 系统一般是64位的,可以用以下指令安装wringpi 库
下载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
传感器那边发送过来的可能是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 sudo python3 RS485-CAN-HAT-send-hex.py