目录

一、什么时候发错误帧?

1. 位错误

2. 填充错误

3. CRC错误

4. 格式错误

5. ACK错误

二、自动重发的机制:CAN协议如何工作

三、错误帧如何实现?

1. 核心组件:CAN控制器内的错误管理逻辑

2. 错误帧的发送流程

3. 软件层面(程序员)能看到什么?

总结


MCU(通过其内置的CAN控制器)在什么时候会发出错误帧,以及这是如何实现的。

一、什么时候发错误帧?

MCU的CAN控制器不会随意发送错误帧,它只在检测到符合CAN协议规定的特定错误条件时才会立即触发。这些错误可以发生在发送过程中,也可以发生在接收过程中。

CAN协议定义了5种主要的错误类型:

1. 位错误
  • 触发时机:当发送节点在总线上输出一个位的同时,回读总线上的电平,发现与它刚输出的电平不一致时。

  • 例外情况:在仲裁场期间输出隐性位但回读到显性位,这不算位错误,因为这表示有更高优先级的节点在发送,本节点应该退出仲裁。在ACK槽期间输出隐性位但回读到显性位,这也不算错误,因为这表示有节点成功接收并回复了ACK。

2. 填充错误
  • 触发时机:在帧起始、仲裁场、控制场、数据场、CRC场这些需要位填充的字段中,检测到连续6个相同电平的位。

  • 原理:CAN协议规定,当出现连续5个相同位后,必须插入一个反相位的“填充位”。如果出现6个连续相同位,就违反了填充规则。

3. CRC错误
  • 触发时机接收节点根据接收到的数据计算出的CRC校验码,与发送节点在CRC场中发送的CRC序列不匹配时。

  • 原理:这表明数据传输过程中可能受到了干扰,数据内容出现了错误。

4. 格式错误
  • 触发时机:在报文帧的固定格式字段检测到非法位。

  • 例子

    • 帧结束字段(7个连续隐性位)检测到了显性位。

    • ACK界定符错误界定符(均为隐性位)检测到了显性位。

    • CRC界定符(隐性位)检测到了显性位。

5. ACK错误
  • 触发时机发送节点ACK槽中没有检测到显性位。

  • 原理:ACK槽是发送节点留出的一个隐性位间隙。如果至少有一个接收节点(非发送节点本身)正确接收了该帧,它必须在这个槽里填入一个显性位。如果发送节点没有读到这个显性位,说明没有一个节点成功接收,它就会产生一个ACK错误。


二、自动重发的机制:CAN协议如何工作

  1. 发送节点发送报文
    MCU将需要发送的数据(标识符、数据域等)写入CAN控制器的发送邮箱,然后CAN控制器会开始在总线上逐位发送该报文。

  2. 接收节点发现错误
    总线上的其他节点在接收过程中,如果发现任何错误(如CRC校验错误、格式错误、位填充错误等),会立即在总线上主动发送一个“错误帧”

  3. 错误帧的结构
    错误帧不是一种特殊的数据帧,而是由两个部分组成:

    • 错误标志:由6个连续的显性或隐性位(主动错误标志)组成,这破坏了CAN的位填充规则,从而引起所有节点的注意。

    • 错误界定符:8个连续的隐性位。

  4. 发送节点也同时监听到错误
    CAN节点在发送的同时也在监听总线。当发送节点自己监听到这个错误帧时,它立即停止当前的发送(可能连错误帧都没发完就中止了)。

  5. 自动重发
    发送节点在停止当前发送后,会自动等待一个特定的“中断帧间隔”时间,然后毫不犹豫地再次尝试发送同一个报文。这个过程对MCU软件是透明的,MCU甚至不知道发生了重发(除非它去查询状态寄存器)。

三、错误帧如何实现?

错误帧的实现是由MCU内部的CAN控制器硬件自动完成的,无需CPU核心的干预。这是一个高速的硬件级响应过程。

1. 核心组件:CAN控制器内的错误管理逻辑

CAN控制器内部有一套复杂的状态机和计数器来实现错误处理:

  • 错误计数器:每个CAN控制器都有两个错误计数器:

    • 发送错误计数器

    • 接收错误计数器

  • 错误状态:根据错误计数器的值,节点处于三种状态之一:

    • 主动错误状态:默认状态。可以正常参与总线通信。

    • 被动错误状态:错误较多。受到限制,不能主动破坏总线。

    • 总线关闭状态:错误非常多。完全与总线断开连接。

2. 错误帧的发送流程

当CAN控制器检测到上述任何一种错误时,会立即(在当前位时间内)执行以下操作:

第一步:发送“错误标志”

  • 这是错误帧的主体,目的是破坏当前的总线传输。

  • 如果节点处于【主动错误状态】

    • 它会立即向总线发送一个主动错误标志,即连续6个显性位

    • 这个连续的6个显性位违反了位填充规则,其他所有节点看到后都会识别出这是一个错误,并随之也发送错误标志。

    • 这是一种“众裁”机制,所有检测到错误的节点会同步发出错误标志,在总线上叠加,形成一个长的显性位序列。

  • 如果节点处于【被动错误状态】

    • 它只能发送一个被动错误标志,即连续6个隐性位

    • 它不会主动破坏总线,而是“悄悄地”在总线上等待。如果总线上在此期间没有其他显性位,这个错误标志才会被看到。如果此时有主动错误节点正在发送显性错误标志,被动错误节点的标志就会被覆盖。

第二步:发送“错误界定符”

  • 在发送完错误标志后,所有节点都会切换到接收模式,并开始发送错误界定符

  • 错误界定符由8个连续的隐性位组成。

  • 这个“冷静期”确保了总线在激烈的错误标志冲突后恢复稳定,为下一帧传输或重发做好准备。

3. 软件层面(程序员)能看到什么?

虽然错误帧的发送是硬件自动完成的,但程序员可以通过访问CAN控制器的状态寄存器错误计数器寄存器来了解情况。

  • 中断:CAN控制器通常可以配置为在发生错误、错误计数器变化或进入被动/总线关闭状态时产生中断。

  • 状态寄存器:程序员可以查询寄存器位来判断“最后一次错误是什么类型”(如CRC错误、格式错误等),以及“当前节点处于什么错误状态”。

  • 错误计数器:可以读取发送和接收错误计数器的值,用于总线健康状况诊断。

总结

  • 什么时候发?
    MCU在检测到位错误、填充错误、CRC错误、格式错误、ACK错误这五种情况之一时,会立即发送错误帧。

  • 如何实现?

    1. 硬件自动实现:由CAN控制器内的状态机和计数器逻辑完成。

    2. 立即响应:在检测到错误的那个位时间就开始发送错误标志,不等待帧结束。

    3. 状态依赖:根据节点的错误状态(主动/被动)发送不同类型(显性/隐性)的错误标志。

    4. 流程固定:发送错误标志 -> 所有节点同步 -> 发送错误界定符 -> 总线恢复。

    5. 结果:强制发送节点终止当前帧并自动重发。

这种机制确保了CAN总线的高可靠性,任何错误都会被迅速发现并纠正,保证了数据的完整性和一致性。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐