导航菜单
Toggle navigation
微雪商城
微雪课堂
Raspberry Pi
主板/套件
显示屏
摄像头
扩展板
笔记本
机器人
游戏机
Android/Linux主板
人工智能
主板/套件
显示屏
摄像头
扩展板
机器人
显示屏
LCD/OLED
e-Paper
模块
远距离无线通信
近距离无线通信
有线通信/接口转换
摄像头/音视频
传感器
电机/舵机
大杂烩
机器人
智能车
驱动器/传感器
机械手/云台控制
MCU/FPGA
Arduino
micro:bit
LPC
FPGA
查看“RS485 CAN HAT (B)”的源代码
←
RS485 CAN HAT (B)
跳转至:
导航
、
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
<div class="wiki-pages blue-color"> <div class="tabber"> {{扩展板|colorscheme=blue |name = RS485 CAN HAT (B) |img = [[File:RS485-CAN-HAT-B-1.jpg|360px |alt=RS485 CAN HAT (B)|link=https://{{SERVERNAME}}/shop/RS485-CAN-HAT-B.htm | RS485 CAN HAT (B)]] |category1=树莓派 |brand=Waveshare |feature = 485总线 CAN总线 |interface1 = RPi |interface2 = CAN |interface3 = RS485 }} <div class="tabbertab" title="说明" id="myintro"> =说明= RS485 CAN HAT (B) 是微雪电子为树莓派开发的一款的带 RS485 和 CAN 通信功能的扩展板,具备 RS485、CAN 通信功能。<br /> ==特点== *基于 Raspberry Pi 40PIN GPIO 接口设计,适用于 Raspberry Pi 系列主板 *具备一路 CAN,采用控制器 MCP2515,搭配 CAN 收发器,可实现 SPI 转 CAN *具备两路 RS485,采用 SC16IS752 与 SP3485 双芯片组合方案,可实现 SPI 转 RS485 *板载电源转换电路,支持 8~28V 宽电压供电,可同时给树莓派供电 *板载一体式电源隔离,可提供稳定的隔离电压,隔离端无须额外供电 *板载一体式数字隔离,可进行信号隔离,可靠性高、抗干扰强、功耗低 *板载 TVS (瞬态电压抑制管),可有效抑制电路中的浪涌电压和瞬态尖峰电压,防雷防静电 *板载自恢复保险丝和保护二极管,可确保电流和电压稳定输出,防过流过压,提高抗冲击能力 *板载 120Ω 终端电阻,可通过跳线帽设置使能 *板载端子和排针两种接线方式,接线更方便 *引出 SPI 控制接口,方便接入其他控制器控制 ==产品参数== {| class="wikitable" |- ! 扩展接口 | 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 |} ==接口说明== [[File:RS485-CAN-HAT-B-details-inter.jpg]] *CAN总线(CAN_0,通过SPI0控制) {| class="wikitable" |- align="center" !功能引脚!!树莓派接口(BCM)!!描述 |-align="center" |5V||5V||5V电源正 |-align="center" |GND||GND||电源地 |-align="center" |SCLK_0||11(SCK)||SPI时钟输入 |-align="center" |MOSI_0||10(MOSI)||SPI数据输入 |-align="center" |MISO_0||9(MISO)||SPI数据输出 |-align="center" |CE_0||8(CE0)<ref >CE_0默认焊接到8(CE0),可通过修改背面0R电阻,改焊到CE1上</ref>||数据/命令选择 |-align="center" |INT_0||D25<ref >默认焊接到D25,可通过修改背面0R电阻,改焊到D13上</ref>||中断输出 |} *RS485总线(RS485_0 & RS485_1,通过SPI1控制) {| class="wikitable" |- align="center" !功能引脚!!树莓派接口(BCM)!!描述 |-align="center" |5V||5V||5V电源正 |-align="center" |GND||GND||电源地 |-align="center" |SCLK_1||D21||SPI时钟输入 |-align="center" |MOSI_1||D20||SPI数据输入 |-align="center" |MISO_1||D19||SPI数据输出 |-align="center" |CE_1|||D18||数据/命令选择 |-align="center" |INT_1|||D24<ref>默认焊接到D24,可通过修改背面0R电阻,改焊到D25/D16/D12上</ref>||中断输出 |} ===默认焊点切换说明=== {{Note|当板子默认引脚跟外接的其他设备引脚有冲突时,可尝试修改背面引脚焊盘,即把对应冲突引脚的0R电阻改焊到其他不冲突的引脚上。|warn}} <references /> 详见背面焊点,如下图所示:<br />[[File:RS485-CAN-HAT-B-solder.jpg|600px]] ==硬件说明== ===CAN总线=== CAN 模块的功能是处理所有 CAN 总线上的报文接收和发送。报文发送时,首先将报文装载到正确的报文缓冲器和控制寄存器中。通过 SPI 接口设置控制寄存器中的相应位或使用发送使能引脚均可启动发送操作。通过读取相应的寄存器可以检查通讯状态和错误。 会对在 CAN总线上检测到的任何报文进行错误检查,然后与用户定义的滤波器进行匹配,以确定是否将报文移到两个接收缓冲器中的一个。<br /> <font color="#FF0000"> 由于树莓派本身并不支持CAN总线,因此使用SPI接口的CAN控制器,搭配一个收发器完成CAN功能。<br /> </font> Microchip 的 MCP2515 是一款CAN协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 MCP2515 自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报文,因此减少了主单片机(MCU)的开销。MCU通过SPI接口与该器件连接,即树莓派通过SPI接口连接芯片,对于树莓派使用该芯片不需要编写驱动,只需要打开设备树中的内核驱动即可使用。<br /> [[file:RS485_CAN_HAT_MCP2515.png]]<br /> 更多详细请参考数据手册;<br /> SN65HVD230 是德州仪器公司生产的 3.3V CAN 收发器,该器件适用于较高通信速率、良好抗干扰 能力和高可靠性 CAN 总线的串行通信。SN65HVD230 具有高速、斜率和等待 3 种不同的工作模式。 其工作模式控制可通过 Rs 控制引脚来实现。CAN 控制器的输出引脚 Tx 接到 SN65HVD230 的数据 输入端 D,可将此 CAN 节点发送的数据传送到 CAN 网络中;而 CAN 控制器的接收引脚 Rx 和 SN65HVD230 的数据输出端 R 相连,用于接收数据。<br /> [[file:RS485_CAN_HAT_SN65HVD230.png]]<br /> ===RS485总线=== 本产品采用SC16IS752作为控制芯片,SC16IS752是双通道高性能的UART扩展芯片,支持SPI和I2C两种接口通信,本模块使用SPI接口。板载电源隔离、ADI磁耦隔离、板载TVS(瞬态电压抑制管)、自恢复保险丝和保护二极管和自动收发转换电路。可有效抑制电路中的浪涌电压和瞬态尖峰电压,防雷防静电,防过流过压,提高抗冲击能力,可进行信号隔离,具有靠性高、抗干扰强、功耗低等优点。 通信协议 [[File:RS485 HAT.png|900px]]<br/> CS:从机片选,当CS为低电平的时候,芯片使能 <br/> SCLK: SPI通信时钟 <br/> MOSI/SI:SPI通信主机发送,从机接收 <br/> MIS0/SO:SPI通信主机接收,从机发送 <br/> 时序:CPHL=0, CPOL=0 (SPI0)<br/> 【备注】具体关于SPI通信的相关信息,可以自行网上搜索资料了解 <br/> 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Ω的电阻。<br /> [[file:RS485_CAN_HAT_485.png]]<br /> 其中:SP3485芯片的RE与DE管脚是设置接收与发送;<br /> 本模块用硬件自动控制的收发:<br /> [[File:RS485_CAN_HAT_B_SP3485.png]]<br /> '''数据接收''':TXD此时为高电平, 为休闲状态。这时候MOS管导通,SP3485芯片的RE引脚为低电平,数据接收使能,RO开始接收数据,将485AB口接受到的数据传到MCU。<br /> '''数据发送''':TXD会有一个下拉的电平,表示开始发送数据,此时MOS管截止,DE引脚为高电平,数据发送使能。此时,如果发送的数据为‘1’的时候,MOS管会处于导通,虽然接收会变为有效状态但由于芯片在发送阶段时是高阻状态,所以还是保持发送状态,正常传输‘1’。<br /> =树莓派使用= ==安装库== {{RPI_C_lib}} ===python=== <pre> sudo apt-get update sudo apt-get install python-serial sudo pip install python-can </pre> ====安装python3库==== <pre> sudo apt-get update sudo apt-get install python3-pip sudo pip3 install RPi.GPIO sudo apt-get install python3-serial </pre> ==配置驱动== ===修改配置文件=== 将模块插在树莓派上,然后修改开机脚本config.txt<br /> <pre> sudo nano /boot/config.txt </pre> 在最后一行加入如下: <source lang="python"> dtparam=spi=on dtoverlay=mcp2515-can0,oscillator=16000000,interrupt=25,spimaxfrequency=1000000 dtoverlay=sc16is752-spi1,int_pin=24 </source> 保存退出后,重启树莓派: <pre> sudo reboot </pre> ===检查是否正确配置=== 重启后,SC16IS752和mcp251x的驱动会加载到系统内核中,运行命令查看是否初始化成功:<br /> <pre> dmesg | grep -i '\(can\|spi\)' </pre> [[File:RS485_CAN_HAT_B_init.png]]<br /> 如果不接上模块可能提示如下:<br /> [[File:RS485_CAN_HAT_B_CANinit2.png]]<br /> 请检查是否连接上模块。是否开启SPI并开启MCP2515内核驱动。是否已经进行过重启。<br /> ====RS485==== 此时也可以运行 ls /dev 查看RS485总线是否正确配置,如果正确配置将会多出如下设备: [[File:rs485添加驱动.png|900px]]<br /> <font color="#FF0000"> '''在2020-05-27的树莓派系统中gpiochip3没有了变成了gpiochip2''' </font> ====CAN==== 开启CAN <pre> sudo ip link set can0 up type can bitrate 1000000 sudo ifconfig can0 txqueuelen 65536 </pre> 更多相关CAN内核指令可以查看:<br /> https://www.kernel.org/doc/Documentation/networking/can.txt 查看ifconfig:<br /> <pre> ifconfig </pre> [[File:can_ifconfig.png|600px]] ==CAN使用== ===硬件连接=== <font color="#FF0000"> 本演示程序使用了一个树莓派,一个RS485 CAN HAT (B)模块以及一个USB-CAN-A模块<br /> 提供python与c语言程序<br /> </font> [[File:RS485_CAN_HAT_B_CANtoUSB2.jpg|1000px]] ===小工具简单测试=== *开启CAN:<br /> <pre> sudo ip link set can0 up type can bitrate 1000000 sudo ifconfig can0 txqueuelen 65536 </pre> 更多相关CAN内核指令可以查看:<br /> https://www.kernel.org/doc/Documentation/networking/can.txt 查看ifconfig:<br /> <pre> ifconfig </pre> [[File:can_ifconfig.png|600px]] *安装can-utils: sudo apt-get install can-utils *接收: 终端输入接收数据指令: <pre> candump can0 </pre> 该接收工具是阻塞的,不加参数时运行该工具会一直处于接收状态,使用Ctrl+C退出。<br /> 关于该工具的参数说明可使用: <pre> candump -h </pre> *发送 终端输入发送数据指令: <pre> cansend can0 000#11.22.33.44 </pre> 效果:<br /> [[File:RS485_CAN_HAT_B_canutils1.png]] *自检 终端输入指令: <source lang="python"> 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 设置数据长度 </source> 此时会向CAN不断发送设备ID递增,长度为8,内容随机的数据。同时该命令默认开启环回模式,可在另一个终端窗口运行: <pre> candump can0 </pre> 运行后可以也接收到上面发送的数据:<br /> [[File:RS485_CAN_HAT_B_canutils2.png]]<br /> 测试结束后可以分别在两个终端使用Ctrl+C结束运行。 <source lang="python"> sudo ip link set can0 down sudo ip link set can0 up type can bitrate 1000000 loopback on #关闭环回模 </source> ===下载例程=== 在树莓派终端运行:<br /> <pre> 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 </pre> ====C 程序==== 注意:<br /> 1.确保硬件接线是正确的,即H-H,L-L连接<br /> 2.确保两边的波特率设置一致的,默认的例程设置的波特率为1Mbps<br /> 3.如果长时间发送数据有丢帧现象,可以尝试降低波特率解决<br /><br /> *发送,树莓派打开终端,运行:<br /> <pre> cd RS485_CAN_HAT_B/CAN/wiringPi/send/ make clean make sudo ./can_send </pre> *阻塞接收,树莓派打开终端,运行:<br /> <pre> cd RS485_CAN_HAT_B/CAN/wiringPi/receive/ make clean make sudo ./can_receive </pre> 接收程序是阻塞的,直到读取到数据就结束。<br /> <font color="#FF0000"> 注意:该程序仅能接收帧ID为123的数据,如需接收其它ID数据可自行修改程序<br /> </font> [[file:RS485_CAN_HAT_CAN_reveive.png|600px]]<br /> 以USB转CAN调试工具为例,效果为:<br /> [[File:RS485_CAN_HAT_B_wiringPi.png|1200px]]<br /> ====python 程序==== 树莓派打开终端,运行:<br /> <pre> #发送端: sudo python can_send.py cd RS485_CAN_HAT_B/CAN/python/ #先运行接收程序,再从电脑发送数据: sudo python can_reveive.py </pre> 效果:<br /> [[File:RS485 CAN HAT B CANp.png|1000px]]<br /> ==RS485使用== ===硬件连接=== 详细连接: *C和python例程运行需要一个额外的[https://www.waveshare.net/wiki/USB_TO_RS485 RS485转串口模块]连接通道1才可以看到效果。 *Python中test.py需要通道1和通道2连接。 {| class="wikitable" |- align="center" !功能引脚!!树莓派接口(BCM)!!描述 |-align="center" |5V||5V||5V电源正 |-align="center" |GND||GND||电源地 |-align="center" |SCLK_1||D21||SPI时钟输入 |-align="center" |MOSI_1||D20||SPI数据输入 |-align="center" |MISO_1||D19||SPI数据输出 |-align="center" |CE_1|||D18||数据/命令选择 |-align="center" |INT_1|||D24||中断输出 |} ===测试=== *下载并运行测试例程 <pre> 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/ </pre> ====C 程序==== <pre> cd c make clean make sudo ./main </pre> *此处演示的为:RS485_0的通道1与[https://{{SERVERNAME}}/shop/USB-TO-RS485.htm USB TO RS485]的A.B连接如下图:<br /> [[File:RS485_CAN_HAT_B_485toUSB.jpg|800px]]<br /> 将[https://{{SERVERNAME}}/shop/USB-TO-RS485.htm USB TO RS485]连接到电脑,打开串口助手,选择对应的串口,设置波特率115200。<br /> *执行C程序,电脑发送任何数据,模块将数据返回执行C程序,如下图:<br /> [[File:RS485_CAN_HAT_B_485C.png|1100px]]<br/> '''<font color="#ff0000">(注意: 需要加回车换行才可以,不然数据不会返回;示例的程序目录以实际为主。)</font>'''<br /> ====python 程序==== <pre> cd python cd examples sudo python3 main.py </pre> 该程序与C程序的硬件连接与现象相同:<br /> [[File:RS485_CAN_HAT_B_485python.png|1100px]]<br /> <br /> 当手上没有[https://{{SERVERNAME}}/shop/USB-TO-RS485.htm USB TO RS485]时,可以尝试下面的测试例程: *将通道1的A,B与通道2的A,B连接:<br /> [[File:RS485 CAN HAT (B) 1.jpg|800px]]<br /> *运行test.py,可以得到如下效果: <br/> <pre> sudo python3 test.py </pre> [[File:RS485_CAN_HAT_B_test.png|800px]] </div> <div class="tabbertab" title="资料" id="myresources"> ===Modbus应用实例=== 本实例使用树莓派一个、RS485 CAN HAT扩展板一个、[https://www.waveshare.net/shop/Modbus-RTU-Relay.htm Mobus RTU Relay]继电器模块一个。<br /> ====硬件连接==== *将扩展板安装到树莓派上,然后按A-A、B-B的顺序将扩展版的RS485接口与Modbus模块的RS485接口对应连接; *分别为树莓派和Modbus模块接通电源。 [[File:RS485-CAN-HAT-B-Modbus.jpg|连接示意图]] ====下载例程==== *[[:File:RS485_Modbus_RTU_Relay_Code.zip|下载例程]]: 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依次关闭,不断循环。 *更多程序可参考[https://www.waveshare.net/wiki/Modbus_RTU_Relay#.E7.A8.8B.E5.BA.8F Mobus RTU Relay模块wiki]界面,注意需要将程序中串口号进行修改。 =资料= ===文档=== <!--*[[:File:RS485-CAN-HAT-B-schematic.pdf|原理图]]--> *[https://www.waveshare.net/w/upload/c/cb/RS485-CAN-HAT-B-schematic.pdf 原理图] ===程序=== <!--*[[:File:RS485_CAN_HAT_B.zip|示例程序]]--> *[https://www.waveshare.net/w/upload/9/92/RS485_CAN_HAT_B.zip 示例程序] <!-- *[https://{{SERVERNAME}}/w/upload/d/de/RS485_CAN_HAT_Code.7z 示例程序] --> ===数据手册=== *[https://{{SERVERNAME}}/w/upload/3/36/SP3481_SP3485.pdf SP3485] *[https://v1.cecdn.yun300.cn/100001_2009295029/SIT65HVD230-datasheet-V1.10-cn.pdf SIT65HVD230]、[https://{{SERVERNAME}}/w/upload/8/82/SN65HVD230.pdf SN65HVD230] *[https://{{SERVERNAME}}/w/upload/8/83/MCP2515.pdf MCP2515] </div> <div class="tabbertab" title="FAQ" id="myfaq"> =FAQ= {{FAQ|CAN发送和接收不到数据?| #确定两边的波特率一致; #例程中设置的是固定的帧ID:0X123,请设置好您的CAN另外一端的发送接收CAN ID都是x0123; |||}} {{FAQ|树莓派装了ubuntu系统怎么配置config.txt文件?| #主流的Ubuntu系统config.txt文件通常在/boot/firmware 文件夹 #或者将树莓派的SD卡通过读卡器在电脑下(或者其它能识别SD卡的主机)读取和更改config.txt文件。 |||}} <!-- {{FAQ|将传感器接到RS485后,运行对应程序没有收到数据?| 传感器那边发送过来的可能是hex数据(有时候还需要先发送hex数据给传感器请求数据),按照以下步骤收发hex数据: wget https://www.waveshare.net/w/upload/0/00/RS485-CAN-HAT-B-For-Hex.zip unzip RS485-CAN-HAT-B-For-Hex.zip sudo chmod 777 RS485-CAN-HAT-B-For-Hex.zip cd RS485-CAN-HAT-B-For-Hex #接收Hex sudo python3 RS485-CAN-HAT-B-send-hex.py #发送Hex sudo python3 RS485-CAN-HAT-B-receive-hex\ .py |||}} --> </div> <div class="tabbertab" title="售后" id="mysupport"> =技术支持= <br />{{Service18}}</div> </div>
该页面使用的模板:
模板:FAQ
(
查看源代码
)
模板:Note
(
查看源代码
)
模板:Note/styles.css
(
查看源代码
)
模板:RPI C lib
(
查看源代码
)
模板:Service18
(
查看源代码
)
模板:扩展板
(
查看源代码
)
返回至
RS485 CAN HAT (B)
。