经典CAN总线(CAN 2.0A/B)在汽车、轨道交通、自动化、医疗等行业有广泛的应用。但是随着时间的推移,人们发现它(尤其在汽车领域)存在两方面的问题:
①总线的负载率越来越高。总线负载率是总线实际发送数据与总线容量的比值。比如假设CAN总线的波特率为500k bps,也就意味着当前总线每秒钟最多传输500,000个位数据,这称为总线容量。如果实际上每秒传输了475,000个位,则总线负载率达到95%。如果达到了较高的负载率,则只能通过提高总线波特率的方式使其降低。但经典CAN总线的最高波特率为1M bps。
②数据载荷较低。数据载荷是指实际要传输的原始数据。在网络传输中,为了保证数据传输的完整性和准确性,往往要在原始数据之外加上校验、地址等信息,好像给原始数据增加了一层或多层“外套”。经典CAN总线的每个数据帧最多可传输8字节数据,其它的仲裁域、控制域及校验域等占用不少数据位。与其它协议(比如UDP协议)相比,每帧的数据载荷较低。
基于以上问题,博世公司于2012年推出了CAN FD协议,并在2015年正式成为国际标准ISO 11898-1。今天这篇文章,我们就来介绍下CAN FD协议。
我们知道“CAN”是“Controller Area Network”的缩写,即“控制器局域网络”。而CAN FD是“CAN with Flexible Data-Rate”的缩写,即“具有可变数据速率的CAN”。CAN FD协议具有如下一些特点:
①“数据速率可变”是指CAN FD的数据帧中,其数据相(包括控制域的一部分、数据域和校验域,后文详述)的传输速率可以不同于仲裁相。在经典CAN的数据帧中,各部分(比如仲裁域、控制域、数据域、校验域等)都采用相同的传输速率。而CAN FD中,可以采用两种不同的传输速率,并且传输速率比经典CAN有很大的提高,数据相部分最大支持5Mbps的波特率。
②与经典CAN类似,CAN FD也包括数据帧、错误帧和过载帧,但取消了远程帧。数据载荷提高,每个数据帧最多可发送64字节的原始数据。
③物理层与经典CAN相同,但是数据链路层(数据帧的定义,校验的计算方法)不同。因此经典CAN节点不能接收CAN FD报文,但CAN FD节点可以接收和发送经典CAN报文。
下面我们来详细介绍下CAN FD的数据帧。
1、帧起始:与经典CAN类似,CAN FD数据帧的第1位也是“SOF(Start Of Frame,帧起始)”,显性电平(逻辑0)。
2、仲裁域:与经典CAN类似,不过将“RTR”位替换为“RRS”位。RRS是英文“Remote Request Substitution(远程请求替换)”的缩写,该位替代了远程帧请求位,并且在CAN FD中永远保持显性(逻辑0)。这就意味着CAN FD中没有远程帧,如下图所示:
3、控制域:保留了经典CAN的IDE/r1、r0和DLC,增加了FDF、BRS和ESI三个位,如下图中的绿色部分:
其中:
①IDE(Identifier Extension):扩展帧标识。当该位为隐性(逻辑1)时表示扩展帧,显性(逻辑0)表示标准帧。
②FDF(FD Format Indicator):FD帧标识。当该位为隐性(逻辑1)时表示CAN FD帧,显性(逻辑0)表示经典CAN帧。
③res:保留位。
④BRS(Bit Rate Switch):位速率切换位。当该位为隐性(逻辑1)时仲裁相和数据相使用不同的传输速率。
⑤ESI(Error State Indicator):错误状态标识。当该位为隐性(逻辑1)时表示发生错误。
⑥DLC(Data Length Code):数据长度编码,共有4位,用来表示数据的实际长度(字节)。DLC0是DLC的第0位,DLC3是其第3位。四位二进制数最大可以表示的数值为15。因此,对于经典CAN数据长度最大8字节来说,数据长度编码可以顺序编号,如下面的表格所示:
DLC3 | DLC2 | DLC1 | DLC0 | 数据长度(字节数) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 1 | 1 |
0 | 0 | 1 | 0 | 2 |
0 | 0 | 1 | 1 | 3 |
0 | 1 | 0 | 0 | 4 |
0 | 1 | 0 | 1 | 5 |
0 | 1 | 1 | 0 | 6 |
0 | 1 | 1 | 1 | 7 |
1 | 0 | 0 | 0 | 8 |
但是CAN FD希望能最大传输64字节的数据,这样数据编码就不能采用顺序增长的方式,必须进行定义。为了与经典CAN兼容,8字节以前的数据是相同,以后的编码采用下面的定义:
DLC3 | DLC2 | DLC1 | DLC0 | 数据长度(字节数) |
---|---|---|---|---|
1 | 0 | 0 | 0 | 8 |
1 | 0 | 0 | 1 | 12 |
1 | 0 | 1 | 0 | 16 |
1 | 0 | 1 | 1 | 20 |
1 | 1 | 0 | 0 | 24 |
1 | 1 | 0 | 1 | 32 |
1 | 1 | 1 | 0 | 48 |
1 | 1 | 1 | 1 | 64 |
经典CAN和CAN FD数据域如下图中蓝色部分:
4、数据域:上图中的蓝色部分。
5、校验域:经典CAN和CAN FD都采用循环冗余校验(CRC),不同的是前者采用15位CRC校验,而后者采用17位或21位CRC校验。具体来说当数据长度小于等于16字节时,采用17位CRC校验。当数据长度大于16字节时,采用21位CRC校验。
CAN FD的校验域包括:填充计数、CRC校验值和CRC限定符。
①填充计数(Stuff Count):由4个位组成,其中前3个位是帧中动态填充的位的数量对8取模的值(除以8的余数)再转换成格雷码,最后一个是前三位的校验(偶校验)。
②校验值:17位或21位CRC校验值。
③CRC限定符:1位(最多2位)隐性电平(逻辑1)。当CRC值发送完成后会接着发送一位CRC限定符,节点收到该值后会从数据相的速率切换到仲裁相的速率。
下图中的蓝色部分是校验域:
6、确认域:1个隐性位(逻辑1)。CAN FD多可识别两个位时间的确认信号,见下图中黄色部分。
7、帧结束:7个隐性信号(逻辑1),表示帧的结束,见下图中红色部分。
在CAN FD数据帧中,可以有两种不同的传输速率,我们把使用基本传输速率的部分称为“仲裁相(Arbitration Phase)”,可切换成更高传输速率的部分称为“数据相(Data Phase)”。
CAN FD标准帧仲裁相和数据相区别如下图所示:
CAN FD扩展帧仲裁相和数据相区别如下图所示:
需要说明的是:虽然数据相可以使用更高的传输速率,但不是必须的。也就是说,仲裁相和数据相也可以采用相同的传输速率。
好了,关于CAN FD协议就先介绍到这里。
下面是【CAN通信技术】的文章归档链接:
我的书《西门子S7-1200/1500 PLC SCL语言编程 ——从入门到精通》从硬件到软件,比较详细的介绍了SCL语言的编程,感兴趣的话可以扫描下面的二维码查看:
发表评论