一文读懂Can总线错误处理

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 一文读懂Can总线错误处理

1 CAN总线错误类型

为了防止故障节点干扰甚至阻塞整个CAN网络系统,CAN协议实现了复杂的故障限制机制。为了保证通信的正常,CAN 2.0 总线协议总线中各节点需要采取以下措施进行错误检测:

  • 监视(对发送位的电平与被监控的总线电平进行比较)
  • 循环冗余检查
  • 位填充
  • 报文格式检查

0382c6020d33db7391c0f85aba36a78b_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

CAN协议具有检测错误的能力。但是如果发生错误,它无法纠正错误。因此,如果发生错误,检测到的节点或ECU将向CAN网络发送错误帧。与之相对应的CAN 2.0 总线协议定义参与通信的CAN节点错误类型如下:

  • 位错误(Bit Error) 发送的位值和总线监视的位值不相符合时,检测到一个位错误(除仲裁场、应答场外);
  • 填充错误(Stuff Error)

如果在使用位填充编码的位流中,出现了第六个连续相同的位电平,将检测到一个位填充错误;

  • 形式错误 (Form Error)

当一个固定形式的位场含有一个或多个非法位时,将检测到一个形式错误;

  • 应答错误 (Acknowledgment Error)

在应答间隙(ACK SLOT)所监视的位不为“显性”,则会检测到一个应答错误;

  • CRC 错误(CRC Error)

如果接收器的CRC结果和发送器的CRC结果不同,将检测到一个CRC错误。

2 CAN总线错误处理机制

每个CAN控制器都有自己的CAN总线错误处理程序。为了处理这个问题,每个CAN控制器有两个计数器寄存器(0 – 255),即:发送错误计数器 (TEC) 和接收错误计数器 (REC) 。如果5个错误中发生任何一个发生错误,它将根据错误类型增加 TEC 或 REC。Tips:一个特例:如果CAN总线上只有一个节点,该节点发送数据帧后得不到响应(ACK),其发送计数器TEC最大只能计到128,即该节点只能进入错误被动状态,而不会进入总线关闭状态,这就是为什么当您没有将任何设备连接到网络时,您的ECU将持续发送帧,但不会检测到总线关闭并保持错误被动状态。

错误计数器的递增和递减操作是不对称的。在成功传输或接收消息时,如果相应的错误计数器未为零,则相应的错误计数器将递减。在传输或接收错误的情况下,计数器将递增,但递增值大于递减值。具体错误限制管理规则如下:

a) 当接收器检测到错误时,接收错误计数器REC+ 1。例外:发送活动错误标志、过载标志期间的位错误。

b) 当接收器在发送错误标志后检测到显性位作为第一位时,接收错误计数器REC+8。

c) 当发送器发送错误标志时,发送错误计数器REC+8。

1) 例外 1:如果发送器是错误被动状态,并且由于未检测到显性 ACK 而检测到 ACK 错误,并且在发送其被动错误标志时未检测到显性位。
    2) 例外 2:如果发送方因为仲裁期间发生填充错误而发送错误标志,因此,填充位应该是隐性的,并且已作为隐性发送但被监视为主导的。
    在这两种例外情况下,传输错误计数器保持不变。

d) 如果发送器在发送活动错误标志或过载标志时检测到位错误,则发送错误计数器TEC+8。

e) 如果接收器在发送活动错误标志或过载标志时检测到位错误,则接收错误计数器TEC+8。

f) 在发送活动错误标志、被动错误标志或过载标志后,任何节点都应容忍最多7 个连续显性位。在检测到第14个连续显性位后(在活动错误标志或过载标志的情况下)或在被动错误标志后检测到第 8 个连续显性位之后,并且每当在出现额外的8个连续显性位序列之后,REC和TEC都需要+8。

g) 成功传输一个帧后(收到 ACK 并且没有检测到错误,直到 EOF 被检测到完成),传输错误计数器应减1,直到为0。

h) 成功接收一个帧后(接收到 ACK 时隙没有错误并且成功ACK 位的发送),接收错误计数器应减 1,如果它介于1和127。如果接收错误计数器为0,则应保持为零 (0),如果它大于127,则应将其设置为介于119和127。

3 什么是CAN协议中的故障限制

故障限制是一种检查机制,可以区分短时干扰(例如电缆的噪声耦合到传输介质)和永1.久性故障(例如,节点发生故障并干扰总线). CAN通信节点的状态分为暂时错误(Error active和Error Passive)和永久性故障(Bus Off);

  1. 永久性故障节点自动脱离总线,防止网络锁定;Bus Off恢复需要满足于以下两个条件:
  • 在bus off发生后,总线上已经检测到了128次11个连续的隐性位(逻辑"1");
  • 用户程序请求恢复,通常MCU中的CAN控制器都可以支持自动恢复和手动恢复两种方式。CAN总线的bus off恢复需要满足整车的网络管理规范。
  1. 2.处于暂时错误(Error active和Error Passive)状态的CAN 2.0总线节点,其状态可以根据其发送错误计数器(TEC)和接收错误计数器(REC)值的变化,自动切换,而进入永久性故障(Bus Off))状态的节点,必须进入重新初始化才能恢复:

427f8106a0b93cccd7bec84b29e01a8c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

因此,节点可能处于以下三种可能的错误状态之一:

错误活动状态。错误被动状态。错误总线关闭状态。

668e2581736992274510bdd072bb313f_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

1. CAN协议中的错误主动状态

当CAN设备通电时,它以错误活动状态启动。处于错误活动状态的设备通常可以参与CAN通信。它还会在检测到错误时传输主动错误标志。此主动错误标志(表示主导 0 位序列)会导致当前帧传输中止,从而导致同一消息的后续重新传输。

053671a081fd7540117150e8b781cb5e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

其中两个错误计数器(TEC 和 REC)在错误活动状态下都小于 128。它完全参与总线通信,并通过传输活动错误帧来发出错误信号。这包括 6 个主导位的序列,后跟 8 个隐性位,所有其他节点都使用适当的错误标志进行响应,以响应违反位填充规则。

5aa49fdc30674fb8cdfc18eb895a8afb_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

2. CAN协议中的错误被动状态

如果发送错误计数器或接收错误计数器大于127,CAN设备将进入错误被动状态。处于错误被动状态的设备仍然可以参与通信,但在检测到任何错误时会传输被动错误标志。此被动错误标志(隐性 1 位序列)通常不会中止其他设备(如错误主动帧)传输的帧。

此外,错误被动节点必须在消息传输后等待额外的时间(Suspend Transmission Field,ITM后的 8 个隐性位),然后才能启动新数据。

7ce013421d270c05f40b44390c7fcba4_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

3. CAN协议中的总线关闭状态

如果CAN控制器的发送误差计数器超过255,则进入总线关闭状态。它与总线断开连接(使用内部逻辑),不再参与总线活动。简单地说,我们可以说物理上与总线连接和逻辑上断开连接。为了重新连接协议控制器,必须执行Bus Off recovery sequence。这通常涉及主机系统对CAN控制器的重新初始化和配置,之后它将等待(128 * 11)隐性位时间,然后再开始通信。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
数据采集 数据处理 C语言
单片机:探索其原理、应用与编程实践
单片机:探索其原理、应用与编程实践
31 1
|
1月前
|
程序员 测试技术 数据库连接
PHP编程中的错误处理技巧
在PHP编程中,处理错误是至关重要的一环。本文将介绍几种常见的PHP错误类型及其处理技巧,包括语法错误、运行时错误和逻辑错误。通过学习正确的错误处理方法,可以提高代码的可靠性和可维护性,从而更好地保障程序的稳定性和安全性。
23 2
|
1月前
|
开发者
STM32中断详解及其编程实践
STM32中断详解及其编程实践
177 1
|
1月前
|
前端开发 JavaScript 安全
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
【单片机】延迟程序&延迟子程序的设计(入门)
【单片机】延迟程序&延迟子程序的设计(入门)
|
1月前
|
算法 Linux
易懂的方式讲解ARM中断原理以及中断嵌套方法
易懂的方式讲解ARM中断原理以及中断嵌套方法
141 0
|
1月前
|
前端开发 安全
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
|
1月前
透彻理解 UART 通信的基本方法
透彻理解 UART 通信的基本方法
42 0
|
1月前
|
芯片 开发者
单片机中时钟分析与快速读懂时序图的方法
单片机中时钟分析与快速读懂时序图的方法
115 0
|
1月前
|
传感器 芯片 异构计算
常见的基础模块电路,你都能看懂吗?
常见的基础模块电路,你都能看懂吗?
61 0