学习笔记系列之CAN FD总线。
之前一篇笔记记录了CAN总线基础:https://blog.shuspieler.com/3649/ , 在这继续记录CAN FD的知识。
如果用一句话总结CAN FD和CAN的区别的话,就是为了加大数据吞吐率,在Payload使用了不同的传输频率,头部尾部保持不变,从而在相同的时间长度,传输了更多的数据,就像下图所示。
CAN FD协议需要新的控制器,而新的控制器是兼容老的CAN协议的,也就是说CAN FD控制器可以向下兼容与CAN控制器通信。有时候车身CAN控制器可以混杂部署,比如通过将一部分CAN控制器设置成休眠模式,就可以在CAN FD控制器之间进行高速传输,比如刷新ECU的时候。通常通过CAN需要传输几小时,通过CAN FD就可以大大减少这个时间。
下边是CAN FD和CAN 帧的对比图:
首先是CAN FD没有remote frame这个帧了。也不难想到,首先是这个用的确实不多,其次remote frame没有Data Field,而CAN FD 和CAN区别就在这里,所以remote frame就失去了其意义。在数据帧中,RTR也被换成RRS(Remote Request Substitution),并且保持显性电位。在帧头的SOF,IDE,以及帧尾的ACK,DEL,EOF以及ITM(Intermission Field)都与CAN总线一致。
CAN FD和CAN的帧主要区别位于IDE和ACK之间。如下图所示,两者的区分是那个r保留位,当r是显性电平逻辑0时候,代表这是一个传统的CAN帧,当r是隐性电平逻辑1时候,说明这是一个CAN FD帧,同时这个保留位r有了一个名字FDF: Flexible Data Rate Format。
CAN FD控制器可以发送和接收传统CAN帧以及CAN FD帧,传统CAN控制器在接收CAN FD帧由于显性电平r是不符合规则从而会报错,然后将通过错误帧应答,也就是说,传统CAN并不能解析CAN FD数据,按照错误帧处理。
CAN FD中有一个新的帧叫做BRS(Bit Rate Switch),当这一位是显性时,中间部分数据传输速率baud rate 2 和帧头帧尾传输速率baud rate 1 是相同的,这种情况下CAN FD并不能起到加速速率传输的效果。当这一位是隐性时候,中间部分数据传输速率变为 5Mbit/s,这是一个在实验室大量验证证实在绝大多数车身网络这是比较可靠的值。BRS的值决定了中间部分从BRS起到ACK之前的速率。
ESI全称Error State Indicator,这一位是显性代表这个节点是Error Active状态,如果这一位是隐性,代表这个节点是Error Passive状态,主要是为了调试用。
DLC(Date Length Code)和传统CAN很像,但是扩充了最大可传送的Payload数据长度:
DLC | Data Field Bytes CAN | Data Field Bytes CAN FD |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3 | 3 |
4 | 4 | 4 |
5 | 5 | 5 |
6 | 6 | 6 |
7 | 7 | 7 |
8 | 8 | 8 |
9 | 8 | 12 |
10 | 8 | 16 |
11 | 8 | 20 |
12 | 8 | 24 |
13 | 8 | 32 |
14 | 8 | 48 |
15 | 8 | 64 |
CRC部分的话,与传统CAN原理也是一样的,只是由于速率变高以及数据长度加大,需要的校验位的位数也增多了。当Data Field是0到16 bytes,CRC校验位是17位,当Data Field是17到64bytes时,CRC校验位是21位。
在插入帧的计算上(Bit stuffing),CAN FD和CAN有一些不同。传统CAN的CRC是从SOF算到CRC结束,而插入的插入帧,并不计算在内。而对于CAN FD,CRC计算范围是从SOF到Data Field,并且插入帧(Bit stuffing)也计算在内。同时CAN FD会记录一个模7余数的计数器在CAN FD帧中,之后再跟一个奇偶校验位。
再CRC这一块,插入帧的计算和之前有所不同,包括Stuff Count在内,每四个Bit前都要插入一个插入帧,这个帧的电平与前一位相反。从CRC之后,就没有插入帧了。
至此CAN FD相关的知识就记录差不多了。
Reference: