STM32 SPI CRC polynominal = 7 含义

STM32 SPI CRC polynominal = 7 含义

  • [1. CRC校验](#1. CRC校验)
    • [1.1 多项式公式](#1.1 多项式公式)
    • [1.2 多项式简记式](#1.2 多项式简记式)
    • [1.3 数据宽度](#1.3 数据宽度)
    • [1.4 初始值与结果异或值](#1.4 初始值与结果异或值)
    • [1.5 输入值反转与输出值反转](#1.5 输入值反转与输出值反转)
  • [2. 常见的CRC算法](#2. 常见的CRC算法)
  • [3. CRC校验算法前置知识](#3. CRC校验算法前置知识)
    • [3.1 异或](#3.1 异或)
    • [3.2 模2加法](#3.2 模2加法)
    • [3.3 模2减法](#3.3 模2减法)
    • [3.4 模2除法](#3.4 模2除法)
  • [4. CRC原理](#4. CRC原理)
  • [5. 计算示例](#5. 计算示例)
  • [6. STM32 SPI 中的CRC校验](#6. STM32 SPI 中的CRC校验)

1. CRC校验

CRC(cyclic redundancy checksum):循环冗余校验和。常见的校验方法:奇偶校验、因特网校验和循环冗余校验。

1.1 多项式公式

对于CRC校准除数,一般使用多项式(或二项式)公式表示,如下图中,除数11011(poly值为0X1B)的二项式为G(X)= X4 + X3 + X + 1

  • X代表该bit位上的数据为1
  • 除数的位数为二项式最高次幂+1(4+1=5)

1.2 多项式简记式

多项式的收尾必定为1,而这个1的位置在下一步计算一定为0,所以就把前面这个1给省略掉了,称为简记式。

例如上例中除数11011的简记式为1011

1.3 数据宽度

数据宽度指:CRC校验码的长度,比CRC除数位数少1,与简记式长度一致。

1.4 初始值与结果异或值

  • 一些标准中规定了初始值:先把要计算的数据与初始值的最低字节进行异或,然后再与多项式进行计算
  • 结果异或值不为零时:将计算得到的CRC结果值再与结果异或值进行一次异或计算,得到最终值,这才是我们需要的CRC校验码
  • 初始值与结果值的位数 = 数据宽度

1.5 输入值反转与输出值反转

  • 输入值反转:计算之前先将二项式反转,然后再用得到的新值和数据进行计算
    • G(x) = X16 + X15 + X2 + 1(16#18005),其正向值为1 1000 0000 0000 0101,反值则为1010 0000 0000 0001 1
  • 输出值反转:将最终得到的CRC结果反转
  • 一般输入值和输出值是同向的:输入值反转,则输出值也是反转的

2. 常见的CRC算法

CRC可以任意定义二项式、数据长度等,这里列出一些国际常用的模型表

3. CRC校验算法前置知识

3.1 异或

  • 异或:两个数不同则为1,相同则为0
  • 运算符:^
c 复制代码
0^0 = 0
0^1 = 1
1^1 = 0
1^0 = 1

异或运算存在几个规律

c 复制代码
0^x = x 即0 异或任何数等于任何数
1^x = ~x 即1异或任何数等于任何数取反
x^x = 0 即任何数与自己异或,结果为0
a ^ b = b ^ a 交换律
a ^ (b ^ c) = (a ^ b) ^c 结合律

3.2 模2加法

  • 与常规加法的区别,不进位。计算如下:效果与异或相同
c 复制代码
0+0 = 0
0+1 = 1
1+1 = 0
1+0 = 1

3.3 模2减法

  • 与常规减法的区别,不借位。计算如下:效果与异或相同
c 复制代码
0-0 = 0
0-1 = 1
1-1 = 0
1-0 = 1

3.4 模2除法

  • 与常规除法的区别,不借位

4. CRC原理

CRC原理:在K位信息码(目标发送数据)后再拼接R位校验码,使整个编码长度为N位,因此也叫(N,K)码。具体做法如下:

  • 选定一个标准除数(K位二进制数据串)
  • 在要发送的数据(m位)后面加上K-1位0,然后将这个新数(M+K-1位),以模2除法的方式除以上面这个标准除数,所得到的余数也就是该数据的CRC校验码。(余数必须比除数少且只少一位,不够就补0)
  • 将这个校验码附在原m位数据后面,构成新的M+K-1位数据,发送给接收端
  • 接收端将接收到的数据除以标准除数,如果余数为0则认为数据正确

注意:
1.发送端和接收端约定好一个除数,即CRC多项式

5. 计算示例

对于数据1110 0101(0xE5),以指定除数11011(CRC-5标准)求它的CRC校验码,其过程如下:

  • 目标发送数据:1110 0101(16位), 0xE5
  • 标准除数: 11011 (5位)
  • 目标发送数据 + (标准除数 - 1)位0: 1110 0101 0000
  • 模2除法方式除以11011,商10101100,余数0100
  • CRC校验码:0100
  • 将将这个校验码附在原数据后面:1110 0101 0100

6. STM32 SPI 中的CRC校验

STM32中选择CRC polynominal 实际上就是在确认CRC标准的二项式:X0+X1+X2 就是111(第0位,第1位,第2位是1,对应数值=7)
查看STM32F4数据手册,可以看到SPI CRC calculation过程如下

STM32CubeMX设置polynominal多项式的值=7,就是这个寄存器的默认值

参考

  1. CRC校验码详解、常见算法实现及代码实例
  2. CRC校验计算网站:www.ip33.com
  3. STM32CubeMX工具配置SPI的CRC时数字和表达式转换
相关推荐
文军的烹饪实验室2 小时前
处理器架构、单片机、芯片、光刻机之间的关系
单片机·嵌入式硬件·架构
Leiditech__3 小时前
人工智能时代电子机器人静电问题及电路设计防范措施
人工智能·嵌入式硬件·机器人·硬件工程
jmlinux3 小时前
STM32 HAL库USART串口DMA IDLE中断编程:避坑指南
stm32·单片机·嵌入式硬件
沐欣工作室_lvyiyi5 小时前
基于单片机的智能电表设计(论文+源码)
单片机·嵌入式硬件·电能表·数字电能表
半导体老登5 小时前
新能源汽车核心元件揭秘:二极管、三极管结构与工作原理解析(2/2)
人工智能·单片机·嵌入式硬件·汽车
【云轩】6 小时前
基于STM32与BD623x的电机控制实战——从零搭建无人机/机器人驱动系统
stm32·机器人·无人机
猿~~~7 小时前
STM32的HAL库开发---多通道ADC采集(DMA读取)实验
stm32·单片机·嵌入式硬件
Freak嵌入式8 小时前
开源一款I2C电机驱动扩展板-FreakStudio多米诺系列
嵌入式硬件·嵌入式·智能硬件·开源硬件·micropython·电机驱动·电子模块
kongba0079 小时前
Cursor提示词模板,开发GD32,C语言开发GD32 ARM单片机编程规范提示词 大厂风格代码规范
c语言·arm开发·单片机
LaoZhangGong12310 小时前
STM32的“Unique device ID“能否修改?
c语言·经验分享·stm32·单片机·嵌入式硬件