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软件开发,技术分享。
评论 (0)
  • ‌一、高斯计的正确选择‌1、‌明确测量需求‌‌磁场类型‌:区分直流或交流磁场,选择对应仪器(如交流高斯计需支持交变磁场测量)。‌量程范围‌:根据被测磁场强度选择覆盖范围,例如地球磁场(0.3–0.5 G)或工业磁体(数百至数千高斯)。‌精度与分辨率‌:高精度场景(如科研)需选择误差低于1%的仪器,分辨率需匹配微小磁场变化检测需求。2、‌仪器类型选择‌‌手持式‌:便携性强,适合现场快速检测;‌台式‌:精度更高,适用于实验室或工业环境。‌探头类型‌:‌横向/轴向探头‌:根据磁场方向选择,轴向探头适合
    锦正茂科技 2025-05-06 11:36 358浏览
  • 多功能电锅长什么样子,主视图如下图所示。侧视图如下图所示。型号JZ-18A,额定功率600W,额定电压220V,产自潮州市潮安区彩塘镇精致电子配件厂,铭牌如下图所示。有两颗螺丝固定底盖,找到合适的工具,拆开底盖如下图所示。可见和大部分市场的加热锅一样的工作原理,手绘原理图,根据原理图进一步理解和分析。F1为保险,250V/10A,185℃,CPGXLD 250V10A TF185℃ RY 是一款温度保险丝,额定电压是250V,额定电流是10A,动作温度是185℃。CPGXLD是温度保险丝电器元件
    liweicheng 2025-05-05 18:36 230浏览
  • 某国产固态电解的2次和3次谐波失真相当好,值得一试。(仅供参考)现在国产固态电解的性能跟上来了,值得一试。当然不是随便搞低端的那种。电容器对音质的影响_电子基础-面包板社区  https://mbb.eet-china.com/forum/topic/150182_1_1.html (右键复制链接打开)电容器对音质的影响相当大。电容器在音频系统中的角色不可忽视,它们能够调整系统增益、提供合适的偏置、抑制电源噪声并隔离直流成分。然而,在便携式设备中,由于空间、成本的限
    bruce小肥羊 2025-05-04 18:14 208浏览
  • 随着智能驾驶时代到来,汽车正转变为移动计算平台。车载AI技术对存储器提出新挑战:既要高性能,又需低功耗和车规级可靠性。贞光科技代理的紫光国芯车规级LPDDR4存储器,以其卓越性能成为国产芯片产业链中的关键一环,为智能汽车提供坚实的"记忆力"支持。作为官方授权代理商,贞光科技通过专业技术团队和完善供应链,让这款国产存储器更好地服务国内汽车厂商。本文将探讨车载AI算力需求现状及贞光科技如何通过紫光国芯LPDDR4产品满足市场需求。 车载AI算力需求激增的背景与挑战智能驾驶推动算力需求爆发式
    贞光科技 2025-05-07 16:54 114浏览
  • 5小时自学修好BIOS卡住问题  更换硬盘故障现象:f2、f12均失效,只有ESC和开关机键可用。错误页面:经过AI的故障截图询问,确定是机体内灰尘太多,和硬盘损坏造成,开机卡在BIOS。经过亲手拆螺丝和壳体、排线,跟换了新的2.5寸硬盘,故障排除。理论依据:以下是针对“5小时自学修好BIOS卡住问题+更换硬盘”的综合性解决方案,结合硬件操作和BIOS设置调整,分步骤说明:一、判断BIOS卡住的原因1. 初步排查     拔掉多余硬件:断开所有外接设备(如
    丙丁先生 2025-05-04 09:14 111浏览
  • 2024年初,OpenAI公布的Sora AI视频生成模型,震撼了国产大模型行业。随后国产厂商集体发力视频大模型,快手发布视频生成大模型可灵,字节跳动发布豆包视频生成模型,正式打响了国内AI视频生成领域第一枪。众多企业匆忙入局,只为在这片新兴市场中抢占先机,却往往忽视了技术成熟度与应用规范的打磨。以社交平台上泛滥的 AI 伪造视频为例,全红婵家人被恶意仿冒博流量卖货,明星们也纷纷中招,刘晓庆、张馨予等均曾反馈有人在视频号上通过AI生成视频假冒她。这些伪造视频不仅严重侵犯他人权
    用户1742991715177 2025-05-05 23:08 50浏览
  • 你是不是也有在公共场合被偷看手机或笔电的经验呢?科技时代下,不少现代人的各式机密数据都在手机、平板或是笔电等可携式的3C产品上处理,若是经常性地需要在公共场合使用,不管是工作上的机密文件,或是重要的个人信息等,民众都有防窃防盗意识,为了避免他人窥探内容,都会选择使用「防窥保护贴片」,以防止数据外泄。现今市面上「防窥保护贴」、「防窥片」、「屏幕防窥膜」等产品就是这种目的下产物 (以下简称防窥片)!防窥片功能与常见问题解析首先,防窥片最主要的功能就是用来防止他人窥视屏幕上的隐私信息,它是利用百叶窗的
    百佳泰测试实验室 2025-04-30 13:28 636浏览
  • 文/郭楚妤编辑/cc孙聪颖‍相较于一众措辞谨慎、毫无掌舵者个人风格的上市公司财报,利亚德的财报显得尤为另类。利亚德光电集团成立于1995年,是一家以LED显示、液晶显示产品设计、生产、销售及服务为主业的高新技术企业。自2016年年报起,无论业绩优劣,董事长李军每年都会在财报末尾附上一首七言打油诗,抒发其对公司当年业绩的感悟。从“三年翻番顺大势”“智能显示我第一”“披荆斩棘幸从容”等词句中,不难窥见李军的雄心壮志。2012年,利亚德(300296.SZ)在深交所创业板上市。成立以来,该公司在细分领
    华尔街科技眼 2025-05-07 19:25 74浏览
  • 浪潮之上:智能时代的觉醒    近日参加了一场课题的答辩,这是医疗人工智能揭榜挂帅的国家项目的地区考场,参与者众多,围绕着医疗健康的主题,八仙过海各显神通,百花齐放。   中国大地正在发生着激动人心的场景:深圳前海深港人工智能算力中心高速运转的液冷服务器,武汉马路上自动驾驶出租车穿行的智慧道路,机器人参与北京的马拉松竞赛。从中央到地方,人工智能相关政策和消息如雨后春笋般不断出台,数字中国的建设图景正在智能浪潮中徐徐展开,战略布局如同围棋
    广州铁金刚 2025-04-30 15:24 369浏览
  • 想不到短短几年时间,华为就从“技术封锁”的持久战中突围,成功将“被卡脖子”困境扭转为科技主权的主动争夺战。众所周知,前几年技术霸权国家突然对华为发难,导致芯片供应链被强行掐断,海外市场阵地接连失守,恶意舆论如汹涌潮水,让其瞬间陷入了前所未有的困境。而最近财报显示,华为已经渡过危险期,甚至开始反击。2024年财报数据显示,华为实现全球销售收入8621亿元人民币,净利润626亿元人民币;经营活动现金流为884.17亿元,同比增长26.7%。对比来看,2024年营收同比增长22.42%,2023年为7
    用户1742991715177 2025-05-02 18:40 203浏览
  • UNISOC Miracle Gaming奇迹手游引擎亮点:• 高帧稳帧:支持《王者荣耀》等主流手游90帧高画质模式,连续丢帧率最高降低85%;• 丝滑操控:游戏冷启动速度提升50%,《和平精英》开镜开枪操作延迟降低80%;• 极速网络:专属游戏网络引擎,使《王者荣耀》平均延迟降低80%;• 智感语音:与腾讯GVoice联合,弱网环境仍能保持清晰通话;• 超高画质:游戏画质增强、超级HDR画质、游戏超分技术,优化游戏视效。全球手游市场规模日益壮大,游戏玩家对极致体验的追求愈发苛刻。紫光展锐全新U
    紫光展锐 2025-05-07 17:07 148浏览
  • 二位半 5线数码管的驱动方法这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。实际的驱
    southcreek 2025-05-07 15:06 163浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦