一、概述
在总线通讯中,一般只有CAN具备主动上报的能力,而485、
二总线通讯系统,本身物理上不具备总线冲突检测,要完成地址自动分配或者大量并发的主动上报,只能通过主机的协调来实现尽量高效的上报机制。
二、本文内容
本文将以
XM2BUS的
二总线从机芯片XM332为讲解,其原理可以参考我另一篇
文章《
二总线调试避坑指南》;本文提供一种比较简单的方案实现地址自动分配逻辑,由于地址分配是所有从机都有上报需求,即属于大量并发的情况,因此此方案也适合主动上报。但是要注意的是,当所有从机都需要主动上报的时候,其效率相对于轮询是大打折扣的,因此对于本身对即时性不高的消息,仍建议采用轮询的方式,而对于即时性要求高,但偶发性的消息,可以参考我的另外一篇文章《
二总线主动上报》。
三、名词解释
设计地址自动分配协议以及算法,中间可能涉及部分专业名词,或者为了不用每次用大串词来描述,因此单独定义了一些名词或者变量代号。
1、唯一序列号UID:一般由单片机自带(如STM32的UID由96bit,即12byte组成),或者出厂前烧录,需保证每片从机的唯一序列号不一致。
2、随机数RAND:程序运行时获取随机数值,有些单片机自带随机数发生器,也可利用程序运行由于用户输入的时间随机性、数据接收的时间随机性、AD采样的首bit随机性,来获得随机种子产生随机数。
3、预估总线从站数量PNUM:初始状态,主机初次预估从站数量,并不需要与从站准确数量一致。
4、数据校验CRC:校验传输的数据包是否有错误,一般采用modbus的CRC16。
5、从站上报时间窗口TW:允许从站能够上报的时间窗口,超出时间窗口,从站不得上报。
6、总线忙状态B_BUSY:总线忙时,从站不得上报数据,以避免总线冲突。
四、实现原理讲解
利用主站进行总线广播UID请求,接收来自从站随机上报的UID,主机根据CRC情况来调整PUNM,从而使得从站尽量避免冲突。
举例:若总线真实存在2个从机设备
1、主站广播UID请求,PNUM=4;TW=30ms。
2、从机收到PNUM=4,从机根据随机数RAND,生成概率为1/PNUM=1/4,即25%的概率选择在30ms内(包括所有数据的时间)是否发送;则两台设备同时可能在此TW内都不发送的概率是75%*75%=56.25%,则此TW内,肯定有从机上报的概率是:100-56.25=43.75%;
3、以XM332,9600波特率为例,在TW窗口内,从机再根据随机数RAND生成概率为1/20即5%的概率选择在1~20ms内的,以2ms为单位何时上报UID+CRC,比如第12ms上报UID+CRC,但是前面通过XM332芯片的XM332的CSMA引脚检测到总线忙,则放弃此次上报。
4、经过B,C,可知2台从设备的在TW同时发送的概率是0.25*0.25*0.05=0.3125%,即千分之三左右,冲突概率极低。
5、主站收到UID+CRC并校验正确,则以UID作为地址,通过常规寻址方式,向UID分配地址,并告知此UID从站后续不再监听总线广播UID请求。
6、回到A步骤,PNUM=4,TW=30ms,进行下一次监听。
主站通过调整PNUM的数值,若从站无上报,则减少PNUM数值,若从站上报CRC异常,则增大PNUM数值,最终PNUM降低到1时,则肯定有未分配的从站上报,在初始状态,为了使得PUNM快速匹配接近真实从机数量,建议以2倍数增加或缩减,比如2、4、8、16、32、64、128...
五、总结
虽然涉及简单的概率分析,若有错误也望指出,实际也不影响方案设计,要实现地址分配或所有设备并发上报的目的是尽量分散各设备上报的时刻,而主机作为协调者,只能通过猜测可随时调整上报策略并告知从机,从而使得整个总线在动态中完成地址分配整个过程。
后续还有一篇关于如何实现总线系统中从设备掉线快速检测的方案,希望大家多多关注和点赞,谢谢大家了。