CAN (Controller Area Network)
是一种广泛应用于汽车、工业自动化、医疗设备等领域的串行通信协议。它的核心是高效、可靠地在各个电子控制单元 (ECU) 之间传输数据。CAN 消息数据是 CAN 协议中传输信息的载体,它以帧
的形式在总线上进行广播。
介绍
CAN 协议定义了多种帧类型,其中最常用的是 数据帧 (Data Frame)
,用于传输实际数据。一个标准的 CAN 数据帧包含以下主要字段:
-
帧起始 (Start of Frame, SOF)
:
- 一个显性位(逻辑 0),表示帧的开始,用于同步总线上的所有节点。
-
仲裁场 (Arbitration Field)
:
标识符 (Identifier, ID)
:这是 CAN 消息最重要的部分之一,用于唯一标识消息,并决定消息的优先级。ID 值越小,优先级越高。
标准帧 (CAN 2.0A)
:使用 11 位标识符。
扩展帧 (CAN 2.0B / CAN FD)
:使用 29 位标识符(由 11 位基本 ID 和 18 位扩展 ID 组成)。
远程传输请求位 (Remote Transmission Request, RTR)
:
- 显性位 (0):表示数据帧,包含数据。
- 隐性位 (1):表示远程帧,用于请求具有相同 ID 的数据帧。
-
控制场 (Control Field)
:
标识符扩展位 (Identifier Extension, IDE)
:
- 显性位 (0):表示标准帧格式。
- 隐性位 (1):表示扩展帧格式。
保留位 (Reserved Bit, r0/r1)
:通常为显性位,预留用于未来协议扩展。
数据长度码 (Data Length Code, DLC)
:一个 4 位的值,指示数据场中包含的字节数。
- 对于传统 CAN (CAN 2.0A/B),DLC 范围是 0 到 8 字节。
- 对于 CAN FD (Flexible Data-Rate),DLC 范围是 0 到 64 字节,这大大增加了单帧可传输的数据量。
-
数据场 (Data Field)
:
- 包含实际要传输的用户数据。其长度由 DLC 决定。
- 传统 CAN:0 到 8 字节。
- CAN FD:0 到 64 字节。
-
循环冗余校验场 (Cyclic Redundancy Check, CRC Field)
:
- 一个 15 位的校验码,用于检测数据传输过程中是否发生错误,确保数据完整性。
CRC 界定符 (CRC Delimiter)
:一个隐性位,将 CRC 场与 ACK 场分开。
-
应答场 (ACK Field)
:
应答槽 (ACK Slot)
:接收到有效消息的节点会在该位发送一个显性位,表示已正确接收。
ACK 界定符 (ACK Delimiter)
:一个隐性位,将 ACK 场与 EOF 场分开。
-
帧结束 (End of Frame, EOF)
:
-
帧间空间 (Interframe Space, IFS)
:
- 7 个隐性位,用于将不同的消息帧分开,提供节点恢复时间。
CAN FD (Flexible Data-Rate)
是 CAN 协议的演进版本,主要改进包括:
更高的传输速率
:数据段可达 8 Mbit/s (传统 CAN 最高 1 Mbit/s)。
更大的数据有效载荷
:数据段可达 64 字节 (传统 CAN 最高 8 字节)。
- 引入了
BRS (Bit Rate Switch)
和 ESI (Error State Indicator)
位,以支持更高的速率和错误指示。
CAN 消息数据示例
假设我们有一个传感器,需要发送温度数据 (以摄氏度为单位),其值为 25.5°C。我们可以将这个浮点数转换为整数或定点数进行传输。
场景描述:
设备 A (发送者)
:一个温度传感器,每秒发送一次温度数据。
设备 B (接收者)
:一个显示器,接收并显示温度。
CAN ID
:假设我们分配一个 ID 为 0x100
(十六进制),优先级较高。
数据
:温度值 25.5°C。为了简化,我们假设将温度值放大 10 倍后取整,即 255。
传统 CAN 数据帧示例 (假设发送 2 字节数据):
我们假设温度值 255
(十进制) 转换为十六进制是 0x00FF
(2 字节)。
CAN ID
: 0x100
(11 位标准 ID)
RTR
: 0
(数据帧)
IDE
: 0
(标准帧)
DLC
: 2
(数据场包含 2 字节)
Data Field
: 0x00 0xFF
(表示温度值 25.5,需要接收端按照约定进行解析,例如:Data_Value / 10.0 = Temperature)
CAN 消息的逻辑表示 (在编程或日志中常见形式):
ID: 0x100, DLC: 2, Data: 00 FF
解析:
ID (0x100)
:表示这是温度传感器发送的温度数据消息。
DLC (2)
:表示数据场有 2 字节。
Data (00 FF)
:
- 如果约定数据是大端模式,那么
0x00FF
= 255 (十进制)。
- 如果约定温度值是实际温度的 10 倍,那么
255 / 10.0 = 25.5
°C。
更复杂的例子 (CAN FD,发送更多数据):
假设现在需要发送多个传感器数据,例如:
- 温度:25.5°C (放大 10 倍后为 255)
- 湿度:60% (直接为 60)
- 气压:1012.3 hPa (放大 10 倍后为 10123)
如果使用 CAN FD,我们可以将这些数据打包在一个帧中。
假设我们分配一个 ID 为 0x200
。
CAN ID
: 0x200
(11 位标准 ID)
RTR
: 0
(数据帧)
IDE
: 0
(标准帧)
DLC
: 5
(数据场包含 5 字节)
Data Field
: 0x00 0xFF 0x3C 0x27 0x8B
(假设数据字节顺序约定为:温度(2B) 湿度(1B) 气压(2B))
CAN 消息的逻辑表示:
ID: 0x200, DLC: 5, Data: 00 FF 3C 27 8B
解析:
ID (0x200)
:表示这是一个环境传感器数据消息。
DLC (5)
:表示数据场有 5 字节。
Data (00 FF 3C 27 8B)
:
- 字节 0-1 (
0x00FF
):表示温度值 255 (十进制)。解析为 25.5 °C。
- 字节 2 (
0x3C
):表示湿度值 60 (十进制)。解析为 60 %。
- 字节 3-4 (
0x278B
):表示气压值 10123 (十进制)。解析为 1012.3 hPa。
扩展
总结
CAN 消息数据是 CAN 通信的基础,其结构清晰,通过标识符区分消息,数据长度码控制数据大小,数据场承载实际信息。理解 CAN 消息的各个字段及其作用,对于设计、调试和分析 CAN 网络至关重要。CAN FD 的引入则进一步提升了 CAN 协议的性能,使其能够满足更多高带宽、大数据量的应用需求。