CAN Bus-Off

CAN(Controller Area Network) 是一种广泛应用于汽车和工业控制系统中的多主总线标准,用于实时短消息通信。在CAN网络中,数据通信的可靠性至关重要,CAN协议中引入了多种错误检测和恢复机制,其中Bus-Off功能是一个重要的错误处理机制。Bus-Off机制用于检测和应对严重错误情况,保护网络免受失效节点的干扰。

基本概念

Bus-Off 是CAN协议中用于处理严重错误的一项功能。当CAN控制器检测到大量错误导致Bus-Off状态时,会暂时从网络中隔离故障节点,以确保网络其他节点的正常通信。具体来说,Bus-Off状态是一种保护机制,防止故障节点不断发送错误帧,影响整个网络的通信质量。

CAN错误检测机制

在CAN网络中,错误检测和处理是通过以下机制来实现的:

  1. 位错误(Bit Error):若发送的位与检测到的位不一致,检测到位错误。
  2. 填充错误(Stuff Error):CAN帧中每连续5个相同位后插入反转位,若填充规则被破坏插入反转位,检测到填充错误。
  3. 帧错误(Form Error):CAN帧结构不符合标准时,检测到帧错误。
  4. 应答错误(Acknowledgement Error):接收帧时无节点应答(ACK Slot)位,检测到应答错误。
  5. CRC错误(CRC Error):接收CRC校验码与计算值不符,检测到CRC错误。

错误计数器

CAN控制器中有两个重要的错误计数器,用于记录节点发送和接收的错误数量:

  1. 发送错误计数器(Transmit Error Counter, TEC):记录发送错误的数量。
  2. 接收错误计数器(Receive Error Counter, REC):记录接收错误的数量。

这两个错误计数器的变化基于错误检测机制,并用于判断节点的状态。

错误状态和Bus-Off

根据错误计数器的值,CAN节点可以处于以下三种状态:

  1. 错误活动状态(Error Active State):TEC和REC均小于128,节点处于正常通信状态,可以发送和接收数据帧。
  2. 错误被动状态(Error Passive State):TEC或REC大于等于128但小于256,节点为了减少总线干扰,只能发送错误标志和接收数据帧。
  3. 总线关闭状态(Bus-Off State):TEC大于等于256,节点检测到严重错误,被强制从网络中隔离。

Bus-Off 的处理

当CAN控制器进入Bus-Off状态时,会暂停发送和接收所有的CAN帧。为了从Bus-Off状态恢复,节点必须满足以下条件:

  1. 分离期:在一定的分离期内节点将停止通信。这一阶段可以通过计数500毫秒时间量的连续11个离散位数来实现。
  2. 重置错误计数器:在分离期后,CAN控制器将TEC和REC计数器重置为零,以便重新加入网络。

Bus-Off 恢复过程

CAN控制器的Bus-Off恢复过程主要分为两个步骤:

  1. 停止操作:控制器进入Bus-Off状态会停止发送和接收所有消息,开启“听”模式。
  2. 重新同步:经过分离期后,控制器通过挂起发送和接收数据帧,重新同步到总线位时序,恢复正常操作。

代码示例

以下是一个基于典型CAN控制器的Bus-Off检测和恢复过程的实现示例:

#include <stdio.h>
#include <stdint.h>

#define CAN_BUS_OFF_THRESHOLD 256
#define CAN_BUS_OFF_RECOVERY_DELAY 3000  // 3 seconds recovery time for simplicity

// 模拟的CAN错误计数器结构
typedef struct {
    uint16_t TEC;  // 发送错误计数器
    uint16_t REC;  // 接收错误计数器
} CAN_ErrorCounters;

// 模拟的CAN控制器状态和错误计数器
CAN_ErrorCounters CAN_Errors;
uint8_t CAN_BusOffFlag = 0;

// Resets the error counters
void CAN_ErrorCountersReset(void) {
    CAN_Errors.TEC = 0;
    CAN_Errors.REC = 0;
}

// 模拟Bus-Off检测
void CheckCANBusOff(void) {
    if (CAN_Errors.TEC >= CAN_BUS_OFF_THRESHOLD) {
        CAN_BusOffFlag = 1;  // 进入总线关闭状态
        printf("CAN Bus-Off detected\n");
    }
}

// 模拟Bus-Off恢复
void RecoverCANBusOff(void) {
    if (CAN_BusOffFlag) {
        printf("Recovering from CAN Bus-Off...\n");
        CAN_ErrorCountersReset();
        CAN_BusOffFlag = 0;
        // 模拟恢复延迟
        uint32_t delay = CAN_BUS_OFF_RECOVERY_DELAY;
        while (delay--) {
            // 延迟中
        }
        printf("CAN Bus-Off recovery completed\n");
    }
}

int main(void) {
    // 模拟发送错误导致Bus-Off
    CAN_Errors.TEC = 256;  
    CAN_Errors.REC = 100;
    CheckCANBusOff();  // 检测和处理总线关闭状态
    
    // 处理总线关闭恢复
    RecoverCANBusOff();

    return 0;
}

总结

Bus-Off 功能是CAN协议中重要的错误处理机制,旨在确保网络中的错误节点不会影响其他节点的通信。当检测到严重错误时,该机制会将错误节点从网络隔离,从而保护网络的整体通信质量。通过正确的Bus-Off处理和恢复流程,可以显著提高CAN网络的可靠性和健壮性。了解Bus-Off的工作原理和实现,对于设计和维护高可靠性的CAN网络系统具有重要意义。如果你有更多具体问题或需要进一步的支持,请随时告诉我!


References

CAN Bus-Off详解-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值