当前位置: 首页 > news >正文

深度解析 AS32S601 芯片 CAN Bus Off 机制:从原理到应用的全流程指南

一、前言

在汽车电子、工业自动化等众多领域,CAN 总线作为一种可靠的通信协议被广泛应用。而 AS32S601 芯片凭借其卓越的性能和可靠性,在这些领域也发挥着重要作用。其中,CAN Bus Off 功能作为 CAN 总线通信中的关键错误处理机制,对于保障整个通信网络的稳定性具有重要意义。

二、CAN Bus Off 功能详解

(一)定义与作用

CAN Bus Off(总线关闭)是指 CAN 节点因发送错误帧过多,超出设定数量后,被总线 “关闭” 进入 Bus Off 状态。此时节点无法收发消息,直至被重置或自动恢复。其主要作用是防止故障节点持续干扰总线通信,确保其他正常节点能继续工作。

(二)错误状态分类

  1. 主动错误状态(Error Active) :节点正常参与通信时的状态。检测到错误会发送主动错误标志(连续 6 个显性位),强制中断当前总线报文传输。

  2. 被动错误状态(Error Passive) :节点发送或接收错误计数器超过 127 时进入。此状态下节点虽能通信,但发送错误标志时用被动错误标志(连续 6 个隐性位),不会强制中断总线报文传输。

  3. 总线关闭状态(Bus Off) :最严重错误状态,节点发送错误计数器(TEC)超过 255 时触发。节点完全脱离总线,不能收发报文。

Bus Off机制的设计目的是为了避免某个设备因为自身原因(例如硬件损坏)导致无法正确收发报文而不断破坏总线的数据帧,从而影响其他正常节点通信。

三、Bus Off 产生原因与触发条件

(一)产生原因

  1. 物理层故障 :如 CAN_H/CAN_L 线路开路或短路(包括对电源或地短路)、终端电阻缺失、接地不良等,会影响信号传输的完整性和可靠性,进而导致 CAN 节点出现错误帧。

  2. 信号干扰 :强电磁干扰、强电流干扰会破坏 CAN 总线上传输的信号,使节点接收到错误的报文,从而引发错误计数器增加。

  3. 节点故障 :CAN 控制器或收发器硬件损坏、软件逻辑错误导致持续发送错误帧,会使节点自身发送错误帧数量迅速上升,最终触发 Bus Off 状态。

  4. 总线负载过高 :CAN 总线负载率长期接近或超过理论上限(如 >70%),会导致报文无法及时发送,节点重试次数增加,错误计数累积。

(二)触发机制

基于 CAN 协议定义的错误计数器机制,主要包括发送错误计数器(TEC)和接收错误计数器(REC)。当 TEC 超过阈值(通常为 255)时,节点进入 Bus Off 状态。错误计数规则如下:

  • 发送错误时:TEC + 8

  • 接收错误时:REC + 1

  • 成功发送后:TEC - 1(最低降至 0)

  • 成功接收后:REC - 1(最低降至 0)

状态转换路径依次为主动错误状态 → 被动错误状态 → 总线关闭状态。

四、Bus Off 的检测与解决测试

(一)检测方法

  1. 错误计数器监控 :通过监控 TEC 和 REC 值预测节点状态变化。当 TEC > 127 时进入被动错误状态;TEC > 255 时进入 Bus Off 状态。可使用如下代码监控并打印 TEC 计数:

1

2

3

/*------监控并打印TEC计数------*/

Printf("TEC: 0x%x !\r\n", CANFD3->ECR & CANFD_ECR_TEC);

Printf("ESTAT: 0x%x\r\n", CANFD3->SR & CANFD_SR_ESTAT);

2.状态寄存器查询 :在错误中断处理逻辑中查询 CAN 控制器的状态寄存器相应位。示例代码如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

PLIC_InitTypeDef  PLIC_InitStructure;

CANFD_ITConfig(CANFD3, CANFD_IT_EBSOFF, ENABLE);//打开BUSOFF中断

/*

 * Function:        CANFD3_IRQ_Handler

 * Description:     CANFD3 interrupt handler function.

 * Param:           None.                

 * Return:          None.

 */

void CANFD3_IRQ_Handler()

{

    if(CANFD_GetITStatus(CANFD3, CANFD_FLAG_BSOFF) != RESET)

    {      

        Printf("BusOff!\r\n");

        /* Clear the interrupt pending bits */

        CANFD_ClearITPendingBit(CANFD3, CANFD_CLEAR_BSOFF);

    }

}

(二)解决方案

  1. 自动恢复 :若支持自动恢复功能(auto bus on),可使用以下代码开启:

1

2

/*------打开BUS-OFF自动回复功能------*/

 CANFD_AutoBusOffRecoConfig(CANFD3,ENABLE);

 

2.手动恢复 :需重置 CAN 控制器或重新初始化 CAN 节点。让 CAN 进入初始化模式,再进入正常工作模式。示例代码如下:

1

2

3

4

5

6

7

/*------打开BUS-OFF自动回复功能------*/

if(key3_flag)

{

    key3_flag = 0;

    CANFD_SetBusOff_‌Recovery‌(CANFD3);

    Printf("The key3 pressed,BUS-OFF Recovery‌!\r\n");

}

3.快慢恢复策略

快恢复适用于临时性错误,短时间内(如 50ms)尝试恢复;慢恢复适用于较长时间(如 1s)后恢复,避免频繁错误影响系统。代码示例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

/*------BUS-OFF慢恢复-快恢复策略------*/

if(Quick_Recovery_Flag <5)

{

 if(time50_flag)

 {

     time50_flag = 0;

     Quick_Recovery_Flag++;

     CANFD_SetBusOff_‌Recovery‌(CANFD3);

     Printf("50ms BUS 0FF Quick Recovery!\r\n");

 }

}

if(Slow_Recovery_Flag <3)

{

 if(time1000_flag)

 {

     time1000_flag= 0;

     Slow_Recovery_Flag++;

     CANFD_SetBusOff_‌Recovery‌(CANFD3);

     Printf("1000ms BUS 0FF Slow Recovery!\r\n");

 }

}

五、Bus Off 的影响与后果

(一)对节点的影响

  1. 通信能力丧失 :节点无法发送报文或应答总线上的报文,也不能对总线产生任何影响,但部分实现下仍可接收总线上的数据。

  2. 功能限制 :虽然 ECU 节点从总线脱离,但 ECU 依然正常运行,所有任务仍被操作系统调度。

(二)对系统的影响

  1. 保护机制 :防止故障节点不断发送错误帧,影响整个网络的通信质量,确保其他正常节点可以继续通信。

  2. 潜在风险 :若关键节点进入 Bus Off 且无法恢复,可能导致系统功能降级或失效,在安全关键系统中可能引发更严重的后果。

总结

CAN Bus Off 功能作为 CAN 总线通信中的重要错误处理机制,在 AS32S601 芯片中得到了良好的支持和实现。通过深入了解其原理、产生原因、触发条件以及检测和恢复方法,我们能够更好地应对 CAN 总线通信中可能出现的问题,提高系统的可靠性。在实际应用中,应根据系统需求选择合适的检测和恢复策略,平衡系统可靠性和响应速度。

http://www.dtcms.com/a/328448.html

相关文章:

  • 浏览器CEFSharp+X86+win7 之 全球外贸电商平台订单管理(十)
  • 前后端分离项目中Spring MVC的请求执行流程
  • uni-app实战教程 从0到1开发 画图软件 (学会画图)
  • Ceph BlueStore存储引擎详解
  • 【数据结构】并查集:从入门到精通
  • 《Linux基础知识-1》
  • docker-compose搭建 redis 集群
  • 阿里巴巴开源多模态大模型-Qwen-VL系列论文精读(一)
  • VBS 时间函数
  • 基于 libwebsockets 库实现的 WebSocket 服务器类
  • Shader warning in ‘Universal Render Pipeline/Particles/Simple Lit‘
  • provide()函数和inject()函数
  • 【UEFI系列】Super IO
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-语音评测
  • 嵌入式学习(day25)文件IO:open read/write close
  • VGG改进(2):基于Local Attention的模型优化
  • 书籍数组中未出现的最小正整数(8)0812
  • 《飞算JavaAI:新一代智能编码引擎,革新Java研发范式》
  • 跑腿平台开发实战:同城O2O系统源码的模块化与可扩展性方案
  • 每日一练:将一个数字表示成幂的和的方案数;动态规划、深度优先搜索
  • 【Altium designer】快速建立原理图工程的步骤
  • 2025开放计算技术大会|开源开放推动系统创新 加速AIDC全球协作
  • 过拟合、欠拟合与方差/偏差的关系
  • Langchain结合deepseek:框架+模型的AI测试实践
  • 小白学习pid环控制-实现篇
  • 杰里平台7083G 如何支持4M flash
  • 【oracle闪回查询】记录字段短时间被修改的记录
  • MyBatis-Plus核心内容
  • AAC音频编码器技术详解:原理、应用与发展
  • Java数组排序