CAN总线是汽车控制器中使用最多的总线,其它常用的数据通信方式还有UART、I2C等等。CAN、UART和I2C都是使用两根线通信,为什么CAN总线通信时会有节点冲突,需要仲裁,而UART就没有冲突呢?另外I2C总线到底需不需要仲裁呢?
1.全双工与半双工
“双工”是与“单工”对应的,双是指双向,单是指单向,“单工”是指一方只能发送,另一方只能接收,也就是任何一方只能在一个方向上工作。
而“双工”是指任何一方都既能发送,也能接收数据,可以在两个方向上工作。
双工又进一步细分为全双工和半双工,全双工是指可以同时进行收发,半双工是指不能同时收发,但可以分时进行收发。
UART(Universal Asynchronous Receiver / Transmitter)通用异步收发器是一种常用的串行通信协议,在汽车嵌入式系统中常用于主芯片之间或主芯片与外设之间的数据通信。
UART只需要两条线就可以实现芯片之间的互连通信,这两根线分别为串行数据发送线TX和串行数据接收线RX。

UART接口
从名字上可以看出,1根TX线负责发送数据,另一根RX线负责接收数据,两根线互相独立,互不干扰,可以同时的进行发送和接收,所以UART是一种典型的全双工通信方式。
这里要注意的是,UART信号线必须交叉连接,也就是一方的发送TX与另一方的接收RX相连。
CAN总线也是只需要两条线就可以实现芯片之间的通信,这两根线分别称为为CAN_H和CAN_L。

CAN总线接口
CAN总线虽然也是两根线,但是它并不是1个发送,1个接收,最后的发送信号是由这两个信号之差(CAN_H-CANL)来确定的,也就是差分传输。所以它不能同时收发,只能分时收发,是半双工通信方式。
在这种半双工通信方式中,如果多个节点同时发送信息就会出现冲突,就需要进行仲裁。比如node1和node2同时发送CAN报文,这时应该让谁发呢?这个处理过程就是仲裁。
有的同学会说,I2C总线也是半双工通信啊,为什么它不需要仲裁呢?
2.多主模式与主从模式
CAN总线中各个节点是平等的,大家都可以发送报文,也就是各个节点都是主节点,这就是多主模式。

CAN总线为多主模式
多主模式的优点是多个节点都可以发送报文,可以提升并发能力,但是缺点就是同时发送就可能导致数据冲突,需要依赖其它方式解决。
I2C虽然也是半双工通信,但是它采用的不是多主模式,而是主从模式。

I2C接口-主从模式
当有多个设备通信的时候,每个设备(包括主设备)都有一个唯一的设备地址。以上图为例,其中的SOC为主设备,EEPROM是从设备1,LCD Driver是从设备2。
主设备在通信时通过SDA发送地址数据来选择对应的从设备,从设备的时钟由主设备通过 SCL 管脚提供。主设备统一指挥各个节点的收发时序,所以各个节点就不会出现同时并发的情况,也就不会产生冲突。
到这里似乎结论已经出来了,I2C没有总线冲突,是不需要仲裁的,答案是这样吗?
3.多主从模式与仲裁
1个主节点和多个从节点的主从模式没有冲突,也就不需要仲裁。这种方式是常见的方式,比如SPI和LIN也是主从模式。
但是I2C与它们还有一些不同之处,就是I2C还支持多主从模式,多主从模式指在总线上可以不只有1个主设备,而是可以连接多个主设备,这些主设备都可以发起对总线的控制。
也就是I2C虽然是主从模式,但是由于可以有多个主设备,导致主从关系不是固定的,它会根据功能需要,在通信过程中动态变化。

I2C接口电路图-多主从模式
如上图所示,EEPROM和LCD Driver两个从设备不变,但是SOC和MCU都可以是主设备,比如某一段时间SOC是主设备,MCU是从设备;而在另一段时间,可能MCU是主设备,SOC是从设备。
那么如果两个主设备在同一时刻都想要做主设备,怎么办呢?这时候就需要仲裁了。
I2C的仲裁机制是如果两个或多个主机同时发送数据,一个主机发送“0”,另一个主机发送“1”时,发送“0”的主机获得控制权,发送“1”的主机将失去仲裁。
这个机制与总线上的物理电平有关,从总线电平来看,就是当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这也称为线与逻辑。

冲突与仲裁
4.CAN总线的冲突与仲裁
我们在开发和测试CAN总线时,可以看到每个报文都是由ID和数据字节构成的,比如下面的周期性报文:

CAN周期性报文-ABS
上面示例中这个报文是由ABS节点发出的,它的ID是0x201,报文中的第1个字节是车速信号,应用时我们会把报文ID当作功能或节点标识来识别。
比如收到这个报文我就知道是车速信号或者收到这个报文就知道是ABS节点发出了CAN消息,这是报文ID从应用角度上所起的作用。
其实报文ID还有1个作用,就是起到了仲裁的作用或者说这才是它最根本的作用。只是这个作用是在底层通信时发生的,应用逻辑处理和CAN测试工具是看不到的,所以对工程师来说是无感的。
4.1.仲裁场
CAN数据帧的帧结构是由7个不同的位场构成,它们分别是帧起始、仲裁场、控制场、数据场、CRC场、ACK场和帧结束。

CAN标准帧帧结构
CAN总线的隐性位对应逻辑“1”,显性位对应逻辑“0”。总线在空闲状态时是“隐性”位,也就是逻辑“1”。
标准帧的仲裁场包括11位的标识符ID(identifier)和1位的RTR。

标准帧结构-仲裁场
标准格式的ID是11位,总线上是以“显性”位为优先,而“显性”位对应逻辑0,因此对应到实际的ID时,就是ID值越小,优先级越高。
比如ID为0x390与0x398同时发送,按由高到低位逐次比较,第11位~第5位相同,而第4位0x390为0,0x398为1,则0x390优先级更高,获得总线控制权。

ID优先级比较
所以通过定义ID标识符数值大小,就可以定义出不同的优先等级,通过优先级就可以解决报文同时发送时的总线冲突问题。
如上图所示,低优先级的报文0x398在发送时会回读自己的发送位,当检测到第4位为0时,不是自己要发送的1,就知道总线上有更高优先级的报文存在,它就会等待高优先级的报文发送完成后再发。
这就是通过报文ID进行仲裁的基本原理。
除了ID外,有的同学会发现仲裁场中还有1个位定义叫RTR。

仲裁场包括ID和RTR
RTR位的作用是用于区分数据帧和远程帧的,在数据帧中它是“显性”位,即逻辑0;在远程帧中它是“隐性”位,即逻辑1。
有的同学不太明白的是,RTR位既然是区分数据帧和远程帧的标志位,为什么会把它也归类到仲裁场的范围呢?
这是因为远程帧和它对应的数据帧的标识符ID是一样的,当两者在总线中同时发送时,仅通过标识符ID是无法仲裁出优先级的,而数据帧的RTR是“显性”,远程帧的RTR是“隐性”,CAN总线的规则是“显性”位优先级高于“隐性”位,因此根据RTR位可以仲裁出同样ID的数据帧的优先级高于远程帧,因此把RTR位也归类到仲裁场中。

ID相同的数据帧与远程帧
5.小结
UART、I2C和CAN总线都是采用两根线的通信方式。UART是全双工通信,发送与接收互相独立,不需要仲裁。I2C采用主从模式通信,单主从时不需要仲裁,多主从时需要仲裁。CAN总线采用的是差分信号、半双工通信及多主模式的通信方式,所以需要有仲裁机制,通过合理设置ID优先级,就可以解决总线报文冲突问题。

扫码关注


















![电子设计:数字信号处理课程小结(已完结)[学以致用系列课程之数字信号处理]](https://api.fanyedu.com/uploads/image/7b/4fe86c99962d21ce79ff1fea61046d.png)


















