从零学习VH6501 —— 采样点测试
Posted 蚂蚁小兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零学习VH6501 —— 采样点测试相关的知识,希望对你有一定的参考价值。
相关文章
系列用的CANoe演示工程我放在了Git上,不定时根据博客更新。
前言
-
测试软硬件环境:
VH6501 CAN Disturbance Interface
CANoe 11 SP2
Win10 X64 -
采样点是节点判断信号逻辑电平的位置,对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 cycle
long 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 finish
if(@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 messages
frameTrigger.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);
④ 测试结果如下:
总结
本章博客,讲解了采样点的理解 以及使用VH6501进行 采样点测试
更全面的VH6501学习请参考帮助文档和官方示例C:\\Users\\Public\\Documents\\Vector\\CANoe\\Sample Configurations 11.0.55\\CAN\\MoreExamples\\CANDisturbanceInterface
- 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。
以上是关于从零学习VH6501 —— 采样点测试的主要内容,如果未能解决你的问题,请参考以下文章
从零学习VH6501 —— Repetitions 干扰触发的次数配置