Skip to main content

通讯工程-数据帧校验CRC

CRC(循环冗余校验)参数是定义 CRC 算法具体实现方式的一组配置值,不同的参数组合会产生不同的 CRC 校验结果。以下是 CRC 算法的核心参数及其说明:

CRC-8/MAXIM 算法是一种单字节循环冗余校验(CRC)算法,常用于嵌入式系统和通信协议中(如串口通信),用于检测数据传输过程中的错误。以下是其详细说明:

一、算法基本参数

参数说明
生成多项式x⁸ + x⁵ + x⁴ + 1对应十六进制为 0x31(注意:最高位的 x⁸ 省略,仅取低 8 位系数)。
初始值0x00校验计算的初始寄存器值。
输入数据处理每个字节逐位处理(先传最高位 MSB)按字节顺序处理数据,每个字节从最高位开始输入算法。
输出结果单字节(8 位)CRC 校验值计算完成后,寄存器值即为 CRC 校验码。
是否反转输出直接输出寄存器值,无需反转字节或位顺序。

二、算法原理与计算步骤

1. 核心思想

通过生成多项式对输入数据进行模 2 除法运算,得到的余数即为 CRC 校验值。其数学表达式为:D(x)⋅x**nR(x)modG(x) 其中:

  • D(x) 是输入数据多项式,
  • G(x)=x8+x5+x4+1 是生成多项式,
  • R(x) 是余数(即 CRC 值),
  • n=8(生成多项式的最高次数)。

2. 计算步骤(以单字节数据为例)

假设当前处理字节为 data,寄存器当前值为 crc(初始为 0x00),步骤如下:

  1. 异或操作:将 crc 的高 8 位与 data 异或,得到中间值 temptem**p=(crc>>8)⊕dat**a
  2. 多项式除法:对 temp 的每一位(从最高位到最低位)进行处理:
    • 若当前位为 1,则 temp 与生成多项式 0x31 异或;
    • 若为 0,则不做处理。 处理后,temp 左移一位(最低位补 0),重复此过程 8 次,直至所有位处理完毕。
  3. 更新寄存器值:将处理后的 temp 作为新的 crc 低 8 位,高 8 位补 0,进入下一字节的计算。

3. 完整流程(多字节数据)

  1. 初始化 crc = 0x00

  2. 对每个字节

```
data
```

in 数据序列:

- `crc = crc << 8`
- `crc = crc | data`
- 按上述单字节步骤计算新的 `crc`。
  1. 所有字节处理完毕后,crc 的低 8 位即为最终校验值。

一、CRC 核心参数详解

1. 生成多项式(Polynomial)

  • 定义:CRC 算法的数学基础,用二进制多项式表示,如 x⁸ + x⁵ + x⁴ + 1 对应二进制 100110001(省略最高位 1 后为 00110001,即 0x31)。
  • 作用:决定了 CRC 计算中模 2 除法的规则。
  • 常见值:
    • CRC-8/MAXIM:0x31
    • CRC-8/ITU:0x07
    • CRC-16/IBM:0x8005
    • CRC-32:0x04C11DB7

2. 初始值(Initial Value)

  • 定义:CRC 寄存器的初始值,影响计算的起点。
  • 常见值:
    • CRC-8/MAXIM:0x00
    • CRC-16/IBM:0x0000
    • CRC-32:0xFFFFFFFF

3. 输入数据反转(Reflect Input)

  • 定义:是否将输入数据的每个字节按位反转(如 0x010x80)。
  • 作用:适配不同的数据传输顺序(MSB 优先或 LSB 优先)。
  • 常见值:
    • CRC-8/MAXIM:不反转(false
    • CRC-16/IBM:反转(true

4. 输出结果反转(Reflect Output)

  • 定义:是否将最终 CRC 值按位反转。
  • 常见值:
    • CRC-8/MAXIM:不反转(false
    • CRC-16/IBM:反转(true

5. 结果异或值(XOR Output)

  • 定义:将最终 CRC 值与该值异或后作为校验结果。
  • 常见值:
    • CRC-8/MAXIM:0x00
    • CRC-32:0xFFFFFFFF

二、CRC 参数组合示例

标准名称生成多项式初始值输入反转输出反转结果异或值
CRC-8/MAXIM0x310x00falsefalse0x00
CRC-8/ITU0x070x00falsefalse0x55
CRC-16/IBM0x80050x0000truetrue0x0000
CRC-320x04C11DB70xFFFFFFFFtruetrue0xFFFFFFFF

三、CRC-8/MAXIM 参数详解

结合前文中的通信协议,其使用的 CRC-8/MAXIM 参数为:

  • 生成多项式0x31(对应多项式 x⁸ + x⁵ + x⁴ + 1
  • 初始值0x00
  • 输入反转false(按字节原始顺序处理)
  • 输出反转false(直接输出计算结果)
  • 结果异或值0x00(不做异或处理)

计算示例: 输入数据 0xAA, 0x03, 0x08 的 CRC 校验值计算步骤:

  1. 初始化 crc = 0x00
  2. 对每个字节执行:
    • crc = crc ^ 字节值
    • crc 的每一位进行处理(若最高位为 1,则异或 0x31,否则左移)。
  3. 最终 crc 即为校验值(此处结果为 0x00)。

四、参数不一致的影响

若发送方和接收方使用的 CRC 参数不同(如生成多项式或初始值不一致),会导致:

  • 接收方计算的 CRC 与发送方附加的 CRC 不匹配,即使数据未出错也会误判为传输错误。
  • 需确保通信双方使用完全相同的 CRC 参数配置