CAN BUS OFF 测试分享

目录

1. 什么是CAN BUS OFF

2. CAN BUS OFF的原因

3. CAN BUS OFF 测试的必要性

4. CAN BUS OFF状态及切换

5.实例演练

5.1 示例技术文档:

5.2 技术文档测试点梳理:

5.3 测试环境搭建步骤

5.4 测试结果分析:


1. 什么是CAN BUS OFF

CAN BUS OFF 表示总线的关闭,此时ECU从总线脱离,既不能接收总线的报文,也不能向总线发送报文。

CAN BUS OFF 是 CAN 总线通信中的一种严重错误状态,表示某个节点因检测到不可恢复的错误而主动退出总线通信。

CAN BUS OFF 是 CAN 协议中的安全机制,用于隔离故障节点以保障总线稳定。

2. CAN BUS OFF的原因

物理层故障:CAN_H/CAN_L 开路、短路(如对电源或地短路)、终端电阻缺失。

信号干扰:强电磁干扰导致报文错误。

节点故障:控制器或收发器硬件损坏,或软件逻辑错误导致持续发送错误帧

3. CAN BUS OFF 测试的必要性

协议合规性 --> 确保节点符合 ISO 11898 等标准,避免兼容性问题;

系统鲁棒性 --> 验证节点在复杂环境下的抗干扰能力,防止单点故障引发全局瘫痪;

故障恢复策略 --> 优化快恢复与慢恢复参数,平衡通信连续性与总线稳定性;

行业认证 --> 满足 ISO 26262、SAE J1939 等标准,通过功能安全认证;

缺陷定位 --> 暴露硬件设计、软件逻辑及时序配置问题,降低售后故障率;

场景覆盖 --> 模拟多节点协同、极端环境等实际工况,提升系统的环境适应性

4. CAN BUS OFF状态及切换

错误主动(Error Active):节点的正常工作状态。在该状态下,节点可以正常地发送和接收 CAN 消息,并且能够主动发出错误帧来通知其他节点出现了错误。节点有两个错误计数器:发送错误计数器(TEC)和接收错误计数器(REC),初始值通常都为 0。

错误被动(Error Passive):当节点的 TEC 或者 REC 超过 127 时,节点进入错误被动状态。在这个状态下,节点虽然仍能继续发送和接收消息,但如果检测到错误,只能发出被动错误帧。被动错误帧对总线的干扰较小,因为它不会像主动错误帧那样强制总线进入错误处理流程。

总线关闭(Bus Off):当 TEC 超过 255 时,节点进入总线关闭状态。此时,节点停止在总线上发送任何消息,也不再接收消息,相当于从总线上断开连接,目的是防止故障节点持续干扰总线通信。

                

5.实例演练

5.1 示例技术文档:

当“发送错误计数器”累计超过255 时,节点进入Bus-Off 状态;

当收到128 个连续11 个隐性位,节点由Bus-Off 状态变为“错误主动状态,“发送错误寄存器”和“接收错误寄存器”清零;

当总线进入Bus-Off 后,不允许CAN 控制器自动复位;

在Bus-Off 时间后50ms 时刻,ECU 尝试开始发送报文,如果发送成功并且50ms 内不再进入Bus-Off,则节点完成Bus-Off复位的确认,节点恢复正常通讯。

Bus-Off 复位及确认流程:

                         

备注:

1. 当“发送错误计数器”累计超过255 时,节点进入Bus-Off 状态。

2. 节点不允许CAN 控制器自动复位,要求节点进入Bus-Off 后,每隔50ms 尝试复位

一次,每复位一次复位计数器(Reset Counter)加1,复位计数器的初始值为0。

3. 如果复位计数器等于10,则节点每1s 尝试复位一次。如果节点成功发送常规报文,

则Bus-Off 复位成功,节点即可正常通讯,如果常规报文尝试发送失败,则节点

继续每1s 尝试一次Bus-Off 复位。

4. Busoff Counter 和Reset Counter 是在Busoff 后立即同时加1,但相应的CAN

ControlerReset 发生在Busoff 的50ms 后。(前10 次)

5.2 技术文档测试点梳理:

5.3 测试环境搭建步骤

 使用 CANoe 软件及 VH6501硬件搭建完成测试环境搭建

1) Open demo configuration "CANDisturbance.cfg"

2) Configure Network Hardware

3) Open "ConfigurationPannel"

4) Configure "Trigger Configuration"

5) Configure the disturbance sequence

6) Activate the trigger by clicking “Enable On device”

5.4 测试结果分析:

测试点2验证:在32帧错误帧后,错误帧间隔时间约为50ms,此处为快恢复时长;

测试点3验证:若干扰循环>10,即可查看慢恢复时长 1s;

测试点1验证: 32帧错误帧可换算出 TEC计数器,DUT每发送错误一次TEC计数器 +8,即出现一次错误帧,32*8 =256 > 255;

测试点4验证:干扰循环执行完成后,DUT通信正常恢复即pass

要进行 CAN FD 总线关闭状态的测试,核心在于验证 CAN 控制器在错误计数器达到特定阈值后是否能够正确进入总线关闭状态。测试的关键在于通过错误注入的方式提升错误计数器,从而触发状态转换。 测试过程中,可以通过发送不确认帧(NACK)、故意破坏帧的格式或 CRC 校验等方式,人为引入通信错误。随着错误计数器的增加,控制器会经历从错误活动状态到错误被动状态,最终在错误计数器达到 256 时进入总线关闭状态[^3]。 为了验证这一过程,可以使用支持 CAN FD 的测试设备,例如 PCAN-Diag FD。这类设备支持错误注入、波形捕捉以及总线状态监控,能够有效辅助测试过程。同时,设备还支持数据库解析报文,可以直观地观察错误帧的生成和状态转换过程[^1]。 以下是一个简单的 CAN FD 错误注入测试的 Python 示例代码(假设使用支持 CAN FD 的设备驱动): ```python import can # 配置 CAN FD 接口 bus = can.interface.Bus(channel='can0', bustype='socketcan', fd=True) # 创建一个正常的 CAN FD 帧 msg = can.Message(arbitration_id=0x123, data=[0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], is_extended_id=False, is_fd=True) # 发送帧 bus.send(msg) # 注入错误:发送一个格式错误的帧(例如数据长度超过 CAN FD 允许的最大值) erroneous_msg = can.Message(arbitration_id=0x123, data=[0x00] * 100, is_extended_id=False, is_fd=True) try: bus.send(erroneous_msg) except can.CanError: print("错误帧发送失败,可能已触发总线关闭状态") # 关闭接口 bus.shutdown() ``` 通过观察设备的状态寄存器或使用监控工具,可以确认 CAN 控制器是否成功进入总线关闭状态。此外,测试过程中还可以使用示波器功能捕捉 CAN/CAN FD 的波形,进一步分析错误触发的时机和波形变化[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值