CAN 总线

半双工异步(通过约定波特率的方式进行通信)、差分,通过TX、RX引脚连接到can收发器,再通过收发器的can_L和can_H进行通信。

1. CAN 通信的特点

  • 多主架构:CAN 网络中的设备(节点)可以主动发送数据,不需要中央控制器。
  • 广播通信:发送的数据会被所有节点接收,但只有目标节点会处理数据。
  • 高可靠性:内置错误检测和纠正机制,确保通信的可靠性。
  • 实时性:支持高优先级数据的快速传输。
  • 抗干扰能力:采用差分信号传输,适合在噪声环境中使用。
  • 灵活性:支持多种数据帧格式和通信速率(最高可达 1 Mbps)。

显性(Dominant)

  • 定义:显性电平表示逻辑 0
  • 物理层实现:
    • 在 CAN 总线上,显性电平通过 CAN_HCAN_L 之间的较大电压差来实现。
    • 典型电压值:
      • CAN_H: 3.5 V
      • CAN_L: 1.5 V
      • 电压差:2 V

隐性(Recessive)

  • 定义:隐性电平表示逻辑 1
  • 物理层实现:
    • 隐性电平通过 CAN_HCAN_L 之间的较小电压差来实现。
    • 典型电压值:
      • CAN_H: 2.5 V
      • CAN_L: 2.5 V
      • 电压差:0 V

can

2. CAN 通信的物理层

CAN 通信通常通过两条信号线进行传输:

  • CAN_H(CAN High):高电平信号线。
  • CAN_L(CAN Low):低电平信号线。

CAN 使用差分信号传输,逻辑状态通过两条信号线的电压差表示:

  • 显性电平(Dominant):表示逻辑 0,CAN_H 和 CAN_L 的电压差较大。
  • 隐性电平(Recessive):表示逻辑 1,CAN_H 和 CAN_L 的电压差较小。

3. CAN 通信的数据帧格式

CAN 协议定义了两种数据帧格式:

  • 标准帧(11 位标识符):标识符长度为 11 位,适用于简单的通信场景。
  • 扩展帧(29 位标识符):标识符长度为 29 位,适用于复杂的通信场景。

数据帧的主要字段包括:

  • 标识符(ID):用于标识数据的优先级和类型。
  • 控制字段:包含数据长度码(DLC),指示数据字段的字节数(0-8 字节)。
  • 数据字段:实际传输的数据,长度为 0-8 字节。
  • CRC 字段:用于错误检测的循环冗余校验码。
  • ACK 字段:用于确认数据是否被正确接收。
  • 帧结束字段:表示数据帧的结束。

4. CAN 通信的工作原理

  • 总线仲裁:当多个节点同时发送数据时,CAN 通过标识符的优先级进行仲裁。优先级高的节点(标识符值较小)会继续发送,而优先级低的节点会自动退出发送。
  • 错误检测与处理:CAN 协议内置了多种错误检测机制,包括位错误、填充错误、CRC 错误等。如果检测到错误,节点会发送错误帧并重传数据。
  • 数据确认:接收节点在成功接收数据后,会发送 ACK 信号以确认数据传输成功。

can2

数据帧

canMessage

  • RTR为广播模式还是请求模式
  • IDE表示采用哪种格式解析:标准格式还是扩展格式
  • r0保留位
  • DLC指定后面发送数据字节数
  • CRC校验段
  • ACK应答位,发送方设置为隐性电平(1),由接收方接收到数据后置显性电平(0)

,发送方与接收方共同完成数据帧

  • EOF波形结束

扩展格式因为ID位不够时提出

位填充

当连续发出5个相同位时,后一位填充一位相反电平位

1. 位填充的作用

  • 同步:通过插入额外的位,确保接收节点能够正确同步发送节点的时钟。避免出现连续多个相同电位导致检测出错。
  • 错误检测:如果接收节点检测到违反位填充规则的位序列,可以判断为传输错误。
  • 减少电磁干扰(EMI):避免长时间出现相同的位,减少信号中的直流分量,降低电磁干扰。
  • 区分正常数据流与错误帧、过载帧,错误帧有六位相同的电位。
  • 保持活跃状态,当连续11个隐性1后,认为CAN总线处于空闲状态。

2. 位填充的规则

在 CAN 通信中,位填充规则如下:

  • 填充触发条件:当发送节点检测到连续 5 个相同的位(5 个 0 或 5 个 1)时,会自动插入一个相反的位。
    • 如果连续 5 个 0,则插入 1。
    • 如果连续 5 个 1,则插入 0。
  • 填充位的作用:插入的填充位不会改变数据的逻辑含义,仅用于同步和错误检测。
  • 填充位的移除:接收节点在接收数据时,会自动移除填充位,恢复原始数据。

位时序

控制采样每位数据的位置

硬同步:

位时序的硬同步(Hard Synchronization) 是用于调整接收节点时钟相位的一种机制,以确保接收节点能够正确解析发送节点发送的位信号。硬同步主要发生在 帧起始(Start of Frame, SOF) 时,用于将接收节点的内部时钟与发送节点的时钟对齐。

再同步:

补偿发送节点和接收节点之间时钟偏差的机制。它的主要作用是通过调整接收节点的位时间,确保接收节点能够正确采样发送节点发送的位信号,从而提高通信的可靠性。

仲裁

CAN 总线采用非破坏性逐位仲裁(Non-Destructive Bitwise Arbitration)的方式,确保优先级最高的节点能够继续发送数据,而其他节点则主动退出,从而避免数据冲突。以下是关于 CAN 仲裁的详细解释:

1. CAN 仲裁的基本原理

CAN 总线是一种多主总线,允许多个节点同时发送数据。当多个节点同时发送数据时,CAN 使用逐位仲裁机制来解决冲突。仲裁的核心规则是:

  • 显性电平(Dominant):逻辑 0,具有更高的优先级。
  • 隐性电平(Recessive):逻辑 1,具有更低的优先级。

在仲裁过程中,节点会逐位比较发送的电平与总线上实际电平:

  • 如果节点发送的是隐性电平(1),但检测到显性电平(0),则该节点知道自己失去了仲裁,会主动停止发送。
  • 如果节点发送的电平与总线电平一致,则该节点继续发送下一位。

最终,优先级最高的节点(发送显性电平最多的节点)会赢得仲裁,继续完成数据发送。

2. CAN 仲裁的规则

CAN 仲裁遵循以下规则:

  1. 逐位比较:仲裁是基于 CAN 帧的标识符(Identifier)逐位进行的。
  2. 显性电平优先:显性电平(0)比隐性电平(1)具有更高的优先级。
  3. 非破坏性仲裁:失去仲裁的节点不会破坏总线的数据,而是主动停止发送。
  4. 优先级由标识符决定:标识符值越小,优先级越高。

3. CAN 仲裁的过程

以下是 CAN 仲裁的具体过程:

  1. 节点开始发送:多个节点同时开始发送 CAN 帧,首先发送帧起始(Start of Frame, SOF)。
  2. 逐位比较标识符:
    • 每个节点逐位发送自己的标识符,并同时监听总线电平。
    • 如果节点发送的是隐性电平(1),但检测到显性电平(0),则该节点知道自己失去了仲裁,停止发送并转为接收模式。
  3. 仲裁结束:
    • 优先级最高的节点(标识符值最小的节点)会赢得仲裁,继续发送剩余的 CAN 帧。
    • 其他节点则等待总线空闲后重新尝试发送。

4. CAN 仲裁的示例

假设有三个节点同时发送数据,它们的标识符分别为:

  • 节点 A:0101 0110(优先级最高)
  • 节点 B:0101 1100
  • 节点 C:0110 0010

仲裁过程如下:

  1. 所有节点发送帧起始(SOF)。
  2. 逐位比较标识符:
    • 第 1 位:所有节点发送 0(显性),总线电平为 0,继续。
    • 第 2 位:所有节点发送 1(隐性),总线电平为 1,继续。
    • 第 3 位:所有节点发送 0(显性),总线电平为 0,继续。
    • 第 4 位:所有节点发送 1(隐性),总线电平为 1,继续。
    • 第 5 位:
      • 节点 A 发送 0(显性)。
      • 节点 B 和节点 C 发送 1(隐性)。
      • 总线电平为 0,节点 B 和节点 C 检测到冲突,停止发送。
  3. 节点 A 赢得仲裁,继续发送剩余的 CAN 帧。

数据帧和请求帧的ID号相同时,数据帧的优先级更高。

标准格式数据帧高于扩展格式数据帧

错误处理

1. CAN 错误处理的概述

CAN 协议定义了多种错误检测和处理机制,主要包括:

  1. 错误检测:通过多种方式检测通信中的错误。
  2. 错误通知:当检测到错误时,节点会发送错误帧通知其他节点。
  3. 错误恢复:节点会根据错误状态采取相应的恢复措施,例如重发数据或进入错误状态。

2. CAN 错误类型

CAN 协议定义了以下五种错误类型:

  1. 位错误(Bit Error):
    • 节点发送的位与总线上实际检测到的位不一致。
    • 例外:在仲裁期间或发送隐性位时,不视为位错误。
  2. 填充错误(Stuff Error):
    • CAN 协议规定,每 5 个相同位后必须插入一个相反位(位填充)。
    • 如果检测到 6 个或更多相同位,则视为填充错误。
  3. CRC 错误(CRC Error):
    • 接收节点计算的 CRC(循环冗余校验)值与发送节点的 CRC 值不一致。
  4. 格式错误(Form Error):
    • 检测到不符合 CAN 帧格式的位,例如帧结束(EOF)应为 7 个隐性位。
  5. 应答错误(Acknowledgment Error):
    • 发送节点未收到至少一个接收节点的显性应答位。

3. CAN 错误帧

当节点检测到错误时,会发送错误帧通知其他节点。错误帧由以下两部分组成:

  1. 错误标志(Error Flag):
    • 主动错误标志(Active Error Flag):6 个连续的显性位。
    • 被动错误标志(Passive Error Flag):6 个连续的隐性位。
  2. 错误分隔符(Error Delimiter):
    • 8 个隐性位,用于标记错误帧的结束。

4. CAN 错误状态

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

  1. 主动错误状态(Error Active):
    • 节点可以正常发送和接收数据。
    • 当检测到错误时,发送主动错误标志。
  2. 被动错误状态(Error Passive):
    • 节点仍然可以发送和接收数据,但优先级较低。
    • 当检测到错误时,发送被动错误标志。
  3. 总线关闭状态(Bus Off):
    • 节点无法发送或接收数据,必须等待恢复后才能重新加入通信。