背景介绍
CAN 是控制器局域网络(Controller Area Network,CAN)的简称,是一种能够实现分布式实时控制的串行通信网络
CAN 的发展历史节点:
- 1983年,BOSCH开始着手开发CAN总线;
- 1986 年,在SAE会议上,CAN总线正式发布
- 1987 年,Intel和Philips 推出第一款CAN控制器芯片
- 1991年,奔驰 500E 是世界上第一款基于CAN总线系统的量产车型
- 1991年,Bosch发布CAN 2.0标准,分 CAN 2.0A (11位标识符)和 CAN 2.0B (29位标识符);
-
1991年, ISO发布CAN总线标准(ISO 11898),随后该标准主要有三部分:
- ISO 11898-1:数据链路层协议
- ISO 11898-2:高速CAN总线物理层协议,通信速度为 125kbps-1Mbps。
- ISO 11898-3:(整合了ISO11519)低速CAN总线物理层协议,通信速度为 125kbps 以下。
- 2011 年,开始CAN FD协议的开发。
- 2015年,ISO11898-1进行了修订,将CAN FD加入其中。
CAN 总线协议介绍
CAN总线协议有CAN1.0、CAN2.0(CAN2.0A,CAN2.0B),其中CAN2.0对比1.0,主要是增加了CAN的扩展帧定义。现在我们所说的CAN通常都是指CAN2.0标准的总线
CAN-FD协议在原有的CAN协议基础上,增加了可变波特率、扩大数据场、提升校验算法安全性等改进。
本文主要讲述CAN的数据通信
CAN 的物理通信形式
通过两条通信线(双绞线)产生的电压差传输数据,一个CAN网络里的所有节点都挂在这两条通信线上,使用差分信号半双工通信。
CAN 使用称为CANH/CANL 的通信线程执行传输和接收。电位差较小的电信号称为隐性(Recessive)信号,其逻辑值为1 。电位差较大的电信号称为显性(Dominant)信号,其逻辑值0.如果通信总线上发生显性和隐性冲突,则显性优先。总线空闲时保持隐性。
CAN总线的物理层逻辑电平,分为高速ISO11898标准(125kbps ~ 1Mbps)和低速ISO11519标准(10kbps ~ 125kbps);
低速的物理电平如图
而我们现在通常使用的CAN2.0,都是使用高速CAN标准,其物理层电平如图:
对于高速CAN,总结一下,也就是:
- CAN_H - CAN_L < 0.5V 时候为隐性的,逻辑信号表现为 “逻辑1”- 高电平
- CAN_H - CAN_L > 0.9V 时候为显性的,逻辑信号表现为 “逻辑0”-低电平
关于CAN 通信的电平传输,一个重要概念就是:
CAN 总线在电平 传输上,具有判断逻辑,优先级为:显性(低电平)> 隐性(高电平)
在理解CAN总线传输过程中,要清楚这一规则在传输时的灵活运用,及便理解各种帧形式的优先级
CAN的数据格式
CAN的数据定义了有5种帧类型
帧 | 帧用途 |
---|---|
数据帧 | 用于节点向外传送数据 |
遥控帧 | 用于向运端节点请求数据 |
错误帧 | 用于向远端节点通知校验错误,请求重新发送上一个数据 |
过载帧 | 用于通知远端节点:本节点尚未做好接收准备 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来 |
其中,遥控帧也常被称为远程帧。CAN的应用开发者只能使用“数据帧”和“遥控帧”,其他的3种帧类型是由CAN的底层固件自动帮我们在特定场景下进行收发,开发者无需担心也无法直接参与控制。
所以,本文把“数据帧”和“遥控帧”与其他的3种帧类型分别进行介绍。
数据帧与遥控帧
关于数据帧,也就是我们最常用的帧类型,用于数据的收发;也是CAN通信里最主要的内容。
而遥控帧,只是CAN网络里的某一节点发送一个遥控帧请求其他的节点反馈数据给自己,关于遥控帧其实在实际使用中,显得很鸡肋,原因有:
1、CAN通信作为一种半双工通信形式,在实际使用中的应用层通信协议往往会定义好数据的应答机制与时间间隔,节点与节点之间只要按照协议规定进行数据的收发即可。
2、遥控帧与数据帧对比,其实就是一条数据长度为0的数据帧而已,只是在帧格式里的仲裁段RTR位为隐性。那么,似乎有数据帧就足够了。
3、遥控帧的概念定义只是一个预定义,所谓的请求其他节点给自己发送数据并不是强制的,与数据帧一样完全根据应用层协议来规定其具体的使用。
综上所述,CAN里定义的遥控帧实际作用不大,而且可以用数据帧配合应用协议的定义,进行替代。所以在后来的CAN-FD中已经取消了遥控帧的定义了。
数据帧 与 遥控帧的数据格式
不管理Classic CAN Frame 还是CANFD Frame ,其帧结构都由以下7个段组成:
-- SOF 帧起始
-- arbitration field 仲裁段
-- control field 控制段
-- data field 数据段
-- CRC field CRC段
-- ACK field ACK段
-- EOF 帧结束
依次排序为
帧起始 | 仲裁段 | 控制段 | 数据段 | CRC段 | ACK段 | 结束段 |
---|
这7个段,每个段里又都 有自已的格式细分,有两种格式:标准备格式和扩展格展格式。
CAN的应用开发者只使用其中的仲裁段、控制段和数据段。其他部分都由CAN底层固件自动封装!
由上图可以看到,对于仲裁段和控制段在标准帧与扩展帧里有不同的定义,其他段一致。
帧起始与帧结束
- SOF 帧起始:由一个显性位(低电平)组成,发送节点发送帧起始,其他节点同步于帧起始
- EOF帧结束:由7个隐形位(高电平)组成
仲裁段内容
- RTR位:用于指于这包数据是遥控帧还是数据帧,数据帧的RTR 位为显性电平(值为0),远程帧为隐性电平(值为1)
所以帧格式和帧ID相同的怀脱 下,数据帧优先于远程帧
- IDE : 用于指于这包数据是标准帧还是扩展帧,标准帧的IDE位为显性电平(值为0),扩展帧的IDE位为隐性电平。
对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高
数据段
一个数据帧传输的数据量为0~8个字节,遥控帧的数据长度固定为0