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

CAN_FD无效诊断帧举例_传输网络层判断

1:什么是无效帧-对传输网络层而言

对网络层而言,无效诊断帧,网络层直接判断无效的帧,该怎么理解?我们通常使用工具诊断时,一般不会触发NM无效帧。因为工具本身已经在数据链路层+NM层已经正确的处理了!

2:要知道诊断无效帧,和正响应抑制的关系

NRC或正响应,都是需要应用层处理才能产生的,如果我们诊断测试时,发送一帧请求,发现无诊断响应,很有可能就是传输网络层直接判定为无效帧了

抑制肯定响应和功能寻址中的一些特殊情况,仅仅规定了正响应不回复,而错误状态会回否定响应的。和无效诊断帧本质上还是不一致的。

数据流动方向如下,也就是说数据流过传输网络层时,需要经过有效性判定,判定有效才会传递数据到上下层中 

3:基于传输网络层判断的_诊断无效帧

传输网络层,基于以下两个数据段来判断

**1)  N_AI

**2) N_PCI

3.1基于N_AI来判断

3.1.1 ID无效 

大家都懂,不过多解释,

3.1.2 帧类型无效

这个大家也都懂,具体看诊断网络支持那一类帧报文类型,是否兼容等配置信息(如不兼容can经典诊断帧等)

4:基于错误的N_PCI来判断

4.1 指示帧类型错误

也就是报文N_API中指示帧类型(SF,FC,FF,CF)  ,固定在CAN_FD诊断帧,数据段Byte0的高4bit

4.2 未定义值——传输网络层判定无效

如下图

这种错误也是最简单的,即4-F,都是未定义的值。故网络层认为是无效帧,不向应用层传递

4.3 时序错误——传输网络层判定无效

除了值是被定义之外,NM对帧发送的时序也有要求。

**1)对sender在发送FF之前,接收到流控帧,可以看到应答

**2)对Receiver而言,发送流控帧之前,接收到续帧

*3)对Receiver,续帧编号错误

5: API信息中的长度指示符,与CANfd帧的DLC,不匹配问题

这个是最复杂的

我们最好有条件的同学,用CANoe的IG界面来模拟诊断帧的发送

**1)当CAN_FD帧长度设定为<=8,一般项目规定,固定为8,我们也按照这个思路来测试

SF单帧中的API_DL=0,时NM层认为无效诊断帧,

*)如下图,将SF的API_DL设置为0,发送

发现无响应帧,证明该帧被Receive的网络层认为是无效

*)将SF的API_DL设置为8,即大于CAN_FD帧的总长度

无响应

为了更明白我给大家演示下,SF的API_DL与CAN_FD帧的DLC匹配的情况

将API_DL设置为1-7

回了个13说明应用层处理了这个诊断帧

看个正响应

所以大家明白了吗?我们具体读哪一个DID,先传输网络层判定有效,然后应用层再根据IS014429中的定义,如本例中,当SF的API_DL=3时,就会给一个正响应

SF的API_DL=4
SF的API_DL=5

SF的API_DL=4是否定响应,是因为基于ISO14229的应用层,认为DID一定是需要是两个字节。

SF的API_DL=5也是肯定响应,因为应用层采取了可以同时读多个DID,其中只要有一个DID有效,且满足读取条件时就会正响应。且这个DID位置不做限制

 当CANFD_DLC>8时,我们设定为9,也就数数据段长度=12

如下图,,注意此时帧类型依然是SF,API_DL位置发生改变

SF的API_DL移位到Byte2中去了,byte1全部置位0

先看无效的 SF的API_DL =0试试看

API_DL =0标题

SF的API_DL>CANFD_DLC,试试看

SF的API_DL=9

此外还有一类无效诊断帧的情况,我们设置SF的API_DL=1-7试试看

都是无效诊断帧,这里就涉及到一个SF的API_DL与CANFD_DLC自适应的关系了,简单来说

当CANFD_DLC>8时,SF的API_DL不能<7。这么理解当你选择CANFD_DLC=9时,我们诊断数据肯定是CANFD_DLC=8时放不下的,理论上来说API_DL>7,才需要将CANFD_DLC设置为9。

上面无效诊断帧的例子,就是在浪费带宽。

总结:CANFD_DLC=9时,7<SF的API_DL<10,才能被传输网络层判定为有效帧

实际操作一下

 

大家可以试试 CANFD_DLC=10/11/12.。。15等各种情况试一下

6 CANFD的FF帧

第一种 N_API_FF_DL<4095

我们CANFD—DL依然设置为8,先看有效数据.

我先告诉大家有效数据范围   7<N_API_FF_DL<0xFF,N_API_FF_DL是否有效,我们可以根据Receiver是否发送FC帧来检测

标N_API_FF_DL=8

N_API_FF_DL=FF

 无效诊断FF帧的N_API_FF_DL,我们先试试00

情况和我们设想的有点不一样,居然回了条流控帧,这其实也不复杂看下图

 FF_DL占用四个字节最大可以表示为4,294,967,295,

检测FF_DL顺序如下

先检查Byte1的低4bit,然后检查Bye2,代码实现就是

usigned int FF_DL=Byte1&0x0F+Byte2

if(FF_DL==0)  //

{

FF_DL=Byte3+Byte4+Byte5+Byte6;

}

所以第一种 N_API_FF_DL<4095 的格式下,将N_API_FF_DL设置为全0,不是错误格式

我们来试一下:

N_API_FF_DL<4095 的格式下的错误N_API_FF_DL数值:当N_API_FF_DL<=CANFD_DLC时。说人话就是将“N_API_FF_DL”设置的比单帧报文的长度还短,明明1帧就能放下,你非要搞个多帧形式,传输网络层直接报错!!

试一试,先如下图设置

结果,没回流控帧

可以看到

思考:如果将CANFD_DL设置为64个Byte,那N_API_FF_DL<4095 的格式下的错误N_API_FF_DL数值,又是怎么样的取值范围

回答:0<N_API_FF_DL<=64

第二种 N_API_FF_DL>4095

格式如下

用计算器算一下,4个字节能显示多大的长度

确实很大,故正确的写法应该是4095<N_API_FF_DL<=4294967295时,是其正确的取值范围

错误的取值范围为:0<=N_API_FF_DL<=4095,大家可自行尝试一下,不在演示


http://www.kler.cn/news/357249.html

相关文章:

  • Python日志模块(logging)教程 - 从初学者到生产环境
  • UE5学习笔记25-游戏中时间同步
  • TiDB替换Starrocks:业务综合宽表迁移的性能评估与降本增效决策
  • Java线程池知识点梳理
  • 仓储数字化蓝图
  • 餐饮店怎么标注地图位置信息?
  • 【日志】关于多益网申
  • ISO 21434标准下汽车软件开发的网络安全核心要求
  • C++list的模拟实现
  • Python | Leetcode Python题解之第492题构造矩形
  • linux--库指令
  • 深度学习代码学习1
  • 【软件测试】理论杂记 + Selenium
  • Linux——Harbor: 容器镜像的存储
  • Linux Docker配置镜像加速
  • 【Unity(2)】unity开发的基本框架和经典的 MVC 架构模式
  • 深⼊理解指针(2)
  • Android Framework AMS(07)service组件分析-1(APP到AMS流程解读)
  • C++深入探寻二叉搜索树:数据管理的智慧之选
  • uniapp,获取头部高度