一、何为CAN?
CAN的全称为Controller Area Network,也就是控制局域网络,简称为CAN。CAN最早是由德国BOSCH(博世)开发的,目前已经是国际标准(ISO 11898),是当前应用最广泛的现场总线之一。BOSCH主要是做汽车电子的,因此 CAN一开始主要是为汽车电子准备的,事实也是如此,CAN协议目前已经是汽车网络的标准协议。当然了,CAN不仅仅应用于汽车电子,经过几十年的发展,CAN协议的高性能和高可靠性已经得到了业界的认可,目前除了汽车电子以外也广泛应用于工业自动化、医疗、工业和船舶等领域。 以汽车电子为例,汽车上有空调、车门、发动机、大量传感器等,这些部件都是通过CAN总线连在一起形成一个网络,车载网络结构如下图所示:
上图中各个单元通过CAN总线连接在一起,每个单元都是独立的CAN节点。同一个CAN网络中所有单元的通信速度必须一致,不同的网络之间通信速度可以不同。比如图中125Kbps 的CAN网络下所有的节点速度都是125Kbps的,整个网络由一个 网关与其他的网络连接。
CAN的特点主要有以下几点:
- 多主控制
在总线空闲时,所有单元都可以发送消息(多主控制),而两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。 - 系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。 - 通信速度快,距离远
最高1Mbps(距离小于40M),最远可达10KM(速率低于5Kbps)。 - 具有错误检测、错误通知和错误恢复功能
所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。 - 故障封闭功能
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。 - 连接节点多
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
二、CAN电气属性
CAN总线使用两根线来连接各个单元:CAN_H 和CAN_L,CAN控制器通过判断这两根线上的电位差来得到总线电平,CAN总线电平分为显性电平和隐性电平两种。显性电平表示逻辑“0”,此时CAN_H电平比CAN_L高,分别为3.5V和1.5V,电位差为2V。隐形电平表示逻辑“1”,此时CAN_H和CAN_L电压都为2.5V左右,电位差为0V。CAN总线就通过显性和隐形电平的变化来将具体的数据发送出去,如下图所示:
CAN总线上没有节点传输数据的时候一直处于隐性状态,也就是说总线空闲状态的时候一直处于隐性。CAN网络中的所有单元都通过CAN_H和CAN_L这两根线连接在一起,如下图所示:
图中所有的CAN节点单元都采用CAN_H和CAN_L这两根线连接在一起,CAN_H接CAN_H、CAN_L接CAN_L,CAN总线两端要各接一个120Ω的 端接电阻,用于匹配总线阻抗,吸收信号反射及回拨,提高数据通信的抗干扰能力以及可靠性。
CAN总线传输速度可达1Mbps/S,最新的CAN-FD最高速度可达5Mbps/S。CAN传输速度和总线距离有关,总线距离越短,传输速度越快。
三、CAN协议
通过CAN总线传输数据是需要按照一定协议进行的,CAN协议提供了5种帧格式来传输数据:数据帧、遥控帧、错误帧、过载帧和帧间隔。其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有11位标识符(ID),扩展格式有29个标识符(ID)。这5种帧的用途见下表:
1、数据帧
数据帧由7段组成:
- 帧起始,表示数据帧开始的段。
- 仲裁段,表示该帧优先级的段。
- 控制段,表示数据的字节数及保留位的段。
- 数据段,数据的内容,一帧可发送0~8个字节的数据。
- CRC段,检查帧的传输错误的段。
- ACK段,表示确认正常接收的段。
- 帧结束,表示数据帧结束的段。
数据帧结构如下图所示:
上图给出了数据帧标准格式和扩展格式两种帧结构,图中D表示显性电平0、R表示隐性电平1,D/R表示显性或隐性,也就是 0或1,我们来简单分析一下数据帧的这 7个段。
- 帧起始
帧起始很简单,标准格式和扩展格式都是由一个位的显性电平0来表示帧起始。 - 仲裁段
仲裁段表示帧优先级,仲裁段结构如下图所示:仲裁段结构
标准格式和扩展格式的仲裁段不同,从图 56.1.5可以看出,标准格式的ID 为11位,发送顺序是从ID10到ID0,最高7 位ID10~ID4 不能全为隐性(1),也就是禁止0X1111111XXXXX这样的ID。扩展格式的ID 为29位,基本ID 从ID28到ID18,扩展ID 由ID17 到ID0,基本ID与标准格式一样,禁止最高7位都为隐性。 - 控制段
控制段由6个位构成,表示数据段的字节数,标准格式和扩展格式的控制段略有不同,如图所示:
控制段结构
图中r1 和r0为保留位,保留位必须以显性电平发送。DLC为数据长度,高位在前,DLC段有效值范围为0~8。 - 数据段
数据段也就是帧的有效数据,标准格式和扩展格式相同,可以包含 0~8个字节的数据,从最高位(MSB)开始发送,结构如图所示:
数据段
注意,图中数据段的0~64 为bit,对应到字节就是0~8字节。 - CRC段
CRC段保存CRC校准值,用于检查帧传输错误,标准格式和扩展格式相同,CRC段结构如图所示:
CRC 段结构
从上图可以看出,CRC段由15位的CRC 值与1位的CRC界定符组成。CRC值的计算范围包括:帧起始、仲裁段、控制段、数据段,接收方以同样的算法进行计算,然后用计算得到的CRC值与此CRC段进行比较,如果不一致的话就会报错。 - ACK段
ACK段用来确认接收是否正常,标准格式和扩展格式相同,ACK段结构如图所示:
ACK段结构
从图中可以看出,ACK段由ACK槽(ACK Slot)和ACK界定符两部分组成。发送单元的ACK,发送2个隐性位,而接收到正确消息的单元在ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束,这个过程叫发送ACK/返回ACK。发送 ACK 的是所有接收单元中接收到正常消息的单元,所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息,这些接收单元既不处于总线关闭态也不处于休眠态的所有接收单元中。 - 帧结束
最后就是帧结束段,标准格式和扩展格式相同,帧结束段结构如图所示:
帧结束段结构
从图中可以看出,帧结束段很简单,由7位隐性位构成。
2、遥控帧
接收单元向发送单元请求数据的时候就用遥控帧,遥控帧由 6个段组成:
- 帧起始,表示数据帧开始的段。
- 仲裁段,表示该帧优先级的段。
- 控制段,表示数据的字节数及保留位的段。
- CRC段,检查帧的传输错误的段。
- ACK段,表示确认正常接收的段。
- 帧结束,表示数据帧结束的段。
遥控帧结构如图所示:
从图中可以看出,遥控帧结构基本和数据帧一样,最主要的区别就是遥控帧没有数据段。遥控帧的RTR位为隐性的,数据帧的 RTR位为显性,因此 可以通过RTR位来区分遥控帧和没有数据的数据帧。遥控帧没有数据,因此DLC表示的是所请求的数据帧数据长度,遥控帧的其他段参考数据帧的描述即可。
3、错误帧
当接收或发送消息出错的时候使用错误帧来通知,错误帧由错误标志和错误界定符两部分组成,错误帧结构如图所示:
错误标志有主动错误标志和被动错误标志两种,主动错误标志是 6个显性位,被动错误标志是6个隐性位,错误界定符由 8个隐性位组成。
4、过载帧
接收单元尚未完成接收准备的话就会发送过载帧,过载帧由过载标志和过载界定符构成,过载帧结构如图所示:
过载标志由6个显性位组成,与主动错误标志相同,过载界定符由8个隐性位组成,与错误帧中的错误界定符构成相同。
5、帧间隔
帧间隔用于分隔数据帧和遥控帧,数据帧和遥控帧可以通过插入帧间隔来将本帧与前面的任何帧隔开,过载帧和错误帧前不能插入帧间隔,帧间隔结构如图所示:
图中间隔由3个隐性位构成,总线空闲为隐性电平,长度没有限制,本状态下表示总线空闲,发送单元可以访问总线。延迟发送由8个隐性位构成,处于被动错误状态的单元发送一个消息后的帧间隔中才会有延迟发送。
四、CAN速率
CAN总线以帧的形式发送数据,但是最终到总线上的就是“0”和“1”这样的二进制数据,这里就涉及到了通信速率,也就是每秒钟发送多少位数据,前面说了 CAN2.0最高速度为1Mbps/S。对于CAN总线,一个位分为 4段:
- 同步段(SS)
- 传播时间段(PTS)
- 相位缓冲段1(PBS1)
- 相位缓冲段2(PBS2)
这些段由Tq(Time Quantum)组成,Tq是CAN 总线的最小时间单位。帧由位构成,一个位由4个段构成,每个段又由若干个Tq组成,这个就是位时序。1 位由多少个Tq 构成、每个段又由多少个Tq 构成等,可以任意设定位时序。通过设定位时序,多个单元可同时采样,也可任意设定采样点。各段的作用和 Tq 数如图所示:
1个位的构成如图所示:
上图中的采样点是指读取总线电平,并将读到的电平作为位值的点。位置在 PBS1 结束处。根据这个位时序,我们就可以计算CAN通信的波特率了。前面提到的CAN协议具有仲裁功能,下面我们来看看是如何实现的。
在总线空闲态,最先开始发送消息的单元获得发送权。
当多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。实现过程如图所示:
图中,单元1和单元2同时开始向总线发送数据,开始部分他们的数据格式是一样的,故无法区分优先级,直到T时刻,单元1输出隐性电平,而单元 2输出显性电平,此时单元1仲裁失利, 立刻转入接收状态工作,不再与单元2竞争,而单元 2则顺利获得总线使用权,继续发送自己的数据。这就实现了仲裁,让连续发送显性电平多的单元获得总线使用权。