本帖最后由 dukedz 于 2017-8-6 16:01 编辑
历史
2009 年大二下学期,我和小夥伴们一起参与一个校企联合项目,开发一款煤矿用皮带机综合保护器, 我主要负责电路软硬件设计,因为矿井中皮带很长,保护器节点间相距约六百米, 各节点除了处理数据收发还要负责中继,为了更优的可靠性和实时性,中继部分采用 FPGA 硬件实现, 因此中继带来的延时远小于一个位长。 因为没有额外的主机,按照传统,只能指定其中一个节点为主机, 该节点负责持续发出查询命令同步所有节点之数据,但万一该主节点中途出故障下线,整个总线将会停止运行。 所以为了进一步提升系统鲁棒性及降低软件复杂性,于是我设计了一款带仲裁的 485 协议,做到节点间可以自由收发数据, 只有第一字节用做仲裁的字段使用低速传输,剩余数据使用传统 485 高速传输,在引入仲裁的同时保留了高速,当然也是由硬件实现。
软件实现数据链路层的缺点
无论是串口还是 485 通讯,传输的数据正常都是要打包发送,常见的有类似 “ff aa” 两个字节做为数据帧的开头,加上用户自定义的数据格式可以判断帧的结尾。
数据帧由 “ff aa” 开头的缺点:这些标志常与其后数据重复,如果帧数据也含有一个 “ff aa”, 那么当数据出错可能会导致解析错位,接收方误以为帧数据中的 “ff aa” 是帧头标志,而且出错之后又会影响下一个数据包导致错误继续。
数据帧以空闲状态做区分的缺点:通常不可以使用 FIFO 和 DMA 接收数据,因为那样做会导致很多帧在内存中连接在一起,无法通过时间信息来区分。 如果不使用 FIFO 和 DMA, 不仅会增加 CPU 开销,而且会对实时性有更高要求,为不同中断制定优先级顺序时会十分困难: 如果接收的优先级更高,那么每当总线有数据的时候,其它任务就会被打断; 相反如果接收的优先级较低,那么又可能会经常丢失数据。
数据帧由硬件来负责接收可避免这些问题。
在普通的 485 应用场景中,CPU 直接控制 485 接口芯片接收数据,即使该数据帧并非发给自己,CPU 也要被总线数据频繁中断,影响效率。 同时收到数据帧后还要校验以确保正确性,是一件非常占用 CPU 资源的工作。
同时,由于传统 485 只能单台主机不停查询各从机以同步数据,总线的数据一定少不了,且利用率很低,实时性和鲁棒性也差。 譬如有一个从机是一只开关,主机为了知道开关当前是否按下,要不停发送查询数据包,然后开关回覆一个包含当前状态的数据包给主机; 如果可以做到各节点均可主动发出数据包,那么当开关状态改变时,只需要发送一个数据包给主机便可,即快省又便捷。
CAN 总线的局限
为了降低 CPU 占用和自由收发数据帧,所以一部分人选择了 CAN 总线,CAN 控制器由硬件处理数据帧收发、校验,同时提供自由收发数据帧的能力(仲裁), 但是 CAN 的数据帧最多只能传输 8 个字节数据,而且高速 CAN 最高速率只有 1 Mbps, 比 485 的标准 10 Mbps 低太多(485 速率还可以更高),而且 CAN 的版权费用导致成本很高。
最新的 CAN FD (CAN with Flexible Data-Rate) 可以支持超过 1 Mbps 的速率,但由于硬件依旧不是推挽输出,所以通常也只有 2 Mbps、3 Mbps, 而且也找不到独立的控制器芯片, 由于要兼容 CAN2.0, 加上 CAN 本身硬件较为复杂,Microchip 2015 年说计划推出 CAN FD 控制器,结果到现在也没有出来。
CAN 协议使用消息类型取代站地址,同一类型消息只能由单个节点发出,否则仲裁机制将会失效。 譬如:如果有 3 只限位开关可使电机停止,必须定义 3 个功能重复的消息:为开关 1 定义消息 “STOP1”, 为开关 2 定义消息 “STOP2”, 以此类推,最终当电机收到以上任意消息便停转。
总线上所有设备共享同一个消息分配空间,如果需要改变某个设备的消息定义,必须充分考虑是否会影响其它所有设备。
在节点本来就不多的系统中(不超过 255),仅使用单播和广播就完全够用:譬如我要同时控制四个车窗升降, 分别发送四个数据包给四个玻璃窗也不会很低效,而且当我想单独控制某一个玻璃窗时也不需要改变数据包定义; 又如,当刹车等紧急情况发生时,使用广播包可以最迅速通知到每一个节点,即便车窗不响应该命令,被紧急事务打断一下也是完全可以接受的。
CD-BUS 介绍
2017 年初,我接手一个工业机械臂的项目,为了分别调试电机电流环、速度环及位置环参数,需要实时抓出电机运行中的数据,总线上还有很多传感器,即使是正常使用数据量也会很大, 同时还要兼顾成本和电路面积,市面很多总线协议均不符合需求,为此,我把 09 年的协议命名为 CD485 协议,并推出独立的控制器模组/芯片。
CD-BUS 协议只定义数据帧格式,不规定所装载数据格式;只支持单播和广播,不支持多播;只提供硬件避让、避让后自动重传,而应答及出错处理则由上层软件负责。
当前硬件支持的特性:
• 支持 CD-BUS 多主对等通讯协议,使用发送方地址按位仲裁
• 每个数据帧可装载 253 字节数据
• 8 个接收缓冲页,2 个发送缓冲页,每个页 256 字节
• 16 位硬件 CRC 校验
• 波特率范围 412 bps 至 9 Mbps(如果需要可以支持更高)
• 仲裁字段和后续数据可设定不同波特率
• 可兼容传统 RS485 总线设备
• 支持 SPI 和 I2C 接口
• 配置和使用简单
CD-BUS 协议
如果把两个波特率设置同等大小,便可以在保留仲裁机制的同时与传统 485 硬件进行通讯,传统硬件优先级设置高于 CD485 节点, 由 CD485 节点主动避让传统节点。当然还可以关闭仲裁功能,完全使用传统通讯模式。
CD-BUS 和 CD485XX 控制器还适用于 RS485 之外的硬件媒介,譬如单线 UART 总线。
在低速率且成本非常紧的场合,也可以用单片机软件模拟实现此协议。
电路参考
完整文档
cd_bus_intro_cn_170806.pdf
(866.14 KB)
cd485b1_dm_cn_170806.pdf
(725.88 KB)
实物图(上一版本)
|