8.1 CAN总线简介
CAN总线是一种异步串行通讯低层网络。对照OSI模型,CAN总线规范仅包含物理层和数据链路层的标准。然而,构建在CAN总线之上的应用层协议(即OSI模型的高层协议)有多种, 譬如针对汽车控制领域和工业控制领域的CANopen协议、针对工业控制领域的DeviceNet协议、针对公交车和卡车控制领域的SAE J1939协议、针对轻型电动汽车领域的EnergyBus协议等。
CAN总线最初由著名的汽车零部件供应商——德国Bosch于1983年制定的,1986年国际汽车工程师协会(SAE)大会上正式公开发布,1991年使用CAN总线的首台汽车——奔驰W140正式推出[1]。 2020年国际CAN大会(iCC)上启动CAN XL(被称为第三代CAN)标准,CAN总线已经历近40年的发展,在汽车控制领域CAN总线仍被广泛使用。CAN总线为什么能够得到广泛认可呢?
CAN总线具有以下几个特点:
- 高可靠性。CAN总线采用无主的网络架构,网络传输不依赖于主机的可靠性。CAN总线采用消息ID和消息体的传输机制(无网络节点ID),每个节点可发送或接收多个ID的消息,任何节点失效都不会影响其他节点和网络。
- 低成本。CAN总线物理层采用低压差分信号,CAN总线物理层接口的收发器成本与RS485收发器相接近,但CAN总线收发器具有网络侦测能力(每个节点都可以检测自己发出的信号)。
- 高传输效率。CAN总线使用面向位流编码的短数据帧,每个位都采用不归零编码,数据域最大长度位8字节。传输短数据帧时占用的网络周期短,受干扰或导致错误数据位的概率低,而且重传的时间也短。
- 易组网。CAN总线采用消息ID(11位或29位两种长度的消息ID)的二进制‘0’位的多少分配消息传输优先级,允许多个节点自动竞争和仲裁获取总线的占用权,甚至支持即插即用的节点。
- 开放协议和生态系统。CAN总线得到广泛应用的关键应归功于Bosch最初采用的开放版权策略,以及由半导体制造商(协议栈的硬件化)、汽车零部件开发商、软件开发商和行业协会等共同参与而打造的CAN总线生态。
本节以CAN2.0A版本为例了解CAN总线的上述基本特点和相关的基本概念。
CAN总线的物理层使用双绞线作为网络介质,两个信号分别称作CAN_HI和CAN_LO,他们组成一对差分信号,由CAN总线节点的物理层接口——总线收发器驱动。 CAN总线的数据帧是面向二进制位编码的结构化位流,每个数据帧都包含帧起始域、仲裁域、控制域、数据域、CRC校验域、确认域、帧结束域和帧间隔域等。
在CAN总线的规范中,将二进制位‘0’定义为“显性位”或“显性信号”、‘1’定义为“隐性位”或“隐性信号”。在传输显性位‘0’时,CAN_HI信号将被拉高到CAN总线收发器的工作电源电压VDD, 同时CAN_LO信号将被拉低到CAN总线收发器GND;传输隐性位‘1’时,CAN总线收发器不驱动CAN_HI和CAN_LO两个信号,即两个信号处于浮空状态,此时两总线信号受120欧姆终端匹配的影响都保持2V左右。
图8.1 CAN2.0A数据帧(位流)和物理层CAN_HI和CAN_LO信号之间关系示意图[1]
在图8.1中,假设某个CAN总线节点发出一个数据帧,其