📙 相关文章
- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
- 🍅 从零学习VH650系列文章目录汇总,点击跳转👇
- 🍅 本章节内容演示源码下载,点击跳转👇
📘前言
- 🍅 针对
VH6501
的操作,CAPL
封装了如下几个类,下面我们就看下Sequences
类- 🍅演示软硬件环境
Win10 x64
;CANoe 11 SP2 x64
;VH6501 CAN Disturbance Interface
目录
📙 直接输出一个自定义的电平序列
1️⃣ CanDisturbanceSequence : 用户可以自定义的序列,可以直接发送到总线上
2️⃣ 下面的这个脚本就是直接在总线上发送一个显性电平序列
- 下面的脚本是对总线干扰的代码行数最少的方式了。
testcase TC_01()
{
CanDisturbanceSequence sequence; //Object of sequence
dword deviceID; //Device Id of disturbance interface
char buffer[1024]; //text buffer for ToString method
int result;
char temp[100];
deviceID = 1;
sequence.Clear();
//configure a sequence 320 FPGA ticks long and send a recessive bit at the Ack slot bit on the bus. A FPGA tick is 6.25 ns long, which leads to a bit time of 2 µs
result = sequence.AppendToSequence(320, 'd');
//Configure the frame trigger and the sequence to the CAN Disturbance Device
//Send the sequence immediately on the bus
result = canDisturbanceTriggerNow(deviceID, sequence);
snprintf(temp, elcount(temp), "时间戳:%f ;结果:%d ", timeNow()/100000.0,result);//方便队医trace和报告的时间戳
testCaseComment(temp);
}
3️⃣ 运行结果,可以看到trace
上一条 stuff error
的报文报错
4️⃣ 主要方法 AppendToSequence ()注解:
CanDisturbanceSequence
总共有三个方法;其它两个好理解,下面主要说AppendToSequence
(添加要输出的序列)
下面的内容很对AppendToSequence 做详细解释。。。
下面的内容很重要。。。
下面的内容很重要。。。
下面的内容很重要。。。
AppendToSequence
方法有以下两个参数:
-
segmentLength
:干扰总线的时间,多少个 FPGA ticks,这一点我们要知道,VH6501的FPGA晶振是160M的,所以一个 FPGA ticks 周期 T0 = 1/160M = 6.25 ns(纳秒)
代码中的sequence.AppendToSequence(320, 'd'); 320
什么意思呢?因为我们CAN总线是500kb/s速率,所以周期位T1 = 1/500K = 2000 ns (纳秒) ; 而320 * 6.25 =2000 ,也就是说需要320个 FPGA ticks才能刚好干扰一个CAN bit 位。 -
segmentValue
:d
: 显性干扰 ,r
是 隐性干扰
那又为什么?脚本中输出了这个序列 sequence.AppendToSequence(320, 'd');
,就导致了stuff error
(格式错误
)了呢
总线空闲状态都是隐形电平
,当收到一个显性电平(VH6501此处干扰导致
),那么总线认为这个一个报文的起始帧,但是后面并没有真的报文的结构,所以总线报错,格式错误。(看下图的帧格式说明)
如果上面脚本设置了sequence.AppendToSequence(320, 'r');
和设置了sequence.AppendToSequence(320, 'R');
都不能导致总线错误的,不信的小伙伴可以尝试下。
📙输出一个定义的报文到总线上
CanDisturbanceFrameSequence
类: 当满足触发条件后,将向总线上发送一帧定义的报文
1️⃣ 下面的这个脚本就是直接在总线上发送一个报文ID为0x100的报文
testcase TC_02()
{
canDisturbanceFrameSequence frameSequence;
message 0x100 msgFrameSeq;
dword deviceID; //Device Id of disturbance interface
long result;
char temp[100];
deviceID = 1;
//set message to sequence
msgFrameSeq.dlc = 4;
frameSequence.SetMessage(deviceID, msgFrameSeq);
result = canDisturbanceTriggerNow(deviceID, frameSequence); //output the sequence once
snprintf(temp, elcount(temp), "时间戳:%f ;结果:%d ", timeNow()/100000.0,result);
testCaseComment(temp);
}
2️⃣ 运行结果,可以看到trace
上一条ID为0x100,DLC=4的报文。
3️⃣ 类方法 SetMessage ()注解:
设置当触发条件满足后,向总线上输出的报文。
这个方法还有一个重载的方法,form2 这个方法呢,还可以定义要触发报文的 仲裁段和数据段的bit 长度;比如我这里用的CAN速率是500kb/s ,也就是320个 FPGA ticks ; 如果我们使用form2 ,可以让这个触发报文的速率和我们的总线不同,当然这会导致总线错误
📙 Class: CanDisturbanceFrameSequenceField 和CanDisturbanceBitSequence
这两个类呢,是可以设置和访问到具体的CAN/CAN-FD 帧结构的具体每个bit的,因为用的少,下面通过一个case简单介绍下(暂时空缺,有好的case再填充)
End |
🌎总结
🍅 有需要这个系列演示文章所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩 有微信的小伙伴可以关注下浪哥车载诊断,一个行业内小小圈子,群里有
网盘资料
,源码
,还有各路大神
闲时交流交流技术,聊聊工作机会啥的。
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。