CAN 消息数据介绍

发布时间: 更新时间: 总字数:3125 阅读时间:7m 作者: IP上海 分享 网址

CAN (Controller Area Network) 是一种广泛应用于汽车、工业自动化、医疗设备等领域的串行通信协议。它的核心是高效、可靠地在各个电子控制单元 (ECU) 之间传输数据。CAN 消息数据是 CAN 协议中传输信息的载体,它以的形式在总线上进行广播。

介绍

CAN 协议定义了多种帧类型,其中最常用的是 数据帧 (Data Frame),用于传输实际数据。一个标准的 CAN 数据帧包含以下主要字段:

  1. 帧起始 (Start of Frame, SOF)

    • 一个显性位(逻辑 0),表示帧的开始,用于同步总线上的所有节点。
  2. 仲裁场 (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 的数据帧。
  3. 控制场 (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 字节,这大大增加了单帧可传输的数据量。
  4. 数据场 (Data Field)

    • 包含实际要传输的用户数据。其长度由 DLC 决定。
      • 传统 CAN:0 到 8 字节。
      • CAN FD:0 到 64 字节。
  5. 循环冗余校验场 (Cyclic Redundancy Check, CRC Field)

    • 一个 15 位的校验码,用于检测数据传输过程中是否发生错误,确保数据完整性。
    • CRC 界定符 (CRC Delimiter):一个隐性位,将 CRC 场与 ACK 场分开。
  6. 应答场 (ACK Field)

    • 应答槽 (ACK Slot):接收到有效消息的节点会在该位发送一个显性位,表示已正确接收。
    • ACK 界定符 (ACK Delimiter):一个隐性位,将 ACK 场与 EOF 场分开。
  7. 帧结束 (End of Frame, EOF)

    • 7 个隐性位,表示帧的结束。
  8. 帧间空间 (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) 位,以支持更高的速率和错误指示。

什么是大小端模式?

大小端模式指的是计算机系统存储或传输多字节数据时,字节的排列顺序。简单来说,就是数据的高位字节(MSB, Most Significant Byte)和低位字节(LSB, Least Significant Byte)谁放在内存地址的低位,谁放在高位。

字节地址(Memory Address)

在理解大小端模式时,需要先明确内存地址的概念。内存可以看作是一系列连续的存储单元,每个存储单元都有一个唯一的地址。地址通常从低到高递增。

  • 低地址(Lower Address):地址数值较小的内存位置
  • 高地址(Higher Address):地址数值较大的内存位置

大端模式(Big-Endian)

大端模式,也被称为网络字节序Motorola 格式。在这种模式下,数据的最高有效字节 (MSB) 存储在内存的最低地址,而最低有效字节 (LSB) 存储在内存的最高地址。

你可以这样记忆:就像我们书写数字的习惯,从左到右是高位到低位,高位(大头)放在前面(低地址)。

  • 示例

假设有一个 32 位的整数 0x12345678(其中 0x12 是最高有效字节,0x78 是最低有效字节)。

在内存中,如果按照大端模式存储,其字节排列如下:

内存地址: | 0x1000 | 0x1001 | 0x1002 | 0x1003 |
------------------------------------------------
存储内容: | 0x12   | 0x34   | 0x56   | 0x78   |
            ^MSB (最高有效字节)       ^LSB (最低有效字节)
            (低地址)                 (高地址)

实际应用场景:

  • 网络协议: TCP/IP 协议栈使用的是大端字节序,因此在进行网络通信时,如果两端主机字节序不同,通常需要进行字节序转换(例如使用 htons()ntohl() 等函数)。
  • 许多嵌入式处理器: 例如 Motorola 68K 系列、PowerPC、ARM(可配置为大端)。
  • 文件格式: 一些文件格式(如 Java 的 .class 文件、GIF、JPEG 图片文件头)也采用大端字节序。

小端模式(Little-Endian)

小端模式,也被称为 主机字节序Intel 格式。在这种模式下,数据的最低有效字节 (LSB) 存储在内存的最低地址,而最高有效字节 (MSB) 存储在内存的最高地址。

你可以这样记忆:就像小脚趾(低位)放在前面(低地址)。

  • 示例

假设仍然是 32 位的整数 0x12345678

在内存中,如果按照小端模式存储,其字节排列如下:

内存地址: | 0x1000 | 0x1001 | 0x1002 | 0x1003 |
------------------------------------------------
存储内容: | 0x78   | 0x56   | 0x34   | 0x12   |
            ^LSB (最低有效字节)       ^MSB (最高有效字节)
            (低地址)                 (高地址)

实际应用场景:

  • Intel x86 系列处理器: 包括你现在使用的绝大多数个人电脑和服务器(如基于 Intel 或 AMD CPU 的)。
  • 大部分操作系统: 如 Windows、Linux 等在 x86 架构上运行时。
  • CAN 总线(部分实现): 正如之前讨论的Intel CAN 格式,有些 CAN 设备在数据传输时会采用小端字节序。

为什么会有这两种模式?

主要原因在于历史和设计选择。不同的处理器架构设计者在处理多字节数据时,对于哪个字节先存储的约定不同。例如:

  • 大端模式的优势: 更符合人类阅读习惯,高位在前,方便调试。在某些情况下,可以更快地进行字符串比较或类型转换。
  • 小端模式的优势: 在进行加法运算时,可以从低位开始处理,效率更高(因为进位是从低位向高位传递)。许多现代处理器为了提高效率采用了小端模式。

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 协议的性能,使其能够满足更多高带宽、大数据量的应用需求。

参考

  1. https://zhuanlan.zhihu.com/p/609235685
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics