CAN 异步通信的可靠性设计:错误处理与容错机制
扫描二维码
随时随地手机看文章
异步通信因无全局时钟、依赖帧结构同步,易受电磁干扰、总线衰减、节点故障导致数据错误。CAN 总线通过 “多层级错误检测”、“错误计数器与状态机”、“总线离线隔离” 三大机制,构建了高可靠的容错体系,确保即使在恶劣环境中,仍能维持通信稳定,避免故障节点扩散错误。
(一)多层级错误检测:覆盖通信全流程
CAN 总线定义了五种核心错误类型,通过硬件级检测机制,覆盖从位传输到帧结束的全流程,确保错误能被快速识别:
位错误(Bit Error):发送方发送一位数据后,在采样点检测到总线电平与自身发送电平不一致(ACK 槽除外),判定为位错误。例如,发送方发送显性位,却检测到总线为隐性位,可能是总线短路或其他节点干扰导致。
填充错误(Stuff Error):CAN 协议规定 “连续 5 个相同位后必须插入 1 个相反位(位填充)”,接收方若检测到连续 6 个相同位且非帧结束,判定为填充错误。填充错误通常源于发送方位填充逻辑故障或总线信号干扰导致的位丢失。
CRC 错误(CRC Error):接收方计算的 CRC 值与发送方的 CRC 场不一致,判定为 CRC 错误。CRC 错误是数据传输错误的直接体现,可能由电磁干扰导致的数据位翻转引起。
ACK 错误(Acknowledgment Error):发送方在 ACK 槽发送隐性位后,未检测到总线的显性位(无节点确认接收),判定为 ACK 错误。ACK 错误说明无节点正确接收帧,可能是总线断路或所有接收节点故障。
帧格式错误(Form Error):接收方检测到帧结构中的固定字段(如 CRC 界定符、ACK 界定符、帧结束)应为隐性位却出现显性位,判定为帧格式错误。帧格式错误通常源于发送方帧结构构建错误或总线严重干扰。
这些错误检测均由 CAN 控制器硬件实时执行,无需 MCU 干预,检测延迟仅为 1~2 个 TQ,确保错误能在帧传输过程中被快速识别,避免错误数据被处理。
(二)错误计数器与状态机:动态调整节点行为
CAN 控制器内置 “发送错误计数器(TEC)” 与 “接收错误计数器(REC)”,通过计数器数值动态调整节点的错误状态,实现 “分级容错”—— 根据错误严重程度,节点分为 “错误主动(Error Active)”、“错误被动(Error Passive)”、“总线离线(Bus-Off)” 三种状态,避免故障节点持续干扰总线:
错误主动状态(默认状态):TEC≤96 且 REC≤96,节点具备完整的发送与错误处理能力。检测到错误时,节点发送 “主动错误帧”(6 个显性位 + 8 个隐性位),通知所有节点存在错误,并根据错误类型更新计数器(如位错误 TEC+8、REC+8);发送成功时,TEC-1(最低为 0),接收成功时,REC-1(最低为 0)。
错误被动状态:TEC>96 或 REC>96,节点因错误较多,限制发送能力以减少干扰。检测到错误时,节点发送 “被动错误帧”(6 个隐性位 + 8 个隐性位),不主动触发总线显性位;发送数据时,需等待总线空闲 11 个隐性位后才能发送,避免与其他节点冲突;当 TEC≤96 且 REC≤96 时,恢复为错误主动状态。
总线离线状态:TEC>255,节点因严重错误被隔离。此时节点完全停止发送数据(包括错误帧),仅监听总线,当检测到 128 次连续 11 个隐性位(总线空闲)时,TEC 与 REC 清零,恢复为错误主动状态。总线离线状态是最后的容错手段,避免故障节点(如 CAN 收发器短路)持续发送错误帧,导致整个总线瘫痪。
例如,汽车中的某传感器节点因线路接触不良,持续发送位错误帧,TEC 从 0 逐步增加:TEC=8(第一次错误)→ TEC=96(第 12 次错误)→ TEC=97(第 13 次错误,进入错误被动状态)→ TEC=256(第 32 次错误,进入总线离线状态)。离线后,节点停止发送,避免干扰发动机 ECU、ABS 控制器等核心节点;当线路修复,节点检测到 128 次总线空闲后,恢复正常通信,确保汽车行驶安全。
(三)差分信号与总线拓扑:物理层抗干扰设计
CAN 异步通信的可靠性不仅依赖协议层机制,还需物理层的抗干扰设计 —— 通过差分信号传输、总线拓扑优化、终端电阻匹配,减少电磁干扰与信号衰减,为异步通信提供稳定的物理基础。
差分信号传输:CAN 总线采用 CAN_H 与 CAN_L 两根双绞线传输差分信号,显性位时 CAN_H=3.5V、CAN_L=1.5V(差分电压 2V),隐性位时 CAN_H=CAN_L=2.5V(差分电压 0V)。差分信号的优势在于 “抗共模干扰”—— 电磁干扰(如电机噪声、射频信号)会同时影响 CAN_H 与 CAN_L,产生相同的共模电压,而接收方仅检测差分电压,共模干扰被抵消,大幅提升抗干扰能力。例如,工业车间的电机启动时产生强电磁干扰,共模电压可达 1V,但差分电压仍稳定在 2V,接收方仍能准确识别显性位。
总线拓扑与终端电阻:CAN 总线采用 “线性总线拓扑”(所有节点并联在 CAN_H/CAN_L 上),避免星形、树形拓扑导致的信号反射;总线两端的节点需接入 120Ω 终端电阻,匹配总线特性阻抗(双绞线特性阻抗约 120Ω),减少信号反射。信号反射会导致总线电平出现毛刺,引发位错误,终端电阻可将反射信号吸收,确保信号完整性。例如,100 米长的 CAN 总线,若未接终端电阻,信号反射会导致显性位电平波动 ±0.5V,接终端电阻后波动小于 ±0.1V,满足异步通信的采样要求。
总线保护措施:实际应用中,CAN 总线还需加入过压保护(如 TVS 二极管)、过流保护(如自恢复保险丝),防止雷击、电源浪涌导致的收发器损坏。例如,汽车 CAN 总线在 CAN_H/CAN_L 与地之间并联 TVS 二极管(型号 SMBJ6.5CA),当总线电压超过 6.5V 时,TVS 二极管击穿,将过压电流导入地,保护 CAN 收发器(如 TJA1050)不被烧毁。





