江协科技 CAN总线入门课程(仲裁)
第四章的主题是总线的资源分配规则,也就是多个设备想同时发送波形时,总线如何进行资源分配。
CAN总线只有一对差分信号线,同一时间只能有一个设备操作总线发送数据,若多个设备同时有发送需求,该如何分配总线资源?
•解决问题的思路:制定资源分配规则,依次满足多个设备的发送需求,确保同一时间只有一个设备操作总线
接下来我们学习的就是CAN总线的资源分配规则。这个规则有两个,规则1是先占先得;规则2是非破坏性仲裁。这两个规则分别对应的是资源冲突的两种情况。其中第一种就是图中所展示的情况,在一个设备发送波形的中途,另一个设备想开始一个新的发送。这种情况好处理,直接不允许新的信号进来就行了。第二个情况就比较复杂,就是把第二个波形往前提,两个波形的起始位置是一眼的,两个设备都在同一时刻想要开始一段波形。既然它们是同时开始的,就没办法用先来后到判定谁先谁后了。第二种情况不太好处理,但是CAN总线设计了一种很巧妙的规则来解决这个问题,那就是非破坏性仲裁。
资源分配规则1 - 先占先得
若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)
任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧
一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求
资源分配规则2 - 非破坏性仲裁
若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送
实现非破坏性仲裁需要两个要求:
线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1。
接下来我们用图形的方式详细解释一下仲裁的全过程。先看一下下面这个非破坏性仲裁过程,仲裁规则是:•数据位从前到后依次比较,出现差异且数据位为1的设备仲裁失利。这里单元1和单元2也就是两个设备,他们的波形想要同时开始产生。其中,单元1第一位SOF是显性0,单元2第一位SOF也是显性0,两个单元同时张开总线,根据线与特性,总线呈现显性0。然后单元1回读总线电平,是0没问题;单元2回读总线电平,是0 也没问题。所以单元1和单元2会继续发送。SOF之后就是ID号了。单元1发送ID号最高位,是0;单元2发送ID号最高位,也是0,根据线与特性,总线呈现显性0。然后单元1回读为0和自己发的一样,没问题;单元2回读为0也和自己发的一样,没问题。所以单元1和单元2仍然会继续发送.......之后每一位都是如此判断。直到红色的这一位,在这一位时单元1的ID号是1,所以单元1发1,释放总线;单元2的ID号是0,所以单元2发0,拉开总线。根据线与规则,总线呈现显性0状态。之后单元2回读为0,和自己发的一样,没问题。但是,单元1这是回读,也是0,这就有问题了。单元1想自己明明发送的是1,但是读回总线电平为什么是0呢?这说明,有别的设备,正在和单元1抢总线,并且在这一位,我发1,它发了0,所以才会呈现出我发1但是读回却是0的现象。在此时刻单元1感知到了别的设备的存在并且单元1发出的数据1,被别的设备的数据0破坏了,所以单元1仲裁失利。之后单元1就转为接收状态,等到下一次总线空闲,再重新尝试发送。
接下来,我们再看两个细节问题,一个是数据帧和遥控帧的优先级,另一个是标准格式和扩展格式的优先级。
首先是数据帧帧和遥控帧的优先级,这里有个结论就是:•数据帧和遥控帧ID号一样时,数据帧的优先级高于遥控帧
接下来看下一个问题,标准格式和扩展格式的优先级:•标准格式11位ID号和扩展格式29位ID号的高11位一样时,标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)