Controller Area Network简称CAN总线是一个在汽车电子上用得非常广泛的一种协议,CAN总线有众多优点……
好,说了那么多CAN的特点之后激起了我对CAN总线工作原理的兴趣。CAN总线的总线仲裁机制是我觉得设计的非常精妙的,下面总结几个CAN总线的特征点,这几个特征点对理解CAN的总裁机制非常重要。
1、CAN总线在物理层上只有两根线CANH和CANL,根据两根线的的电位差来判断总线电平,而不是两根线单独传输数据(像串口的TXD和RXD一样)。总线电平分为显性电平和隐形电平两种,相当于二进制中的0和1。
2、CAN总线上可以挂载很多和CAN控制器单元,每个单元都可以是主机,可以发送和接收数据。但是有与总线上单元众多,所以会导致发送冲撞。为了避免发送冲撞,CAN协议规定只有等信道空闲的时候某一个CAN单元才能占有总线并发送数据。但是仅仅这样做还不足以避免所有的信号冲撞,例如如果有两个单元同时要发送数据的时候,他们同时检测信道是否空闲,同时准备发送数据,这样就会产生冲撞。
3、为了解决2中所说的冲撞问题,CAN协议提出了优先级的概念。规定每一个CAN单元都有一个标识符(Identification)简称ID,这个ID标识了CAN单元的优先级。多个单元同时发送数据的时候,优先级较高的单元优先发送数据,低优先级的单元则等待。
4、就像3中说的,通过优先级来决定哪个单元优先发送数据,但是每个单元并不知道与自己同时发送数据的单元的优先级到底是比自己高还是比自己低。解决办法就是使用1中所说的CAN总线的物理特性来解决。举一个例子来形象地说明一下,这里暂时先抛开CAN总线的物理特性,使用我们自己的熟知的数字电路知识,假设单元之间只使用一根线连接,线路的电平状态为0或者1,且0位显性1位隐形,也就是0电平和1电平进行“线与”操作的话会出现0电平(0 & 1 = 0)。好,假设这里有两个单元:单元1和单元2,单元1的优先级为0010 0011(b),单元2的优先级为0011 0101(b),我们规定优先级数值越小的单元优先级越高,也就是0000 0000(b)的优先级最高而1111 1111(b)的优先级最低。那么我们知道单元1的优先级是要高于单元2的。就在公元2018年1月22号早上10点41分22秒276毫秒33微秒的时候,两个单元要同时发送数据,虽然我们不想他们两个发生冲撞,但是还是不可避免的发生了。按照正常的手续来,第一步,两个单元先检测信道是否是空闲,检测结果是空闲,两个单元都可以进行数据发送,但是彼此不知道对方也要进行数据发送。第二步,发送各自的优先级ID,我们规定先发送高位,这时候单元1发送了0,单元2发送了0,在物理线上进行线与之后得到了0,单元1和单元2都说了:“啊,太开心了,我发出去了0,线上的状态的确是0”,好进行下一位数据的发送,单元1发送了0,单元2发送了0,在物理线上进行线与之后得到了0,单元1和单元2都说了:“啊,真好,我发出去了0,线上还是0”,但是其实他们都是“傻逼”,因为0和任何数进行与操作都是0,所以发出去是0检测线上的信号一定也是0。好,继续下一位数据,这次两个单元的数据都是1了,这样线与之后线上的电平还是1,单元1和单元2都说了:“啊,你才是傻逼,我发出去1了,我还是能收到1!”。好好好,我不跟你犟,我们再看下一个数据,这下就有好戏看了,单元1发出去了一个0,而单元2发送出去了一个1,进行线与操作后得到了0,也就是说单元0发送出去0,线上结果是0,但是单元1发送出去1但是线上结果是0,这时候单元1笑了说:“哈哈,我发出去的和检测到的是一样的”,而单元2哭着说:“我发出了1但是检测到了0,这说明总线上还有一个单元在发送数据,并且他发送的是0,也就是说他的优先级比我要高,我要让他先走”,好了终于分出个高下了,单元1继续发送数据,单元2等待单元1发送之后再进行发送。好,例子说完了,总线上不同单元同时发送数据的情况完美地解决的,虽然有的单元心里可能有点憋屈,但是谁叫别人的优先级更高呢!这是我们规定的物理层通信协议,其实CAN总线的总线仲裁方式跟我们的例子是如出一辙的,是不是很佩服设计者的脑子!