当前位置: 首页 > article >正文

深度解析CAN-FD与CAN协议的差别

随着工业的发展,工业总线上的数据量越来越多,这使得CAN总线的逐渐达到负荷极限,这就需要改进原有的总线来提高总线传输速率,CAN-FD便在这样的背景下诞生了。


随着当今工业的发展,尤其是在CAN总线运用较多的汽车领域,总线通讯的数据量越来越大,例如电动汽车上,汽车内部出现更多的辅助系统和人机交互系统,这就使得传统的CAN总线在传输速率和带宽方面越来越力不从心。因此CAN-FD孕育而生。

9917c587526a7e71646299662a16c618.jpeg

图1

根据CAN规范ISO11898-2所定义的标准帧结构,一帧报文最大只能传输64位(8个字节)的数据,在最好的情况下总线负载达到70%左右,不过如果报文数据少于8个字节的情况下总线负载可能会更小。我们或者会提出疑问,为什么不可以把CAN标准的通信波特率改高一点呢?其实是有一个很重要的因素,CAN采用仲裁机制来判定不同节点CAN报文传输的优先级,在仲裁期同一总线上的所有节点必须在一个位的时间内到达。另一方面电信号有一个有限的传播速度。从大量经验中得出CAN总线以1Mbit/s运行的最长距离为40米。通信波特率越高,通信距离则越短。


CAN-FD与CAN主要区别

CAN-FD和CAN主要的区别有两点:

1. 可变速率

CAN-FD采用了两种位速率:从控制场中的BRS位到ACK场之前(含CRC分界符)为可变速率,其余部分为原CAN总线用的速率。两种速率各有一套位时间定义寄存器,它们除了采用不同的位时间单位TQ外,位时间各段的分配比例也可不同。

2. 新的数据场长度

CAN-FD对数据场的长度作了很大的扩充,DLC最大支持64个字节,在DLC小于等于8时与原CAN总线是一样的,大于8时有一个非线性的增长,所以最大的数据场长度可达64字节。

6db95574cdcf760e7baac43fa840adce.jpeg

图2


CAN-FD简介

1. CAN-FD 数据帧帧格式

CAN-FD 数据帧在控制场新添加EDL位、BRS位、ESI位,采用了新的DLC编码方式、新的CRC算法(CRC场扩展到21位)。CAN-FD数据帧格式如图 3所示。

7b4c3671f19b07d55629663656ee1bcc.jpeg

图3

2. 新添加位介绍

2.1 EDL位(Extended Data Length),原CAN数据帧中的保留位r, 该位功能为:

  • 隐性: 表示CAN-FD 报文 (采用新的DLC编码和CRC算法);
  • 显性: 表示CAN报文。

2.2 BRS位( Bit Rate Switch),该位功能为:

  • 隐性:表示转换可变速率;

  • 显性:表示不转换速率。

2.3 ESI(Error State Indicator),该位的功能为:

  • 隐性:表示发送节点处于被动错误状态(Error Passive);

  • 显性:表示发送节点处于主动错误状态(Error Active)。

EDL位可以表示CAN报文还是CAN-FD报文;BRS表示位速率转换,该位为隐性位时,从BRS位到CRC界定符使用转换速率传输,其他位场使用标准位速率,该位为显性时,以正常的CAN-FD总线速率传输;通过添加ESI位,可以很方便的知道当前发送节点所处的状态。

03017a399ddb1aa46b72b05e91952f18.jpeg

图4

3. 新的CRC算法

CAN总线由于位填充规则对CRC的干扰,造成错帧漏检率未达到设计意图。CAN-FD对CRC算法作了改变,即CRC以含填充位的位流进行计算。在校验和部分为避免再有连续位超过6个,就确定在第一位以及以后每4位添加一个填充位加以分割,这个填充位的值是上一位的反码,作为格式检查,如果填充位不是上一位的反码,就作出错处理。CAN-FD的CRC场扩展到了21位。由于数据场长度有很大变化区间,所以要根据DLC大小应用不同的CRC生成多项式,CRC_17,适合于帧长小于210位的帧,CRC_21,适适合于帧长小于1023位的帧。

4. 新的DLC编码

CAN-FD 数据帧采用了新的新的DLC编码方式,在数据场长度在0-8个字节时,采用线性规则,数据场长度为12-64个字节时,使用非线性编码。如图 5所示。

d81ad934a54f147a8d174b7617bad888.jpeg

图5


http://www.kler.cn/a/374251.html

相关文章:

  • 盘点Windows10系统之下好用的录屏工具!
  • ASPICE 4.0引领自动驾驶未来:机器学习模型的特点与实践
  • window11使用wsl2安装Ubuntu22.04
  • Swarm-LIO: Decentralized Swarm LiDAR-inertial Odometry论文翻译
  • C++第4课——swap、switch-case-for循环(含视频讲解)
  • 模块化沙箱是什么?如何运用到源代码保密中?
  • Python学习之基本语法
  • mysql 单汉字获取大写首拼(自定义函数)
  • Java Executor ScheduledThreadPoolExecutor 源码
  • vue canvas 把两个一样大小的base64 4图片合并成一张上下或者左右图片
  • 15分钟学 Go 第 31 天:单元测试
  • ARB链挖矿DApp系统开发模式定制
  • Jetson Orin NX平台自研载板 IMX477相机掉线问题调试记录
  • 【bug解决】 ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8‘ not found
  • 利用AWS服务轻松迁移数据上云
  • 4.5KB原生html+js+css实现图片打印位置的坐标和尺寸获取
  • JAVA学习日记(八)
  • Java - SpringBoot之logback设置日期分割并设置指定时间自动清除,Linux启动运行
  • HO-XGBoost河马算法优化极限梯度提升树多变量回归预测(Matlab)
  • 如何在当前时刻采样上一拍的值?always_ff always
  • 使用GitLab CI/CD流水线自动化软件交付
  • 讲讲 kafka 维护消费状态跟踪的方法?
  • 线程的状态及其查看
  • ElementUI el-table 多选以及点击某一行的任意位置就勾选上
  • 【零售和消费品&厨房】厨房食材检测图像分割系统源码&数据集全套:改进yolo11-goldyolo
  • Django创建项目模块+创建映射类+视图