CAN总线协议详解

CAN总线定义:
CAN(Control Area Network)属于现场总线的范畴,是一种高性能、高可靠性、易于开发和低成本的串行总线 。
CAN是由德国Bosch公司在1986年为汽车监测和控制而设计的 。由于其高性能、高可靠性、实时性等优点,随后也广泛用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等多种领域,其在每个领域的广泛使用促进了标准化的进程 。
1991年9月PHILIPS SEMICONDUCTORS制订并发布了CAN技术规范V2.0,该技术规范包括A和B两部分 。2.0A曾在CAN技术规范1.2中定义的CAN报文格式,提供11位地址;而2.0B给出了标准和扩展的两种报文格式,提供29位地址 。此后ISO在1993年11月也正式发布了CAN的国际标准ISO11898 。其中ISO11898-1定义了CAN数据链路层;ISO11898-2定义了非容错CAN物理层;ISO11898-3定义了11898-3的容错物理层 。CAN总线协议只定义了物理层和数据链路层,要将CAN总线应用于实际的工程项目和产品开发中必须制定上层应用协议 。目前汽车上应用的协议有:ISO15675(传输层协议)、ISO14229(应用层协议)等 。
CAN总线的特点
1、 多主控制方式 。在总线空闲时,所有单元都可往总线上发送消息(多主控制) 。最先访问总线的单元可获得发送权(采用CSMA/CA方式) 。当多个单元同时发送时,CANID小的节点获得发送权 。
2、 非破坏性总线仲裁技术 。当总线发生冲突时,高优先级报文可以不受影响的进行传输,保证高优先级的实时性要求;而低优先级的报文退出传输 。
3、 高可靠性 。每帧都有位填充,CRC校验等多种错误检测,保证了极低的错误率;发送期间丢失仲裁或者由于错误而破坏了的数据帧可自动重发(这一点由CAN控制器自己重发,无需人为重新装载发送数据) 。
4、 自动关闭总线 。CAN控制器可以检测和判断总线上的错误类型,是短暂的数据错误(如外部噪声),还是持续数据错误(如单元内部故障、驱动器故障、短路故障等) 。当错误为持续性故障时,CAN控制器可自动关闭,脱离总线,以免影响总线上的其他节点正常通信 。
CAN总线拓扑图
CAN控制器根据两根线上的电位差来判断总线电平 。总线电平分为显性和隐性电平,二者必居其一 。发送方通过使总线电平变化,将消息发送给接收方 。下图1是一个CAN总线连接示意图 。
下图1由两个CAN网络组成,其中一个网络通信速率为500K,另外一个为125K 。每个CAN网络由CANH和CANL两根线组成,各个节点(ABS、SAS、ETM、ECM)分别连接在CANH和CAHL上 。在每个CAN网络的头尾分别连接了两个终端电阻,终端电阻的大小为120欧姆 。
下图1左边阴影部分是某个节点的内部电路模块,包含CPU、CAN控制器(CAN Controller,一般单片机都集成了CAN控制器模块)以及CAN收发器(CAN transceiver) 。其中CPU负责将需要发送的数据传递给CAN控制器,以及接收从CAN控制器中解析的数据;CAN控制器将Rx脚的二进制的0/1转换为具体的报文,然后将报文传递给CPU,以及将CPU需要发送的报文转换为二进制0/1,然后通过Tx脚传递给CAN收发器 。CAN控制器的主要功能是电平转换,将CANH和CANL上的电平转换为Rx脚上的0/1,将Tx脚上的0/1在CANH和CANL进行转换 。

CAN总线协议详解

文章插图
图1
信号电平
高速CAN,定义 当CANH 和 CANL 电压相同(CANH = CANL = 2.5V)时为逻辑“1”,CANH和CANL 电压相差 2V(CANH = 3.5V, CANL = 1.5V) 时为逻辑“0” 。高速CAN收发器在共模电压范围内(-12V ~ 12V),将CANH和CANL电压相差大于 0.9V 解释为显性状态(Dominant),而将CANH和CANL电压相差小于 0.5V 解释为为隐性状态(Recessive) 。
CAN总线采用不归零码位填充技术,也就是说CAN总线上的信号有两种不同的信号状态,分别是显性的(Dominant)逻辑0和隐形的(recessive)逻辑1,信号每一次传输完后不需要返回到逻辑0(显性)的电平 。
CAN信号传输
CAN总线协议详解

文章插图
图2 a
发送过程: CAN控制器将CPU传来的报文转换为逻辑电平(即逻辑0-显性电平或者逻辑1-隐性电平)通过Tx脚传递给CAN收发器 。CAN收发器接收逻辑电平之后,再将其转换为差分电平输出到CAN总线上 。
CAN总线协议详解

文章插图
图2 b
接收过程: CAN收发器将CAN_H 和 CAN_L 线上传来的差分电平转换为逻辑电平输出到CAN控制器的Rx脚,CAN控制器再把该逻辑电平转化为相应报文发送到CPU上 。


推荐阅读