can协议
CAN 总线
半双工、异步(通过约定波特率的方式进行通信)、差分,通过TX、RX引脚连接到can收发器,再通过收发器的can_L和can_H进行通信。
1. CAN 通信的特点
- 多主架构:CAN 网络中的设备(节点)可以主动发送数据,不需要中央控制器。
- 广播通信:发送的数据会被所有节点接收,但只有目标节点会处理数据。
- 高可靠性:内置错误检测和纠正机制,确保通信的可靠性。
- 实时性:支持高优先级数据的快速传输。
- 抗干扰能力:采用差分信号传输,适合在噪声环境中使用。
- 灵活性:支持多种数据帧格式和通信速率(最高可达 1 Mbps)。
显性(Dominant)
- 定义:显性电平表示逻辑 0。
- 物理层实现:
- 在 CAN 总线上,显性电平通过 CAN_H 和 CAN_L 之间的较大电压差来实现。
- 典型电压值:
- CAN_H: 3.5 V
- CAN_L: 1.5 V
- 电压差:2 V
隐性(Recessive)
- 定义:隐性电平表示逻辑 1。
- 物理层实现:
- 隐性电平通过 CAN_H 和 CAN_L 之间的较小电压差来实现。
- 典型电压值:
- CAN_H: 2.5 V
- CAN_L: 2.5 V
- 电压差:0 V
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 信号以确认数据传输成功。
数据帧
- 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 仲裁遵循以下规则:
- 逐位比较:仲裁是基于 CAN 帧的标识符(Identifier)逐位进行的。
- 显性电平优先:显性电平(0)比隐性电平(1)具有更高的优先级。
- 非破坏性仲裁:失去仲裁的节点不会破坏总线的数据,而是主动停止发送。
- 优先级由标识符决定:标识符值越小,优先级越高。
3. CAN 仲裁的过程
以下是 CAN 仲裁的具体过程:
- 节点开始发送:多个节点同时开始发送 CAN 帧,首先发送帧起始(Start of Frame, SOF)。
- 逐位比较标识符:
- 每个节点逐位发送自己的标识符,并同时监听总线电平。
- 如果节点发送的是隐性电平(1),但检测到显性电平(0),则该节点知道自己失去了仲裁,停止发送并转为接收模式。
- 仲裁结束:
- 优先级最高的节点(标识符值最小的节点)会赢得仲裁,继续发送剩余的 CAN 帧。
- 其他节点则等待总线空闲后重新尝试发送。
4. CAN 仲裁的示例
假设有三个节点同时发送数据,它们的标识符分别为:
- 节点 A:
0101 0110
(优先级最高) - 节点 B:
0101 1100
- 节点 C:
0110 0010
仲裁过程如下:
- 所有节点发送帧起始(SOF)。
- 逐位比较标识符:
- 第 1 位:所有节点发送
0
(显性),总线电平为0
,继续。 - 第 2 位:所有节点发送
1
(隐性),总线电平为1
,继续。 - 第 3 位:所有节点发送
0
(显性),总线电平为0
,继续。 - 第 4 位:所有节点发送
1
(隐性),总线电平为1
,继续。 - 第 5 位:
- 节点 A 发送
0
(显性)。 - 节点 B 和节点 C 发送
1
(隐性)。 - 总线电平为
0
,节点 B 和节点 C 检测到冲突,停止发送。
- 节点 A 发送
- 第 1 位:所有节点发送
- 节点 A 赢得仲裁,继续发送剩余的 CAN 帧。
数据帧和请求帧的ID号相同时,数据帧的优先级更高。
标准格式数据帧高于扩展格式数据帧
错误处理
1. CAN 错误处理的概述
CAN 协议定义了多种错误检测和处理机制,主要包括:
- 错误检测:通过多种方式检测通信中的错误。
- 错误通知:当检测到错误时,节点会发送错误帧通知其他节点。
- 错误恢复:节点会根据错误状态采取相应的恢复措施,例如重发数据或进入错误状态。
2. CAN 错误类型
CAN 协议定义了以下五种错误类型:
- 位错误(Bit Error):
- 节点发送的位与总线上实际检测到的位不一致。
- 例外:在仲裁期间或发送隐性位时,不视为位错误。
- 填充错误(Stuff Error):
- CAN 协议规定,每 5 个相同位后必须插入一个相反位(位填充)。
- 如果检测到 6 个或更多相同位,则视为填充错误。
- CRC 错误(CRC Error):
- 接收节点计算的 CRC(循环冗余校验)值与发送节点的 CRC 值不一致。
- 格式错误(Form Error):
- 检测到不符合 CAN 帧格式的位,例如帧结束(EOF)应为 7 个隐性位。
- 应答错误(Acknowledgment Error):
- 发送节点未收到至少一个接收节点的显性应答位。
3. CAN 错误帧
当节点检测到错误时,会发送错误帧通知其他节点。错误帧由以下两部分组成:
- 错误标志(Error Flag):
- 主动错误标志(Active Error Flag):6 个连续的显性位。
- 被动错误标志(Passive Error Flag):6 个连续的隐性位。
- 错误分隔符(Error Delimiter):
- 8 个隐性位,用于标记错误帧的结束。
4. CAN 错误状态
CAN 节点根据错误计数器的值TEC和REC,可能处于以下三种状态:
- 主动错误状态(Error Active):
- 节点可以正常发送和接收数据。
- 当检测到错误时,发送主动错误标志。
- 被动错误状态(Error Passive):
- 节点仍然可以发送和接收数据,但优先级较低。
- 当检测到错误时,发送被动错误标志。
- 总线关闭状态(Bus Off):
- 节点无法发送或接收数据,必须等待恢复后才能重新加入通信。