深圳私人做网站/品牌推广经典案例
📙 相关文章
-
🚩从零学习VH650系列文章目录汇总,点击跳转👇
-
🚩本章节内容演示源码下载,点击跳转👇
📘前言
- 采样点是节点判断信号逻辑电平的位置,对CAN/CAN FD总线来说极其重要,尤其是在组网的时候,多个节点要尽量保持同一个采样点。若网络中节点采样点不一致可能会导致同样的采样频率出现采样错误,进而使整个网络出现故障,所以对CAN/CAN FD节点进行采样点的测试显得尤为重要
目录
- 📙 相关文章
- 📘前言
- 测试原理
- 🌎总结
测试原理
本文描述的采样点测试案例中被测节点扮演的是接收节点的角色。以CAN采样点测试为例,VH6501在检测到总线空闲时,发送较高优先级的特定干扰报文,完成一个干扰循环。每次干扰循环发送结束,微调CRC Delimiter位(隐性位)长度,使其逐次缩短,导致后一位ACK Slot(显性位)前移,并将ACK Slot长度增加,保证整帧报文的长度不变。当显性位电平由后往前,移至DUT采样点位置,会被DUT采到并判定CRC Delimiter位为高电平,出现格式错误,DUT随即发送错误帧,并被CANoe采集到
② 采样点设置
比如我演示使用的ECU的需求是这样的; the def_SAMPLE POINT position for nominal bit shall be 80%
- 位时间分布如下图1所示 ,这点需要先了解下位时间的概念链接不然真不好理解采样点的参数
- 所以我设置采样点参数如下图2
③ 测试脚本
这个测试脚本测试的是CAN-FD 仲裁段的采样,如果要对数据段采样测试,请干扰数据段的bit
代码理解:
每次触发干扰就会进入 on sysvar sysvar::CANDisturbanceInterface1::Trigger::State
干扰位缩短到一定程度时,成为错误帧进入 on errorFrame
测试结束
/*@!Encoding:936*/
includes
{}
variables
{CanDisturbanceFrameTrigger frameTrigger;CanDisturbanceFrameSequence frameSequence;CanDisturbanceSequence sequence;CanDisturbanceTriggerRepetitions repetitions;//Number of disturbance repetitions in a cyclelong result;long validityMask;long cycleFlag;message 0x100 triggerMessage = {FDF = 1}; //The triggermessage.(ID is not important.)message 0x0 spTestMsg = {FDF = 1}; //The disturbance frame sequence which CRC DEL need to be shorten.char spTestDone[33] = "SPDone";int init_bit_length ,last_bit_length ;
}on errorFrame
{if(this.msgChannel == @sysvar::CANDisturbanceInterface1::ChannelNo){last_bit_length = frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0];write("Last CRC Delimiter Bit Length = %d",last_bit_length);testSupplyTextEvent(spTestDone);}
}on sysvar sysvar::CANDisturbanceInterface1::Trigger::State
{//6501 is Idle after repetition_times_in_one_cycle finishif(@this == sysvar::CANDisturbanceInterface1::Trigger::State::Idle) // Idle:0 ;Active:1;Triggered:2 {// 如果测试CAN-FD的高速数据段的采样点,请使用 frmSequence.CRC 数据--frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0];++frameSequence.AckSlot.BitSequence[0].segmentLength[0];result = canDisturbanceTriggerEnable(@sysvar::CANDisturbanceInterface1::DeviceNo,frameTrigger, frameSequence, repetitions);if(result == 1){write("Trigger is enabled,frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0] = %d",frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0]);}else{write("Enable trigger error Result = %d", result);} }
}
testcase SamplePointTest_forVH6501()
{frameSequence.SetMessage(@sysvar::CANDisturbanceInterface1::DeviceNo,spTestMsg);validityMask = 0; //trigger on any CAN messagesframeTrigger.SetMessage(triggerMessage,@sysvar::CANDisturbanceInterface1::DeviceNo, validityMask);frameTrigger.TriggerFieldType = @sysvar::CanDisturbance::Enums::FieldType::EndOfFrame;frameTrigger.TriggerFieldOffset = 9; //Trigger position is the third bit of IFS.init_bit_length = frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0] ;write("Init CRC Delimiter Bit Length = %d",init_bit_length);repetitions.Cycles = 1;repetitions.HoldOffCycles = 0;repetitions.HoldOffRepetitions = 0;repetitions.Repetitions = 1;result = canDisturbanceTriggerEnable(@sysvar::CANDisturbanceInterface1::DeviceNo,frameTrigger,frameSequence,repetitions);if(result == 1){write("Trigger is enabled.");}else{write("Enable trigger error Result = %d", result);}result = testWaitForTextEvent(spTestDone, 10000);if(result == 1){write("sample point lies in %f", (double)last_bit_length / init_bit_length*100);}
}
④ 测试结果如下:
End |
🌎总结
🍅 有需要这个系列演示文章所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩 有微信的小伙伴可以关注下浪哥车载诊断,一个行业内小小圈子,群里有
网盘资料
,源码
,还有各路大神
闲时交流交流技术,聊聊工作机会啥的。
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。