0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CRC循环冗余校验简介

CHANBAEK 来源:硬件工程师技术干货 作者:硬件工程师技术干 2023-04-24 13:04 次阅读

1、CRC简介

CRC 是Cyclic Redundancy Check的缩写,循环冗余校验,用于校验数据传输的完整性。 一般情况下在数据发送前计算CRC校验值,附在发送数据之后,数据接收方也按照同样方法计算CRC,然后对比计算结果,如果一致说明数据数据传输无误,否则数据传输出错。

2、什么是模二运算

CRC计算采用二进制模二除法,来解释一下模二运算,模二运算忽略进位和借位,下面一一解释。

1)模二加法,类似异或运算

1+1=0 0+0=0

1+0=1 0+1=1

2)模二减法,类似异或运算

1-1=0 0-0=0

1-0=1 0-1=1

3)模二乘法

1×1=1 0×0=0

1×0=0 0×1=0

4)模二除法

模二除法和十进制除法类似,运用了模二乘法和模二减法,直接举例说明。

3、常见CRC模型如下:

不同的多项式计算方法不同,下面以CRC-5/EPC举例说明:

多项式公式 :x5 + x3 + 1

完整写出来是x5 + 0x4 + x3 + 0x2 + 0*x + 1

多项式 :取以上多项式中的系数101001为多项式,一般最高位不写出来,所以多项式是01001,即0x09

初始值 :运算的初始值,EPC要求是0x09

结果异或值 :所有数据计算完的结果与其异或,EPC这里是0

输入反转 :输入数据每字节高低位是否翻转,EPC不翻转。

输出反转 :输出结果高低位是否翻转,EPC不翻转。

4、手撕CRC

仍然以CRC-5/EPC举例,计算字节0xAA的CRC值,这是一个5位的CRC,使用模二除法,最终计算出5位CRC校验值。 被除数是0xAA,二进制10101010,除数是多项式,即101001。 计算过程如下图所示,为了表明计算过程把商为0的计算过程也写出来了。 这是5位CRC,只取最后5位,即10000。 输出结果不需要异或也不需要反转,所以10000就是计算结果。

两个字节AA55的CRC计算过程,同样为了表明计算过程把商为0的计算过程也写出来了。 这是5位CRC,只取最后5位,即01000。 输出结果不需要异或也不需要反转,所以01000就是计算结果。

再举一个例子,仍然计算0xAA的CRC。 这次采用模型CRC-5/USB,多项式:x5+x2+1,输入输出数据都反转,多项式0x05,初始值为0x1F,输出异或值为0x1F。 最终计算结果00111。

5、C语言实现

以下是CRC-5/EPC的C语言实现代码:

/*
 * Name:    CRC-5/EPC   x5+x3+1
 * Poly:    0x09
 * Init:    0x09
 * Refin:   False
 * Refout:  False
 * Xorout:  0x00
 * Note:
*/
uint8_t crc5_epc(uint8_t *data, uint16_t length)
{
    uint8_t i;

    //初始值是0x09的低5位,要和输入数据的高五位异或
    //所以0x09左移三位,00001001<<3 = 01001000 = 0x48
    uint8_t crc = 0x48;
    while(length--)
    {
        crc ^= *data++;        //异或第一个字节
        for ( i = 0; i < 8; i++ )
        {
            if ( crc & 0x80 )
            {
                //最高位是1,需要异或多项式,多项式是最高位为1的6bit
                //多项式异或后最高位为0,所以这里不异或最高位了,他肯定是0
                //直接把crc左移1位,去掉最高位,然后异或多项式的低5bit
                //多项式是0x09<<3 = 00001001<<3 = 01001000 = 0x48
                crc = (crc << 1) ^ 0x48;        // 0x48 = 0x09<<(8-5)
            }
            else
            {
                //最高位是0,所以商为0,可以省去运算,见上面图表,因为和0异或值不变。
                crc <<= 1;
            }

        }
    }
    return crc >> 3;    //计算完成后结果在高5位,右移动3位。
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据传输
    +关注

    关注

    9

    文章

    1530

    浏览量

    63567
  • 二进制
    +关注

    关注

    2

    文章

    707

    浏览量

    41250
  • crc
    crc
    +关注

    关注

    0

    文章

    191

    浏览量

    29195
  • 运算
    +关注

    关注

    0

    文章

    125

    浏览量

    25669
  • 循环冗余校验

    关注

    0

    文章

    7

    浏览量

    6495
收藏 人收藏

    评论

    相关推荐

    labview DAQ----MODBUS CRC16循环冗余校验

    说明:CRC循环冗余错误校验计算方法 CRC—16(循环冗余
    发表于 11-07 10:46

    PSoC 4 循环冗余校验 (CRC)

    循环冗余校验 (CRC) 组件的默认用途是根据任意长度的串行比特流计算 CRC。在数据时钟的上升沿上对输入数据进行采样。在启动前,
    发表于 07-04 11:30

    CRC循环冗余校验的算法

    想问下51单片机和所有嵌入式中一个很基本也很常见的问题,CRC循环冗余校验的算法中生成多项式为什么要那样取(有个生成多项式的表格),如果信息段中一位或多位传输错误,
    发表于 01-21 21:02

    转:循环冗余校验CRC)算法入门引导

    写给嵌入式程序员的循环冗余校验CRC)算法入门引导前言CRC校验
    发表于 08-01 18:32

    循环冗余校验CRC)算法入门引导

    循环冗余校验CRC)算法入门引导
    发表于 08-17 12:40

    如何利用循环冗余校验CRC)计算单元进行传输数据的校验

    循环冗余校验CRC)计算单元是什么?如何利用循环冗余校验
    发表于 12-15 06:04

    循环冗余校验码的单片机及CPLD 实现

    循环冗余校验(CRC)是一种可靠性很高的串行数据校验方法。介绍循环
    发表于 04-16 14:19 16次下载

    循环冗余校验码---CRC

    循环冗余校验码---CRC码   二进制信息位串沿一条信号线逐位在部件之间或计算机之间传送称为串行传送。CRC(Cyclic Redund
    发表于 10-13 16:52 6994次阅读
    <b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>码---<b class='flag-5'>CRC</b>码

    基于FPGA的循环冗余校验实验系统

    文章首先分析了循环冗余校验码的功能,在此基础上提出了基于FPGA的实现方法,详细阐述了CRC校验编解码的实现方法,并提出了基于现有的实验箱设
    发表于 03-26 13:52 1600次阅读
    基于FPGA的<b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>实验系统

    STM32L4循环冗余校验模块(CRC)介绍

    STM32L4循环冗余校验模块(CRC)介绍 有兴趣的可以参考下
    发表于 12-25 10:38 27次下载

    循环冗余校验奇偶校验累加和校验等知识分享

    CRC校验循环冗余校验)是数据通讯中最常采用的校验方式。在嵌入式软件开发中,经常要用到
    的头像 发表于 11-08 09:31 8487次阅读
    <b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>奇偶<b class='flag-5'>校验</b>累加和<b class='flag-5'>校验</b>等知识分享

    crc循环冗余校验码算法

     循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散
    发表于 12-04 10:11 2.2w次阅读
    <b class='flag-5'>crc</b><b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>码算法

    PIC24F系列参考手册之可编程循环冗余校验CRC

    本文主要介绍了PIC24F系列参考手册之可编程循环冗余校验CRC)。
    发表于 06-25 03:20 0次下载
    PIC24F系列参考手册之可编程<b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>(<b class='flag-5'>CRC</b>)

    PIC32系列中文参考手册—第60章 32位可编程循环冗余校验CRC

    PIC32系列中文参考手册—第60章 32位可编程循环冗余校验CRC
    发表于 05-25 17:29 4次下载

    32位可编程循环冗余校验(CRC)

    电子发烧友网站提供《32位可编程循环冗余校验(CRC).pdf》资料免费下载
    发表于 09-25 11:22 0次下载
    32位可编程<b class='flag-5'>循环</b><b class='flag-5'>冗余</b><b class='flag-5'>校验</b>(<b class='flag-5'>CRC</b>)