矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 1737|回复: 10

开源小芯片可以把 RS485 当作全双工使用,支持 50Mbps

[复制链接]
     
发表于 2023-12-26 18:12:35 | 显示全部楼层 |阅读模式
我们知道,RS485 物理层是半双工,即便总线上只有两个节点,譬如一台 PC 和一个设备,设备也不能主动发数据给 PC,因为可能会和 PC 下发的数据冲突。

这也是为什么 RS232 始终不能被 RS485 所取代的主要原因,除了不能全双工,其它方面 RS485 都要比 RS232 优秀很多,譬如更远的距离、更高的速度、可以连接更多节点、更加抗干扰。

然而,现在可以通过这个小芯片,在半双工的 RS485 总线上,为任意两两节点之间,虚拟出全双工专线。
譬如总线上有 A B C D 四个节点,A B 之间可以随意互发数据,C D 之间也可以,A C 之间也可以,不会出现数据冲突的问题。
而且支持组播通讯:A 同时发数据给 C 和 D. 以及支持广播:譬如 A 同时发送数据给 B C D, 然后 B C D 还可以同时回复数据给 A.

cdctl01a.jpg

芯片的原理其实很简单,它是一个 SPI 转 UART 控制器,UART 端是有指定的数据包格式的(原地址、目标地址、数据长度共 3 字节头 + 用户数据 + 2 字节 CRC 结尾),芯片 UART 口可连接 RS485 接口芯片,控制 RS485 的收发,SPI 口则连接用户 MCU。

072708qdkafn1xbk1i4pnq.png

此 UART 控制器引入了 CAN 总线的仲裁功能,只不过收发是按照标准的串口 8N1 格式(一个启始位,8 个数据位,一个停止位,无校验位)。

在 RS485 上进行收发的时候,会通过包头第一个字节进行仲裁(第一个字节是发送方的地址),按位回读进行非破坏性仲裁,让优先级最高的节点优先使用总线,而低优先级的节点,数据会延后自动重传。

发送首字节时 RS485 是半驱输出,因为回读有延迟,速率建议不超过 1Mbps。
由于 RS485 支持全驱输出,所以从第二个字节开始,可以用更高的传输速率,此芯片速率可以达到 50Mbps(类似 CAN FD 的双速率,但由于 CAN FD 的高速部分依然是半驱输出,所以速率比较受限)。
在需要兼容传统串口的场合,使用仲裁模式时,需要让高速部分的速率和低速部分保持相同。

此芯片同时还支持另一种模式,可以全程使用高速波特率,同样可以把 RS485 当全双工使用 - Break Sync 模式。

原理也不复杂,总线空闲一段时间后,若某个节点想发送数据,需要先发送一个 break 字符(连续 10 个 bit 为 0 的特殊串口字符)。
break 字符在这里的功能是让总线退出空闲状态,而且若有多个节点同时发送 break 字符,也不会有不良影响。

等总线重新进入空闲后,每个节点等待不同的时间发送数据,优先级越高的节点等待的时间越短。由于各节点等待时间不同,所以不会发生数据冲突。
此模式适合节点数相对较少的总线,节点数多了,最大等待时间就会变长,影响效率。

除了以上两种对等通讯模式,还支持传统全双工和传统半双工模式,可以当作普通的串口扩展芯片使用。

芯片源码和细节说明:https://cdbus.org (中文版可参见附件中文数据手册)
CDBUS 的 IP 核 FPGA 用户可以免费商用。


芯片手册:

cdctl01a_datasheet_v1.1_cn.pdf (486.16 KB, 下载次数: 21)

cdctl01a_datasheet_v1.1.pdf (420.93 KB, 下载次数: 4)


相关的开源项目摘选:

半自动桌面视觉贴片机 CDPNP: https://github.com/dukelec/cdpnp
(开源贴片机视频: https://www.bilibili.com/video/BV1cj411Y7qQ/

CDFOC 无刷电机 FOC 控制器: https://github.com/dukelec/cdfoc

CDSTEP 步进电机控制器: https://github.com/dukelec/cdstep

CDCAM 串口摄像头: https://github.com/dukelec/cdcam

CDBUS-BRIDGE(USB 转高速 RS485): https://github.com/dukelec/cdbus_bridge

CDBUS-GUI 开源串口上位机,支持参数配置、波形显示、IAP 升级: https://github.com/dukelec/cdbus_gui

Screenshot_2023-12-25_11-13-46.jpg
     
发表于 2023-12-29 12:58:47 | 显示全部楼层
读了手册,感觉这是东西能帮CPU省下不少处理数据协议的工作,省了不少人力。这公司能提供免费的FPGA核,还允许商用,这点挺牛的。在GitHub上看到它的Verilog源码了。
回复 支持 1 反对 0

使用道具 举报

     
发表于 2023-12-26 20:25:50 | 显示全部楼层
这个芯片真心不错  帮顶宣传。
回复 支持 1 反对 0

使用道具 举报

     
发表于 2023-12-26 20:36:11 | 显示全部楼层
232与485根本就不是一回事,不存在什么替代不替代的,232和485的传输方式和电平都不一样,232是非平衡传输,负电压表示逻辑“1”,正电压表示逻辑“0”,485是平衡传输,与485相似的全双工通信方式是422,485总线是2线,收发都通过这二根线,所以只能半双工通信,422总线是4线,二根收,二根发,所以能全双工
回复 支持 1 反对 0

使用道具 举报

     
发表于 2023-12-29 08:13:57 | 显示全部楼层
485仍然是半双工,这个东西改变不了485物理层的特性,而是类似于一个协议控制器,相当于一个类似SJA1000的器件。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-29 09:56:17 | 显示全部楼层
luosifu 发表于 2023-12-29 08:13
485仍然是半双工,这个东西改变不了485物理层的特性,而是类似于一个协议控制器,相当于一个类似SJA1000的 ...

是的,没错,串口总线也可以和 CAN 总线一样使用了
标题写的是“当做”,而不是把物理层变为全双工
正文也写的是“虚拟出全双工专线”
回复 支持 反对

使用道具 举报

     
发表于 2023-12-29 12:59:23 | 显示全部楼层
dukedz 发表于 2023-12-29 09:56
是的,没错,串口总线也可以和 CAN 总线一样使用了
标题写的是“当做”,而不是把物理层变为全双工
正 ...


实际上就是芯片帮你缓存发送数据,当总线空闲的时候发出,实际上这个工作软件也能完成,使用485总线的软件设计都是需要缓存发送数据的
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-29 16:02:50 | 显示全部楼层
MF35_ 发表于 2023-12-29 12:59
实际上就是芯片帮你缓存发送数据,当总线空闲的时候发出,实际上这个工作软件也能完成,使用485总线的 ...
当总线空闲的时候发出


如果两个节点,都判断当前总线空闲,然后同时发出数据呢?数据不就冲突了。
回复 支持 反对

使用道具 举报

     
发表于 2023-12-31 10:31:10 | 显示全部楼层
dukedz 发表于 2023-12-29 16:02
如果两个节点,都判断当前总线空闲,然后同时发出数据呢?数据不就冲突了。

485 可以检测自己发出去的数据是不是正确,发现不对,回避一个随机时间再发,很简单的事情
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2023-12-31 12:49:15 | 显示全部楼层
本帖最后由 dukedz 于 2023-12-31 12:53 编辑
zhxzhx 发表于 2023-12-31 10:31
485 可以检测自己发出去的数据是不是正确,发现不对,回避一个随机时间再发,很简单的事情


首先,如果两个节点同时发数据,由于线上电阻存在,通讯线两端的电平是不同的,所以两个节点收到的数据和自己发出的数据可能是一样的。也就是说即便发生冲突,单方面也很可能检测不出来。除非不使用全驱,只使用半驱,这样又会对通讯速率等方面有不良影响。(顶楼芯片仲裁模式的策略是低速半驱仲裁,之后高速全驱传输数据,兼顾仲裁和速率。)

传统做法不是判断能否正确接收自己发出的数据,而是直接看对方能否正确回覆自己的消息,如果超时没收到回覆,则等待随机时间,再重新传输。
然而没收到回覆,可能是对方没收到命令,也可能是对方的回覆出错,处理起来也要考虑。

这种超时后等待随机时间的方式,只能在数据量不大的场合,而且毫无实时性可言。冲突本身对接口芯片也有一定的伤害(尽管短期不会损坏),以及短路电流会干扰其它电路。软件处理也很麻烦且容易出错。
回复 支持 反对

使用道具 举报

     
发表于 2024-1-2 10:30:46 | 显示全部楼层
本帖最后由 zhxzhx 于 2024-1-2 10:33 编辑
dukedz 发表于 2023-12-31 12:49
首先,如果两个节点同时发数据,由于线上电阻存在,通讯线两端的电平是不同的,所以两个节点收到的数据 ...


我说的方法,是485的标准做法,485当初就是这样设计的,只是现在没有多少人这样用,它的检测单位是 位,不是字节,也不是一帧数据

也就是说即便发生冲突,单方面也很可能检测不出来。
如果检测不出来,那这个就是正确的.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-3 00:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表