RS485 CAN HAT (B) 是微雪电子为树莓派开发的一款的带 RS485 和 CAN 通信功能的扩展板,具备 RS485、CAN 通信功能。
扩展接口 | 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 |
功能引脚 | 树莓派接口(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] | 中断输出 |
功能引脚 | 树莓派接口(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 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 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 相连,用于接收数据。
本产品采用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’。
#打开树莓派终端,并运行以下指令 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/
#打开树莓派终端,并运行以下指令 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版本,如果没有出现说明安装出错
sudo apt-get update sudo apt-get install python-serial sudo pip install python-can
sudo apt-get update sudo apt-get install python3-pip sudo pip3 install RPi.GPIO sudo apt-get install python3-serial
本演示程序使用了一个树莓派,一个RS485 CAN HAT (B)模块以及一个USB-CAN-A模块
提供python与c语言程序
将模块插在树莓派上,然后修改开机脚本config.txt
sudo nano /boot/config.txt
在最后一行加入如下:
dtparam=spi=on
dtoverlay=spi1-3cs
dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25,,spimaxfrequency=1000000
dtoverlay=sc16is752-spi1,int_pin=24
保存退出后,重启树莓派:
sudo reboot
重启后,运行命令查看是否初始化成功:
dmesg | grep -i '\(can\|spi\)'
如果不接上模块可能提示如下:
请检查是否连接上模块。是否开启SPI并开启MCP2515内核驱动。是否已经进行过重启。
如果使用的是其他的CAN设备,确定连线H-H,L-L即可
sudo ip link set can0 up type can bitrate 1000000 sudo ifconfig can0 txqueuelen 65536
https://www.kernel.org/doc/Documentation/networking/can.txt
ifconfig
在树莓派终端运行:
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
注意:
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
接收程序是阻塞的,直到读取到数据就结束。
以USB转CAN调试工具为例,效果为:
树莓派打开终端,运行:
#发送端: sudo python can_send.py cd RS485_CAN_HAT_B/CAN/python/ #先运行接收程序,再从电脑发送数据: sudo python can_reveive.py
详细连接: 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 nano /boot/config.txt #加入如下,int_pin根据实际焊接方式设置: dtoverlay=sc16is752-spi1,int_pin=24 #重启设备 sudo reboot
重启后,SC16IS752的驱动会加载到系统内核中,此时可以运行ls /dev查看一下 将会多出如下设备:
在2020-05-27的树莓派系统中gpiochip3没有了变成了gpiochip2
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/
cd c make clean make sudo ./main
将USB TO RS485连接到电脑,打开串口助手,选择对应的串口,设置波特率115200。
(注意: 需要加回车换行才可以,不然数据不会返回;示例的程序目录以实际为主。)
cd python cd examples sudo python3 main.py
该程序与C程序的硬件连接与现象相同:
当手上没有USB TO RS485时,可以尝试下面的测试例程:
sudo python3 test.py