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是否定响应,是因为基于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试试看
SF的API_DL>CANFD_DLC,试试看
此外还有一类无效诊断帧的情况,我们设置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帧来检测
无效诊断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,大家可自行尝试一下,不在演示