CAN总线之理论篇(一)
前段时间负责即将发布的SoC上CAN总线模块的开发,截止目前为止,整个驱动模块不管在裸机还是在Linux下测试性能都很稳定,并且整个底层代码完善了代码规范,前期基本上算告以尾声。在这个开发过程中有很多记录,在此和大家交流分享一下。
CAN总线是啥?
为了知识的完备性稍微了解下背景,网上一搜一大堆。
-
CAN总线是由德国研发和生产汽车电子产品著称的BOSCH公司开发的, 此后CAN协议经过 ISO 标准化后有两个标准:ISO11898标准 和 ISO11519标准。 现在已是汽车网络的标准协议,同时是目前国际上应用最为广泛的现场总线之一。
-
引用一个比喻:把汽车比如成人体,那CAN总线就是神经系统,电子控制单元(ECU)就是身体的一部分,身体是由多个ECU组成的,各个ECU之间通过神经系统进行通信,一个部分感知到的信息可以与另一部分共享。
-
CAN 是 Controller Area Network 的缩写(以下称为 CAN),是ISO国际标准化的串行通信协议。
-
CAN 在汽车上的应用示例
-
CAN总线基本结构
CAN总线协议分析
CAN总线协议如下表所示涵盖了ISO规定的OSI基本参照模型中的传输层、数据链路层及物理层。后续内容大致依次按照此顺序展开。
物理层
-
首先CAN总线通信是没有时钟信号来进行同步的(即异步通信)和IIC及SPI等具有时钟信号通信方式不同。
-
如上面“CAN总线基本结构” 图所示, 连接在CAN总线上的设备叫做节点设备(CAN Node),CAN的通信节点由一个CAN控制器和一个CAN收发器组成。一般CAN控制器集成在主控芯片内部,需要外接CAN收发器(也有部分集成在芯片内部的,感兴趣的自行查找)。同时CAN总线只具有CAN_High和CAN_Low一对差分信号线,线上传输为对称的差分电平信号。其中CAN收发器的作用则是把逻辑信号转换为差分信号:
-
上面说到CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。二者对于数据链路层的定义相同,但物理层不同。ISO11898是针对通信速率为125Kbps~1Mbps 的高速通信标准,而 ISO11519-2是针对通信速率为 125Kbps以下的低速通信标准。物理层特征如下所示:
放大上图电平部分如下所示:
发送数据时,CAN控制器把需要发送的二进制编码通过CAN_TX信号线发送到CAN收发器上,再由CAN收发器把TTL逻辑电平信号转换为CAN差分信号CAN_High 和CAN_Low发送到CAN总线上。接收数据的过程则与发送数据的过程相反。 -
所谓的差分信号,即信号的逻辑“0”和逻辑“1”不再是单纯的与地线电压比较的低电平和高电平,而是根据两条差分信号线的电压差决定逻辑“0”和逻辑“1”。如上所示,不同标准的CAN,其物理层信号也有所差异,以ISO11898协议为例,隐性(逻辑“1”)时,CAN_High 和CAN_Low 电压都为2.5 V,即两者的电压差 VH - VL= 0;显性(逻辑“0”)时,CAN_High电压为 3.5 V,CAN_Low为1.5V,即电压差 VH - VL= 2 V。所以判别CAN总线是逻辑“1”还是逻辑“0”不是依靠CAN总线信号的电压值,而是CAN 总线两条总线的电压差。
-
关于CAN总线“线与”逻辑的说明:总线上执行逻辑上的“线与”时,显性电平的逻辑值为“0”,隐性电平为“1”。“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强,优先级更高)。
CAN报文(message)种类
CAN总线物理层非常简洁,仅采用两根差分线来组成一个数据通道。与USB协议相同(后续看项目情况,可能更新USB协议内容),物理层决定了CAN总线必须配套更加复杂的上层协议,即对数据和操作指令打包。CAN总线以 “帧”(Frame)的形式进行通信。CAN总线协议规定了5种帧,分别是数据帧、远程帧、错误帧、超载帧以及帧间隔,其中数据帧最常用,下表是各个帧的用途。
数据帧有 标准格式(CAN2.0A) 和 扩展格式(CAN2.0B) 两种格式。标准格式有11个位的标识符(ID),扩展格式有29个位的ID。扩展格式的基本ID和标准格式的ID相同。禁止高 7 位都为隐性(禁止设定:基本 ID=1111111XXXX)。数据帧一般由7个段构成,如下所示:
分段介绍如下:
帧起始——SOF
仲裁域——ID
仲裁域——SRR
仲裁域——IDE
仲裁域——RTR
远程帧没有数据段。