对于 CRC 校验的 学习笔记

如何用CRC模型来确定需求 UML软件工程组织 北京火龙果软件工程技术中心 如何用CRC模型来确定需求 作者:♀泓峥萧瑟♂ 转摘自51CMM.COM CRC(Class-Responsibility-Collaborator)卡建模是一种简单且有效的面向对象的分析技术。在一个OO(面向对象)开发项目中,包括用户、系统分析员和开发者在建模和设计过程中经常应用CRC卡建模,使整个开发团队普遍的理 阅读详情

参考资料

CRC校验原理及实现 - 知乎 (zhihu.com) <-- 这个讲的特别好,我的博客主要是抄他的,最后加了一点代码库的分析。

[CRC校验]手算与直观演示_哔哩哔哩_bilibili <-- 这个视频非常直观

【FPGA】CRC校验算法从数学原理到代码实现

CRC 参数模型

同样的 CRC 多项式,调用不同的 CRC 计算函数,得到的结果却不一样,这就涉及到 CRC 的参数模型了。计算一个正确的 CRC 值,需要知道 CRC 的参数模型。

一个完整的 CRC 参数模型应该包含以下信息:WIDTH,POLY,INIT,REFIN,REFOUT,XOROUT。

  • NAME:参数模型名称。
  • WIDTH:宽度,即生成的 CRC 数据位宽,如 CRC-8,生成的 CRC 为8位
  • POLY:十六进制多项式,省略最高位1,如 x8 + x2 + x + 1,二进制为1 0000 0111,省略最高位1,转换为十六进制为 0x07。
  • INIT:CRC初始值,和WIDTH位宽一致。
  • REFIN:true 或 false,在进行计算之前,原始数据是否翻转,如原始数据:0x34 = 0011 0100,如果 REFIN 为 true,进行翻转之后为0010 1100 = 0x2c
  • REFOUT:true 或 false,运算完成之后,得到的 CRC 值是否进行翻转,如计算得到的 CRC 值:0x97 = 1001 0111,如果 REFOUT 为 true,进行翻转之后为 11101001 = 0xE9。
  • XOROUT:计算结果与此参数进行异或运算后得到最终的 CRC 值,和 WIDTH 位宽一致。

通常如果只给了一个多项式,其他的没有说明则:INIT=0x00,REFIN=false,REFOUT=false,XOROUT=0x00。

常用的21个标准CRC参数模型:

21个常见的CRC校验表

CRC校验在电子通信领域非常常用,可以说有通信存在的地方,就有CRC校验:

  • 美信(MAXIM)的芯片DS2401/DS18B20,都是使用的CRC-8/MAXIM模型
  • SD卡或MMC使用的是CRC-7/MMC模型
  • Modbus通信使用的是CRC-16/MODBUS参数模型
  • USB协议中使用的CRC-5/USB和CRC-16/USB模型
  • STM32自带的硬件CRC计算模块使用的是CRC-32模型

至于多项式的选择,初始值和异或值的选择,输入输出是否翻转,这就涉及到一定的编码和数学知识了。感兴趣的朋友,可以了解一下每个CRC模型各个参数的来源。至于每种参数模型的检错能力、重复率,需要专业的数学计算了,不在本文讨论的范畴内。

对于 发送 和 接收 两方的约定

  1. 共同的约定
    • 要传输的数据的原始数据:比如8‘b10101001
    • 生成多项式
  2. 发送方要做的事(编码)
    • 准备要传输的原始数据
    • 根据 原始数据 和 生成多项式 生成 原始数据对应的 CRC
    • 生成新数据({原始数据,CRC})
  3. 接收方要做的事(解码)
    • 接收发送方发送过来的新数据
    • 根据新数据和约定好的生成多项式做校验
    • 根据校验结果接收原始数据

CRC 计算

问:原始数据:0x34,使用CRC-8/MAXIN参数模型,求CRC值?

答:根据CRC参数模型表,得到CRC-8/MAXIN的参数如下:

POLY = 0x31 = 0011 0001(最高位1已经省略)
INIT = 0x00
XOROUT = 0x00
REFIN = TRUE
REFOUT = TRUE

有了上面的参数,这样计算条件才算完整,下面来实际计算:

0.原始数据 = 0x34 = 0011 0100,多项式 = 0x31 = 1 0011 0001
1.INIT = 00,原始数据高8位和初始值进行异或运算保持不变。
2.REFIN为TRUE,需要先对原始数据进行翻转:0011 0100 > 0010 1100
3.原始数据左移8位,即后面补8个0:0010 1100 0000 0000
4.把处理之后的数据和多项式进行模2除法,求得余数:
原始数据:0010 1100 0000 0000 = 10 1100 0000 0000
多项式:1 0011 0001
模2除法取余数低8位:1111 1011
5.与XOROUT进行异或,1111 1011 xor 0000 0000 = 1111 1011 
6.因为REFOUT为TRUE,对结果进行翻转得到最终的CRC-8值:1101 1111 = 0xDF
7.数据+CRC:0011 0100 1101 1111 = 34DF,相当于原始数据左移8位+余数。

模2除法求余数:

crc计算

验证手算结果:

计算

可以看出是一致的,当你手算的结果和工具计算结果不一致时,可以看看INIT,XOROUT,REFINT,REFOUT这些参数是否一致,有1个参数不对,计算出的 CRC 结果都不一样。

CRC 校验

按照上面 CRC 计算的结果,最终的数据帧:0011 0100 1101 1111 = 34DF,前8位0011 0100是原始数据,后8位1101 1111 是 CRC 结果。

接收端的校验有两种方式,

  1. 一种是和 CRC 计算一样,在本地把接收到的数据和 CRC 分离,然后在本地对数据进行 CRC 运算,得到的 CRC 值和接收到的 CRC 进行比较,如果一致,说明数据接收正确,如果不一致,说明数据有错误。
  2. 另一种方法是把整个数据帧进行 CRC 运算,因为是数据帧相当于把原始数据左移8位,然后加上余数,如果直接对整个数据帧进行 CRC 运算(除以多项式),那么余数应该为0,如果不为0说明数据出错。

校验

而且,不同位出错,余数也不同,可以证明,余数与出错位数的对应关系只与CRC参数模型有关,而与原始数据无关。

CRC 计算的 C 语言实现

无论是用C还是其他语言,实现方法网上很多,这里我找了一个基于C语言的CRC计算库,里面包含了常用的21个CRC参数模型计算函数,可以直接使用,只有crcLib.c和crcLib.h两个文件。

GitHub地址:https://github.com/whik/crc-lib-c

使用方法非常简单:

#include <stdio.h>
#include <stdlib.h>
#include "crcLib.h"

int main()
{
    uint8_t LENGTH = 10;
    uint8_t data[LENGTH];
    uint8_t crc;

    for(int i = 0; i < LENGTH; i++)
    {
        data[i] = i*5;
        printf("%02x ", data[i]);
    }
    printf("\n");

    crc = crc8_maxim(data, LENGTH);

    printf("CRC-8/MAXIM:%02x\n", crc);
    return 0;
}

计算结果:

img

CRC 库代码分析

库中crc函数基本相似,一通百通。

/******************************************************************************
 * Name:    CRC-7/MMC           x7+x3+1
 * Poly:    0x09
 * Init:    0x00
 * Refin:   False
 * Refout:  False
 * Xorout:  0x00
 * Use:     MultiMediaCard,SD,ect.
 *****************************************************************************/
uint8_t crc7_mmc(uint8_t *data, uint16_t length)
{
    uint8_t i;
    // 这里的初值为 Init = 0x00
    uint8_t crc = 0;        // Initial value
    while(length--)
    {
        // 第一次进来,crc = 0,异或上任意值,crc = 任意值
        // 后续数据进行异或,因为前一次数据的后7位补0,相当于异或上这些0,就是把数据加到上次的数据末尾
        // 最后一个数据加在末尾后,在下面的for循环,把后面的7个零补回来了。
        crc ^= *data++;        // crc ^= *data; data++;

        for ( i = 0; i < 8; i++ )
        {
            // 判断这个高位是否是 1,最高位为 1 时才可异或上多项式
            if ( crc & 0x80 )
                // 因为最高位为一,异或上注定为0,直接省去计算
                crc = (crc << 1) ^ 0x12;        // 0x12 = 0x09<<(8-7)
            else
                crc <<= 1;
        }
    }
    // 因为是 7位宽的,而在循环中多向左移动了一位,再移动回来即可。
    return crc >> 1;
}

CRC 计算工具

下面这几款工具都可以自定义CRC算法模型,而且都有标准CRC模型可供选择。如果自己用C语言或者Verilog实现校验算法时,非常适合作为标准答案进行验证。

格西CRC计算器:

img

总结

CRC校验并不能100%的检查出数据的错误,非常低的概率会出现CRC校验正确但数据中有错误位的情况。这和CRC的位数,多项式的选择等等有很大的关系,所以在实际使用中尽量选择标准CRC参数模型,这些多项式参数都是经过理论计算得出的,可以提高CRC的检错能力。CRC校验可以检错,也可以纠正单一比特的错误,你知道纠错的原理吗?

【IC设计】CRC(循环冗余校验) 在第一段代码中,LFSR(线性反馈移位寄存器)的计算是在 always @(*) 块内部进行的。这里使用了组合逻辑的方式,并不受时钟信号的影响,因此是在数据信号变化时立即触发的,是并行计算的。每次数据信号 data_in 变化时,都会立即计算出 lfsr_c 寄存器的值,不需要等待时钟信号的上升沿。因此,LFSR 寄存器的更新是在数据信号变化时立即完成的,是并行计算的。在第二段代码中,next_crc 函数是在 always @(posedge clk) 块内部被调用的,因此它的。 阅读详情

相关推荐

STM32F4学习笔记11——CRC循环冗余校验

关于CRC校验有以下几个方面 1.模2除(也就是异或)。 2.多项式与二进制关系(x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0,x的最高幂次为R,转换成对应的二进制数有R+1位。)。CRC基本原理 循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K

z312811966的博客 9466

CRC校验及C语言实现

摘自:CRC校验原理及其C语言实现 地址:https://blog.youkuaiyun.com/whik1194/article/details/108837493?spm=1001.2014.3001.5502

zhuguanlin121的博客 9838

ModBus CRC16校验码学习笔记(附手稿)

ModBus CRC16校验码学习笔记(附手稿) 学习背景 最近在玩轮毂电机的驱动控制,该电机配套的驱动器可以使用485或者CAN总线协议。该电机的485通信协议的报文中最后两个字节按照某宝卖家的意思是使用的Modbus CRC16校验的方式得来的。后面需要使用程序来计算,在百度之后了解了Modbus CRC16校验码的计算方式,并进行推算,这里我把我的学习过程记录于此,一是作个备忘,二是希望它能帮助有需要的人。 ModBus CRC16校验码 CRC16简单介绍 CRC全称是Cyclic Redundan

nobody_ji的博客 5133

CRC常用参数模型及C#代码实现

目录 参数模型 算法实现 CRC-32 CRC-32/MPEG-2 表生成算法 参考资料 本文源码 参数模型# CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。 CRC算法参数模型解释: NAME:参数模型名称。

HappyMrSpring 2157

【AI智能体】Coze 搭建个人旅游规划助手实战详解

本文将详细介绍如何使用Coze平台搭建个人旅游规划助手。首先概述了AI智能体如何简化传统复杂任务的开发流程,然后重点介绍了Coze工作流的作用和核心节点类型(包括大模型、插件、知识库等)。通过实际操作演示,从创建智能体到配置多级工作流,逐步实现旅游规划功能:解析用户输入时间地点、查询必玩景点、获取景点详细信息等。该教程展示了如何利用Coze的可视化编排能力,即使非技术人员也能快速构建专业级AI应用。最终呈现的旅游助手可提供天气查询、行程建议等一站式服务。

Hello, New World! 2113

CMOS 半加器和全加器&&数字集成电路&& Cadence Virtuoso

数字集成电路——半加器和全加器

计科小学生的博客 1万+

CRC校验原理全面解读

本文对CRC校验进行了简单介绍,同时对CRC校验码的生成进行了较为详细的解读。

weixin_43719763的博客 1万+

5090D显卡安装LLaMA-Factory避坑指南:PyTorch与CUDA版本兼容性问题解决

本文是针对5090D显卡安装LLaMA-Factory时遇到的PyTorch与CUDA版本兼容性问题的详细解决指南。文章深入剖析了因GPU架构代际差异导致的“no kernel image”报错根源,并提供了从环境诊断、安装匹配的PyTorch Nightly版本,到最终集成验证的完整路径,帮助用户确保LLaMA-Factory在5090D上稳定运行。

Apple的专栏 868

CRC校验码学习笔记

一、CRC校验的作用 CRC:循环冗余校验码,是数据通信领域中最常用的一种查错校验码,它的优点是信息字段和校验字段的长度可以任意选定。使用CRC的方法是,在数据传输前计算信息字段的CRC,将其作为校验字段附在帧尾一同传输;接收方执行类似的算法,将计算结果与校验字段比较;一致则说明数据传输的正确、完整,不一致说明传输错误。 CRC不是纠错码,它只能用于检查错误。如果发现CRC出错,并不能找出错误的位置予以纠正,只能重发或丢弃。 二、CRC校验的原理 计算CRC的算法是,用一个特...

qq_43149249的博客 5405

5G NR 物理层 流程一:从帧结构到TB块,PDSCH/PUSCH 资源映射与TBS计算实战

本文详细解析了5G NR物理层流程,从帧结构到TB块的计算,重点介绍了PDSCH/PUSCH资源映射与TBS计算的实战方法。通过具体案例和公式推导,帮助工程师掌握5G NR资源分配、MCS选择及TBS量化过程,解决实际部署中的常见问题。

weixin_30897233的博客 94

5款高性价比LDO芯片实测对比:从TPS7A4501到LM2940,哪款更适合你的项目?

本文通过实测对比了TPS7A4501、TPS72301、LM2937、LM2940等五款高性价比LDO芯片的核心性能。文章详细分析了跌落电压、输出噪声、静态电流及热性能等关键指标,并结合电池供电物联网节点、高精度数据采集等典型应用场景,提供了清晰的选型指南,帮助工程师根据项目需求选择最合适的LDO芯片。

weixin_29305337的博客 115

CRC校验学习笔记

CRC校验学习笔记 在两台设备传输过程中,如果对数据要求较高,需要高的准确性,那么校验是必不可少的。一般用到的校验方式有奇偶校验和CRC校验。 假设我们要用单片机和pc之间进行通信,每次数据不能出错,如果出错,那么这一帧数据直接无效,那么用什么方法可以检验其有效性? 假设数据为111010(数据段)+(校验位)。 下面就上述例子介绍CRC校验: 首先发送端要将数据进行打包处理。就上述而言,每次我们...

lobmo的博客 384

RockChip Android14 修改LCD背光最大值

在调试LCD屏时时长会出现硬件不匹配,导致电流过大,屏幕发热严重。在不调整硬件的情况下,我们可以通过修改软件,降低LCD背光最大值来实现适配。我们都知道LCD屏背光是靠pwm来控制,一般来说最大值可以设置为255,针对上述问题,我们可以通过软件来降低该值,比如200,100等等。

qq_34968572的博客 631

【CRC校验】学习笔记

1 #include<stdio.h> 2 3 unsigned char test[6]= 4 { 5 0x01,0x02,0x03,0x04,0x05,0x06 6 }; 7 8 static unsigned short ccitt_table[256] = { 9 0x0000, 0x1021, 0x2042, 0x3063, 0...

weixin_33860147的博客 123

STM32入门教程:智能储物柜控制

在这个例子中,我们将使用一个4x4的储物柜,共有16个储物格。我们了解了硬件准备、储物柜电路设计、STM32的基本配置、储物柜控制代码的编写以及测试和调试等方面的知识。根据我们的电路设计,我们需要将一些引脚配置为输出,并将其他引脚配置为输入。在本教程中,我们将使用STM32微控制器来实现一个基本的智能储物柜控制系统。在主函数中,我们将不断循环读取传感器数据,并根据数据的变化来控制储物柜的开关和显示相关信息。这个函数将读取人体感应传感器、温湿度传感器和光照传感器的数据,并将数据存储到相应的变量中。

m0_75244442的博客 660

电磁兼容(EMC):一文读懂过电应力(EOS)

过电应力(EOS)是指元器件承受的电流或电压应力超过其允许的最大范围。产品的电磁兼容(EMC)失效的一种常见模型为过电应力(EOS),也是电子产品失效的最常见的情况之一。过电应力基本与半导体器件相关,EOS事件包括有:静电放电(ESD)、雷击、系统瞬态、电磁脉冲、充电等。本文将详细讨论一下产品设计中如何关注EOS设计。

linkking27的博客 6485

数据校验学习笔记 ———— CRC数据检验

CRC(Cyclic Redundancy Check,循环冗余校验)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏,从而接受方接收到错误的数据。

永远的菜鸡小詹的博客 975

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

crc生成多项式怎么算_FPGA-CRC校验学习笔记

以太网帧需要对数据进行CRC校验,原理部分参考以下文章:https://blog.51cto.com/winda/1063951https://www.cnblogs.com/masonzhang/p/10261855.html以太网帧需要进行CRC32校验,FPGA开发一般使用的是CRC32_d4.v这个代码进行校验和的计算,输入数据是4比特,初始值是32’hffffffff,代码是组合逻辑实现...

weixin_36410316的博客 4035

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ESP32学习笔记-CRC16_Modbus校验

日拱一卒。

ssismm的博客 1450

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

CRC校验原理计算方法程序学习笔记

CRC-8校验是一种常用的数据传输检错方法,通过多项式计算生成校验码。其核心是模2除法运算,需预先确定一个二进制除数(多项式)。计算过程包括:将数据位补零后除以除数,得到的余数即为CRC校验码。例如,使用多项式X^8+X^2+X^1+1对0x1A计算时,经过补零和模2除法后得到校验码0x46。CRC校验能有效保证数据传输的完整性和正确性。

weixin_41226265的博客 1212

【学习笔记】CRC16校验程序并不完全通用

对不同的设备,CRC16校验码程序并不完全通用,其校验结果因初值而异。

m0_46476234的博客 108

学习笔记 - HADOOP中的CRC数据校验文件

概要 Hadoop系统为了保证数据的一致性,会对文件生成相应的校验文件(.crc文件),并在读写的时候进行校验,确保数据的准确性。在本地find -name *.crc hadoop比较适合做离线处理,这个是众所周知的,而且hdfs为了保证数据的一致性,每次写文件时,针对数据的io.bytes.per.checksum字节,都会创建一个单独的校验和。默认值为512字节,因为crc-32校验...

tianyeshiye 3414

计算机组成原理学习笔记第2章 2.5——CRC校验及其实现

计算机组成原理学习笔记第2章 2.5——CRC校验及其实现。希望这篇笔记能帮助到你我!

Code_流苏:在代码中寻诗意,在实践中觅真知 1833

嵌入式linux学习笔记--lua技术整理--基于lua版本的crc8校验

CRC8校验 CRC-8 x8+x2+x1+1 0x07(0x107) 最近做一款产品生态配件开发用到了crc8的校验,现在将demo贴出。 例子中使用的是别人算好的crc 数组进行计算的,效率估计会更高一些。 第一个函数是用于计算crc8的值,第二个函数是对整个table的结果进行校验,会先删除掉最后的crc值 然后计算crc并且和被删除的crc进行比较,如果返回原来的table则证明 crc校验通过,否则crc 校验不通过。 -- caculate crc8 : x

jeason的博客 1727

CRC32算法学习笔记以及如何用java实现(一)

CRC32算法学习笔记以及如何用java实现(一)

hfdhjjj的博客 1418
上一篇: Keil Debug 逻辑分析仪使用
下一篇: luatOS网站 lua语言学习 练习题
嵌入一下?
博客等级 码龄6年 324粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入一下?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值