树莓派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)描述
5V5V5V电源正
GNDGND电源地
SCLK_011(SCK)SPI时钟输入
MOSI_010(MOSI)SPI数据输入
MISO_09(MISO)SPI数据输出
CE_08(CE0)[1]数据/命令选择
INT_0D25[2]中断输出
  • RS485总线(RS485_0 & RS485_1,通过SPI1控制)
功能引脚树莓派接口(BCM)描述
5V5V5V电源正
GNDGND电源地
SCLK_1D21SPI时钟输入
MOSI_1D20SPI数据输入
MISO_1D19SPI数据输出
CE_1D18数据/命令选择
INT_1D24[3]中断输出

默认焊点切换说明

当板子默认引脚跟外接的其他设备引脚有冲突时,可尝试修改背面引脚焊盘,即把对应冲突引脚的0R电阻改焊到其他不冲突的引脚上。
  1.  CE_0默认焊接到8(CE0),可通过修改背面0R电阻,改焊到CE1上
  2.  默认焊接到D25,可通过修改背面0R电阻,改焊到D13上
  3.  默认焊接到D24,可通过修改背面0R电阻,改焊到D25/D16/D12上

详见背面焊点,如下图所示:


硬件说明

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’。


树莓派使用

安装库

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版本,如果没有出现说明安装出错

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


CAN使用

硬件连接

本演示程序使用了一个树莓派,一个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即可

  • 开启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


下载例程

在树莓派终端运行:

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

接收程序是阻塞的,直到读取到数据就结束。

以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)描述
5V5V5V电源正
GNDGND电源地
SCLK_1D21SPI时钟输入
MOSI_1D20SPI数据输入
MISO_1D19SPI数据输出
CE_1D18数据/命令选择
INT_1D24中断输出

添加驱动

  • 在终端执行:
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/

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