最近学习了CAN总线,在此记录。
概述
CAN(Controller Area Network,控制器局域网)总线是一种广泛应用于汽车和工业领域的通信协议和物理层总线标准。它允许多个电子控制单元(ECU,Electronic Control Unit,可以看作是一台超小型的计算机)之间进行可靠的数据传输和通信。
工作原理
CAN总线通过差分信号线、帧格式、事件驱动的通信机制、冲突检测和错误检测恢复机制等,实现多个ECU之间的可靠数据传输和通信。
物理层
CAN总线使用差分信号线传输数据。差分信号线包括CAN_H(高电平)和CAN_L(低电平)两根线,两者之间的电压差表示数据传输的逻辑状态。
这种差分信号线的设计使得CAN总线具有抗干扰能力,能够在电磁干扰较强的环境中正常工作。
要进行CAN通信,需要专门的CAN收发芯片。
普通电平信号经过CAN收发器后就会被转化为差分信号。差分信号经过CAN收发器后也会被转化为普通电平信号。
差分信号:用两根线表示一个信号。当两根线电压值均为2.5V时,表示此时的状态为逻辑1;当两条线电压值出现差异时,通常CAN_H为3.5V、CAN_L为1.5V,表示此时的状态为逻辑0。
即:差分电压CAN_diff = 0V,表示逻辑1,隐形;
差分电压CAN_diff = 2V,表示逻辑0,显性。
帧格式
CAN总线使用帧格式来组织和传输数据。
CAN总线消息帧可根据用途分为四种类型:数据帧、远程帧、错误帧以及超载帧。
数据帧
用于传输数据。
-
起始位:一定是逻辑0。
-
标识符(11位或29位):用于区分不同的信息。
根据这11位(或29位)标识符,ECU就能知道这一帧信息是发送给哪一个设备的。
- RTR:用于区分数据帧或远程请求帧。
如果是远程请求帧,这一位是1。
如果是数据帧,这一位是0。
- 控制码(6位):用于控制数据长度。
第一位:IDE位。用来区分标准格式(11位标识符)和扩展格式(29位标识符)。
第二位:预留位。逻辑0。
第三到六位:DLC位。数据长度代码,4位二进制代码,如果DLC为0001,则表示后面的数据段只有1个字节、8位;如果为1000,则表示后面的数据段只有8个字节、64位。
-
数据段:包含实际的数据信息。
-
循环冗余校验位(16位):为了确保数据的准确性。
前15位为CRC校验码。
最后一位为CRC界定符,为逻辑1。目的是为了把后面的信息隔开。
- ACK确认槽
发送端发送的是逻辑1,接收端回复逻辑0表示应答。
- ACK界定位
一定是逻辑1。作用为把后面的数据隔开。
- 停止位(7位)
这7位都是逻辑1。表示数据帧传输结束。
远程帧
向其他节点请求发送具有同一标识符的数据帧,远程帧没有数据段,且RTR位为逻辑1。
错误帧
当节点检测到一个或多个由CAN标准所定义的错误时,就会产生一个错误帧。错误帧由错误标志 和错误界定符两个部分组成。
错误标志分为主动错误标志和被动错误标志。
-
主动错误标志由6个连续的逻辑0组成。
-
被动错误标志由6个连续的逻辑1组成,除非被其他节点的显性位覆盖。
-
错误界定符由8个连续的逻辑1组成。
超载帧
用于在先前和后续的数据帧(或远程帧)之间提供一附加延时,超载标志由6个连续的逻辑0组成,超载界定符由8个连续的逻辑1组成。
通信机制
CAN总线采用事件驱动的通信机制。ECU可以发送和接收信息。当一个ECU要发送信息时,它将信息封装成CAN帧,并通过总线发送出去。其他ECU在总线上接收到这个CAN帧后,会检查帧的标识符,并根据优先级进行处理。
冲突检测
CAN总线使用非破坏性的位级冲突检测。如果两个ECU同时发送消息,它们的CAN帧会在总线上发生冲突。在CAN总线上的每个节点都有能力检测冲突,并在检测到冲突时停止发送,以避免数据损坏。
在CAN总线上发送的每一条报文都具有唯一的标识符(11位或29位),当节点同时发送报文时,CAN总线将按照“线与”(1&0=0)机制对ID的每一位进行判断,当有一个节点发送逻辑0则总线的状态就是逻辑0,因此ID的值越小优先级越高
。
错误检测和恢复
CAN总线具有内建的错误检测和恢复机制。它使用循环冗余校验(CRC,Cyclic Redundancy Check)来检测数据传输中的错误。如果检测到错误,可以触发重传机制来保证数据的可靠性。
参考:https://zhuanlan.zhihu.com/p/346696648