CAN总线通信协议学习4——数据链路层之仲裁规则
CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据若多个设备同时有发送需求,该如何分配总线资源?
解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线(因为以下“先占先得”部分的图为例,若两个设备同时发,之前提到了0强于1的原则,那么如果出现0和1则在总线上只能传输0,则本来要发的1就被破坏了)。
这一节可以理解为CAN总线如何处理多个设备有发送需求时的情况。
CAN总线规定的仲裁情况有两种:先占先得和非破坏性仲裁。
1 先占先得
若某一设备先发送了数据,中途另一设备也想发送数据(如下图),则只能遵循先占先得原则。
先占先得原则如下:
- 若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(即不能抢占优先级,可以发送错误帧/过载帧破坏当前数据)。
- 任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时设备才能发送数据帧/遥控帧。
- 一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送。
- 若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求。
解释:如图,根据“先占先得”原则,A数据先发送,B数据中途想发送时被制止,不能发送,只能等到出现连续11个隐性电平(框部分),表示总线空闲了,才能尝试发送,因此,B波形要移到红框位置结束才尝试发送。
为什么说“尝试发送”呢?如果出现连续11个隐性电平,总线空闲了,但是不止B设备想发送,可能还有C、D...别的设备也在等待总线空闲想发送,那么此时应该如何确定哪个设备发送呢?就要用到下面的“非破坏性仲裁”规则。
2 非破坏性仲裁
2.1 何时进入非破坏性仲裁?
若多个设备的发送需求同时到来或因等待而同时到来(比如A设别输出波形,输出到三分之一位置,B也想发,进入等待;A输出到一半时,C也想发,进入等待;那么等到A发完后,总线空闲,等待的却有B和C两个设备,这就是因等待而同时到来),则CAN总线协议会根据I仲裁段(ID号+RTR)进行非破坏性仲裁。
2.2 如何实现?
实现非破坏性仲裁需要两个要求:
线与特性:即0强于1。总线上任何一个设备发送显性电平0时,总线就会呈现显性电>平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0&X&X=0,1&1&1=1
回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1。
非破坏性仲裁的本质就是:两设备同时发送,某设备发出0读回0则不影响继续发送,而若发出1读回0时则会主动退出,仲裁失败,等待下一次发送,即先出现1的设备会仲裁失利退出。(且位填充规则加的填充位也需要进行仲裁规则的判定,但位填充规则加入的位并不影响仲裁规则)。
由上图例子来理解非破坏性仲裁的过程(可看哔哩哔哩“江协科技”,讲的非常好!!!):
如图,在仲裁失利前(红色前),可以看到,单元1和单元2发出的波形完全一致,总线电平也一致,此段单元1和单元2都是发什么读回什么,直到红色部分单元1发出了逻辑1,单元2发出了逻辑0,由于线与特性,那么总线收到的数据是0,则读回时,单元1和单元2读回都为0,则此时单元1出现了发1读回0情况,单元1就明白了总线有其他设备在使用,单元1此后就会默默退出,仲裁失利,等待下一次发送。
根据其本质可得到以下仲裁特点:
- ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送。(因为ID大的根据二进制证明1比较前出现,则会仲裁失利)
- 数据帧和遥控帧ID号一样时,数据帧的优先级高于遥控帧(帧格式一章说明了数据帧RTR位设置为0,遥控帧RTR为1)
- 标准格式11位ID号和扩展格式29位ID号的高11位一样时,标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)
注:以上均是通过学习参考文献、哔哩哔哩网站上江协科技官方号以及网络资源所得的个人经验,如有侵权,请联系我,欢迎指正。