CANoeCAN采样点测试方法及误差分析

原创 汽车ECU开发 2024-11-11 08:42

在车载控制器中,CAN采样点的测试是控制器的基本测试之一,那CAN总线的采样点一般怎么测试呢?今天一起来捋一捋。

首先CAN报文的位将分割为同步段(Sync Segment)、时间片段 1(TSEG1 Segment)和时间片段 2(TSEG2 Segment)。这些片段由不同数量的 TQ 组成, TQ 为该总线电平中最小的时间单位。预分频(Prescaler)值以及收发器使用的时钟频率直接影响了一个位长度的总 TQ 数量。采样点位置将由各个片段中 TQ 的数量计算得到。

1 个位中包含 8 或 16 个 TQ 的分段示意图

采样点的理论计算值可由下式得到:

𝑆𝑃 = (𝑆𝑦𝑛𝑐 + 𝑇𝑆𝐸𝐺1)/(𝑆𝑦𝑛𝑐 + 𝑇𝑆𝐸𝐺1 + 𝑇𝑆𝐸𝐺2)

在此必须知道所使用的 CAN 时钟频率,以此来计算一个标称位时间所使用的总 TQ 数量。

例如:若一个 TQ 的长度为 0.0625us,时钟频率是 16MHz(通常 CAN 所使用的时钟频率),预分频数为1。这就导致在 500kBaud 下一个位含有 32 个 TQ。若预分频数为 2,则一个位包含 16 个 TQ。

同步段(Sync Segment)在任何情况下均仅为 1 个 TQ 长度,剩余的 TQ 将会被分为 TSEG1 和 TSEG2。

例如:若一个位的总 TQ 数为 16,采样点位置为 75%,则 TSEG1 的 TQ 数为 11, TSEG2 的 TQ 数为 4。

CAN采样点测试的原理是节点判断信号逻辑电平的位置,对 CAN总线来说极其重要,尤其是在一个CAN网络里,多个节点要保持同一个采样点。如果其中一个偏差较大,有可能使整个网络出现故障,所以对 CAN节点进行采样点的测试显得尤为重要,采样点测试目的用于检查控制器的采样点设置是否遵守规范要求。

采样点的位置不受控制器所处的收发状态影响,故针对采样点测试既可以干扰控制器发送的指定报文的某个位,也可以通过测试工具发送特定干扰报文去检测控制器的行为。

下面以CANoe发送特定干扰报文的方法为例。VH6501 在检测到总线空闲时,发送较高优先级的特定干扰报文,完成一个干扰循环。每次干扰循环发送结束,微调 CRC Delimiter 位长度,使其逐次缩短,导致后一位 ACK Slot前移,并将 ACK Slot 长度增加,保证整帧报文的长度不变。当显性位电平由后往前,移至 DUT 采样点位置,会被 DUT 采到并判定 CRC Delimiter 位为高电平,出现格式错误,DUT 随即发送错误帧,并被 CANoe 采集到。另外每次干扰循环结束, VH6501 将发送 30 次控制器正常接收的任意一帧正常报文,从而使 DUT 始终保持 Error Active 状态,因其主动错误帧容易辨认。

那CANoe工程如何配置呢?首先打开软件后,选择CANoe的示例工程Disturbance SamplePoint Test (CAN)。进入工程后,将 VH6501 通道分配给软件通道 CAN1,在下图所示界面设置 Mode 为 CAN,并勾选 Activate 选项使能 VH6501 总线干扰功能。

VH6501 的采样点设置尽量靠前,确保优先干扰到控制器的采样点,此处BTL Cycles(指的是TQ数量,将一个位分为16个TQ) 和SJW(同步跳变宽度) 要选择数值较大的组合,可参考下图配置。

配置完成之后,就可以写capl测试脚本了。

/*@!Encoding:936*/includes{ 
}variables{ CanDisturbanceFrameTrigger frameTrigger; CanDisturbanceFrameSequence frameSequence; CanDisturbanceSequence sequence; CanDisturbanceTriggerRepetitions repetitions; const int repetition_times_in_one_cycle = 10; //Number of disturbance repetitions in a cycle long result; long errfrmcount; //The error frame count in one cycle long first_err_bit_length,first_error_occur, ten_error_occur; long validityMask; long cycleFlag; message 0x100 triggerMessage; //The trigger message.(ID is not important.) message 0x0 spTestMsg; //The disturbance frame sequence which CRC DEL need to be shorten. message 0x1 Keep_DUT_ErrorActive; const long CountMsgKeepErrorActive = 30; long MsgCntKeepErrorActive = 0; char spTestDone[33] = "SPDone";}on errorFrame{ if(this.msgChannel == @sysvar::CANDisturbanceInterface1::ChannelNo) { errfrmcount++; if((errfrmcount == 1) && (first_error_occur == 0)) {      first_err_bit_length = frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0]; first_error_occur = 1; write("+++++++++First error frame occurs+++++++++++."); } if(errfrmcount == repetition_times_in_one_cycle) { ten_error_occur = 1; testSupplyTextEvent(spTestDone); } }}
on message 0x1{ if(MsgCntKeepErrorActive <= CountMsgKeepErrorActive) { ++MsgCntKeepErrorActive; output(Keep_DUT_ErrorActive); } else { ActivateTriggerAgain(); }}
void ActivateTriggerAgain(){ if(ten_error_occur == 0) { errfrmcount = 0; //CRC Delimiter is shorten with 6.25ns per cycle.    --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); } }}
on sysvar sysvar::CANDisturbanceInterface1::Trigger::State{ //6501 is Idle after repetition_times_in_one_cycle finish if(@sysvar::CANDisturbanceInterface1::Trigger::State == 0) {    //At the end of each disturbance cycle, the VH6501 need to outputsome normal message to prevent the DUT from being in a passive error state    //because the passive error frame is not easily to be observed and //identified. MsgCntKeepErrorActive = 0; output(Keep_DUT_ErrorActive); }}
testcase SamplePointTest_forVH6501(){ first_error_occur = 0; ten_error_occur = 0; errfrmcount = 0; cycleFlag = 1;  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 thirdbit of IFS. write("CRC Delimiter Bit Length = %d",  frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0]); repetitions.Cycles = 1; repetitions.HoldOffCycles = 0; repetitions.HoldOffRepetitions = 0; repetitions.Repetitions = repetition_times_in_one_cycle;  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("frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0] = %d , sample point lies in %f%%~%f%%", frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0], (frameSequence.CRCDelimiter.BitSequence[0].segmentLength[0] * 100.00) / frameSequence.DLC.BitSequence[1].segmentLength[0], (first_err_bit_length * 100.00) / frameSequence.DLC.BitSequence[1].segmentLength[0]); }}
void maintest(){ SamplePointTest_forVH6501();}

那采样点的测试结果一般受什么影响呢?一般来说受3个因素影响。

在总线信号和 RxD 引脚信号上影响采样点测试结果的因素示意图

∆𝑡𝑀𝑒𝑠𝐻𝑤指VH6501每次缩短或增长的步进长度。

∆𝑡𝑇𝑄指控制器的CAN参数配置中一个TQ的时间长度。

∆𝑡𝑅𝑒𝑐指总线上一个位的电平长度与控制器内部主控芯片 RxD 引脚上的一个位电平长度的时间差。∆𝑡𝑅𝑒𝑐 = 𝑡𝐵𝑖𝑡(𝑅𝑥𝐷) - 𝑡𝐵𝑖𝑡(𝐵𝑢𝑠)

如果一个 CAN 的设备使用的时钟对应的最小 TQ 时间长度在∆𝑡𝑅𝑒𝑐的范围内,并且实际 TQ 配置在此范围内,则∆𝑡𝑅𝑒𝑐所带来的误差需要考虑在采样点测试的结果中 。ISO11898-2: 2015规定了在2MBaud下,规定了∆𝑡𝑅𝑒𝑐的允许范围为-65ns 到+40ns。而对于 2MBaud下,一个位时间长度为500ns, 这意味着在RxD引脚上的为时间长度将会比在总线上的为时间长度短13%或长 8%。而 TQ 时间长度的计算公式为:∆𝑡𝑇𝑄 =𝑃𝑟𝑒𝑠𝑐𝑎𝑙𝑒𝑟/𝐶𝐴𝑁 𝐶𝑙𝑜𝑐𝑘

如果在 2MBaud 下, 一个 TQ 的时间长度小于一个位的 13%, 则∆𝑡𝑅𝑒𝑐将会被考虑进采样点测试的结果当中。具体的误差将取决于 CAN 发送器和使用的波特率。

假设 CAN 时钟频率为 80MHz, ∆𝑡𝑅𝑒𝑐为 25ns,预分频(Prescaler) 为 1, ∆𝑡𝑇𝑄为 12.5ns, ∆𝑡𝑀𝑒𝑠𝐻𝑤为6.25ns。仲裁相为 500kBaud,数据相为 2MBaud。

这意味着∆𝑡𝑅𝑒𝑐所带来的误差在仲裁相为 1.25%,在数据相则会上升到 5%(由于单个位时间长度缩短了) 。这几乎相当于 2 个 TQ 的时间长度。测试工具 VH6501 步进长度∆𝑡𝑀𝑒𝑠𝐻𝑤所带来的误差分别为0.3125%和 1.25%。

由于 CAN 协议 11898 中并未规定重同步后跳变沿一定要在同步段(Sync Segment) 的哪个位置,从同步段(Sync Segment) 的开始到结束均可以,因此这会带来 1 个 TQ 的误差。在仲裁相和数据相中带来的误差分别为 0.625%和 2.5%。

因此综上所述,在仲裁相中总的最大误差为 2.1875%(1.25% + 0.3125% + 0.625%) ,在数据相中总的最大误差为 8.75%(5% + 1.25% + 2.5%)。

由上可知, 由 VH6501 所带来的误差所占比例是很小的。而大部分是由于 CAN 协议本身所带来的误差。

-end-


分享不易,恳请点个【👍】和【在看】

汽车ECU开发 专注于汽车电子ECU软件开发,技术分享。
评论
  • By Toradex胡珊逢简介嵌入式领域的部分应用对安全、可靠、实时性有切实的需求,在诸多实现该需求的方案中,QNX 是经行业验证的选择。在 QNX SDP 8.0 上 BlackBerry 推出了 QNX Everywhere 项目,个人用户可以出于非商业目的免费使用 QNX 操作系统。得益于 Toradex 和 QNX 的良好合作伙伴关系,用户能够在 Apalis iMX8QM 和 Verdin iMX8MP 模块上轻松测试和评估 QNX 8 系统。下面将基于 Apalis iMX8QM 介
    hai.qin_651820742 2024-11-29 15:29 147浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 66浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 80浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 53浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期热荐性能显著提升的OSLON® Optimal,GF CSSRML.24ams OSRAM 基于最新芯片技术推出全新LED产品OSLON® Optimal系列,实现了显著的性能升级。该系列提供五种不同颜色的光源选项,包括Hyper Red(660 nm,PDN)、Red(640 nm)、Deep Blue(450 nm,PDN)、Far Red(730 nm)及Ho
    艾迈斯欧司朗 2024-11-29 16:55 152浏览
  • 国产光耦合器因其在电子系统中的重要作用而受到认可,可提供可靠的电气隔离并保护敏感电路免受高压干扰。然而,随着行业向5G和高频数据传输等高速应用迈进,对其性能和寿命的担忧已成为焦点。本文深入探讨了国产光耦合器在高频环境中面临的挑战,并探索了克服这些限制的创新方法。高频性能:一个持续关注的问题信号传输中的挑战国产光耦合器传统上利用LED和光电晶体管进行信号隔离。虽然这些组件对于标准应用有效,但在高频下面临挑战。随着工作频率的增加,信号延迟和数据保真度降低很常见,限制了它们在电信和高速计算等领域的有效
    腾恩科技-彭工 2024-11-29 16:11 105浏览
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 54浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 48浏览
  • 在电子技术快速发展的今天,KLV15002光耦固态继电器以高性能和强可靠性完美解决行业需求。该光继电器旨在提供无与伦比的电气隔离和无缝切换,是现代系统的终极选择。无论是在电信、工业自动化还是测试环境中,KLV15002光耦合器固态继电器都完美融合了效率和耐用性,可满足当今苛刻的应用需求。为什么选择KLV15002光耦合器固态继电器?不妥协的电压隔离从本质上讲,KLV15002优先考虑安全性。输入到输出隔离达到3750Vrms(后缀为V的型号为5000Vrms),确保即使在高压情况下,敏感的低功耗
    克里雅半导体科技 2024-11-29 16:15 119浏览
  • 光耦合器作为关键技术组件,在确保安全性、可靠性和效率方面发挥着不可或缺的作用。无论是混合动力和电动汽车(HEV),还是军事和航空航天系统,它们都以卓越的性能支持高要求的应用环境,成为现代复杂系统中的隐形功臣。在迈向更环保技术和先进系统的过程中,光耦合器的重要性愈加凸显。1.混合动力和电动汽车中的光耦合器电池管理:保护动力源在电动汽车中,电池管理系统(BMS)是最佳充电、放电和性能监控背后的大脑。光耦合器在这里充当守门人,将高压电池组与敏感的低压电路隔离开来。这不仅可以防止潜在的损坏,还可以提高乘
    腾恩科技-彭工 2024-11-29 16:12 117浏览
  • 国产光耦合器正以其创新性和多样性引领行业发展。凭借强大的研发能力,国内制造商推出了适应汽车、电信等领域独特需求的专业化光耦合器,为各行业的技术进步提供了重要支持。本文将重点探讨国产光耦合器的技术创新与产品多样性,以及它们在推动产业升级中的重要作用。国产光耦合器创新的作用满足现代需求的创新模式新设计正在满足不断变化的市场需求。例如,高速光耦合器满足了电信和数据处理系统中快速信号传输的需求。同时,栅极驱动光耦合器支持电动汽车(EV)和工业电机驱动器等大功率应用中的精确高效控制。先进材料和设计将碳化硅
    克里雅半导体科技 2024-11-29 16:18 157浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 61浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦