CRC8校验分析

 

CRC循环冗余校验码Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

     CRC校验可以简单地描述为:例如我们要发送一些数据(信息字段),为了避免一些干扰以及在接收端的对读取的数据进行判断是否接受的是真实的数据,这时我们就要加上校验数据(即CRC校验码),来判断接收的数据是否正确。在发送端,根据要传送的k位二进制码序列,以一定的规则(CRC校验有不同的规则。这个规则,在差错控制理论中称为生成多项式。)产生一个校验用的r位校验码(CRC),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则(即与发送时生成CRC校验码相同的规则)进行检验,校验采用计算机的模二除法,即除数和被除数(即生成多项式)做异或运算,进行异或运算时除数和被除数最高位对齐,进行按位异或运算,若最终的数据能被除尽,则传输正确;否则,传输错误。

     CRC8即最终生成的CRC校验码为1字节,其生成多项式,生成多项式为g(x)=x8+x5+x4+1相当于g(x=1·x8+0·x7+0·x6+1·x5+1·x4+0·x3+0·x2+0·x1+1·x0,即对应的二进制数为100110001

    CRC8校验算法:

     1.CRC8校验的一般性算法:

        例如:  信息字段代码为: 00000001 00000010         ————    对应m(x)=x8+x

                   生成多项式为:g(x)=x8+x5+x4+1                 ————    对应g(x)的二进制代码为:100110001

        现在我们将要对2字节数据0x0102生成CRC8校验码,并最终将生成的1字节CRC校验码跟在0x0102的后面,即 0x01 02 ##,(##8CRC码),最终生成的3字节数据就是经CRC8校验生成的数据。

        先计算x8m(x)=x16+x9,对应的2进制数为:100000010 00000000  。可以看到这样运算所得到的结果其实就是将信息字段代码的数左移8位。因为最终要将生成的8CRC8校验码附在信息字段的后面,所以要将信息字段的数左移8位。最后用x8m(x)得到的二进制数对生成多项式g(x)进行模二运算,最终的余数(其二进制数的位数一定比生成多项式g(x)的位数小)就是所要的CRC8校验码。

(差与被除数高位对齐)

       100000010 00000000

    ^ 100110001 

  ---------------------------

       000110011 00000000

    ^      100110 001

  ---------------------------

            010101  00100000

     ^          10011 0001

  ---------------------------

              00110 00110000

    ^           100 110001

  ---------------------------

                 010 11110100

    ^            10 0110001

  ---------------------------

                   00 10010110

       x8m(x)做模二运算取余得100101100x96),这个8位的二进制数就是CRC8校验码。所以,经CRC8校验后研发送的数据就是0x010296          

  for (_bit = 8; _bit > 0; --_bit)
  {
     if (crc & 0x80)
     {
       crc = (crc << 1) ^ 0x0131;(所有多项式的最高位都为1,所以左移1位)
     }
      else
      {
       crc = (crc << 1);
      }
  }

CRC examples
 
The input message 11011100 (0xDC) will have as result 01111001 (0x79).
 
The input message 01101000 00111010 () will have as result 01111100 (0x7C).
 
The input message 01001110 10000101 () will have as result 01101011 (0x6B).

    

    2.CRC8校验在DS18B20中的应用:

      以上分析的是常规的CRC8校验方法。在DS18B20中,有两处用到CRC。一是DS18B208字节的序列号,最后一字节是前面七个字节的CRC码,这是为了保证序列号的唯一性与正确性;另一个是在DS18B20内部9字节的高速温度存储器,其第9字节是前面8个字节的CRC校验码,这是为了温度数据传输的正确性。而在DS18B20中生成CRC码所用到的方法不同于常规生成算法,它采用的是逆序CRC信息单元编码算法,该CRC的生成是由DS18B20中的多项式寄存器通过其中所包含的移位寄存器以及异或门对输入该多项式寄存器的每一位二进制数做一定的运算所得到的CRC码(可以查看Maxim官网上DS18B20的应用笔记Note27,专门介绍DS18B20CRC详细生成过程)。在此列举两种DS18B20CRC校验的C程序。

      A.按位运算方法

       

[cpp] view plaincopyprint?

1.  /********************************************************/  

2.      /*DS18B20CRC8校验程序*/  

3.      /********************************************************/   

4.      uchar calcrc_1byte(uchar abyte)    

5.      {    

6.         uchar i,crc_1byte;     

7.         crc_1byte=0;                //设定crc_1byte初值为0   

8.         for(i = 0; i < 8; i++)    

9.          {    

10.        if(((crc_1byte^abyte)&0x01))    

11.           {    

12.             crc_1byte^=0x18;     

13.             crc_1byte>>=1;    

14.             crc_1byte|=0x80;    

15.            }          

16.         else     

17.            crc_1byte>>=1;   

18.         abyte>>=1;          

19.       }   

20.       return crc_1byte;   

21.  }   

22.  uchar calcrc_bytes(uchar *p,uchar len)  

23.  {  

24.   uchar crc=0;  

25.   while(len--) //len为总共要校验的字节数  

26.    {  

27.      crc=calcrc_1byte(crc^*p++);  

28.    }  

29.   return crc;  //若最终返回的crc0,则数据传输正确  

30.  }  

      B.查表法

        unsigned char crc_array[256] = {

                                                    0x00, 0x5e, 0xbc, 0xe2, 0x61, 0x3f, 0xdd, 0x83,
                                                    0xc2, 0x9c, 0x7e, 0x20, 0xa3, 0xfd, 0x1f, 0x41, 
                                                    0x9d, 0xc3, 0x21, 0x7f, 0xfc, 0xa2, 0x40, 0x1e,
                                                    0x5f, 0x01, 0xe3, 0xbd, 0x3e, 0x60, 0x82, 0xdc, 
                                                    0x23, 0x7d, 0x9f, 0xc1, 0x42, 0x1c, 0xfe, 0xa0,
                                                    0xe1, 0xbf, 0x5d, 0x03, 0x80, 0xde, 0x3c, 0x62, 
                                                    0xbe, 0xe0, 0x02, 0x5c, 0xdf, 0x81, 0x63, 0x3d,
                                                    0x7c, 0x22, 0xc0, 0x9e, 0x1d, 0x43, 0xa1, 0xff,
                                                    0x46, 0x18, 0xfa, 0xa4, 0x27, 0x79, 0x9b, 0xc5, 
                                                    0x84, 0xda, 0x38, 0x66, 0xe5, 0xbb, 0x59, 0x07,
                                                    0xdb, 0x85, 0x67, 0x39, 0xba, 0xe4, 0x06, 0x58,
                                                    0x19, 0x47, 0xa5, 0xfb, 0x78, 0x26, 0xc4, 0x9a,
                                                    0x65, 0x3b, 0xd9, 0x87, 0x04, 0x5a, 0xb8, 0xe6, 
                                                    0xa7, 0xf9, 0x1b, 0x45, 0xc6, 0x98, 0x7a, 0x24, 
                                                    0xf8, 0xa6, 0x44, 0x1a, 0x99, 0xc7, 0x25, 0x7b,
                                                    0x3a, 0x64, 0x86, 0xd8, 0x5b, 0x05, 0xe7, 0xb9, 
                                                    0x8c, 0xd2, 0x30, 0x6e, 0xed, 0xb3, 0x51, 0x0f, 
                                                    0x4e, 0x10, 0xf2, 0xac, 0x2f, 0x71, 0x93, 0xcd,
                                                    0x11, 0x4f, 0xad, 0xf3, 0x70, 0x2e, 0xcc, 0x92,
                                                    0xd3, 0x8d, 0x6f, 0x31, 0xb2, 0xec, 0x0e, 0x50, 
                                                    0xaf, 0xf1, 0x13, 0x4d, 0xce, 0x90, 0x72, 0x2c, 
                                                    0x6d, 0x33, 0xd1, 0x8f, 0x0c, 0x52, 0xb0, 0xee, 
                                                    0x32, 0x6c, 0x8e, 0xd0, 0x53, 0x0d, 0xef, 0xb1, 
                                                    0xf0, 0xae, 0x4c, 0x12, 0x91, 0xcf, 0x2d, 0x73, 
                                                    0xca, 0x94, 0x76, 0x28, 0xab, 0xf5, 0x17, 0x49,
                                                    0x08, 0x56, 0xb4, 0xea, 0x69, 0x37, 0xd5, 0x8b,
                                                    0x57, 0x09, 0xeb, 0xb5, 0x36, 0x68, 0x8a, 0xd4,
                                                    0x95, 0xcb, 0x29, 0x77, 0xf4, 0xaa, 0x48, 0x16, 
                                                    0xe9, 0xb7, 0x55, 0x0b, 0x88, 0xd6, 0x34, 0x6a, 
                                                    0x2b, 0x75, 0x97, 0xc9, 0x4a, 0x14, 0xf6, 0xa8, 
                                                    0x74, 0x2a, 0xc8, 0x96, 0x15, 0x4b, 0xa9, 0xf7,
                                                    0xb6, 0xe8, 0x0a, 0x54, 0xd7, 0x89, 0x6b, 0x35,
                                                    };
            unsigned char CRC8_Table(unsigned char *p, char counter)
            {
               unsigned char crc8 = 0;

               for( ; counter > 0; counter--)

                {
                   crc8 = CRC8Table[crc8^*p]; //
查表得到CRC
                   p++;
                }
              return crc8;

            }

       DS18B20 的两种校验 CRC 码的方法本质上都是一样的。查表法是对 0x00~0xff 256 个数依次生成与每一个数对应的 CRC 码所组合成的表,每次算一字节数据的 CRC 码不用经过 calcrc_1byte(uchar abyte) 这个函数对每个数据的最低位进行判断是 1 还是 0 ,而直接通过查表的方式直接提取出   crc8^*p CRC 码,其运行效率相对按位运算方法更高,但是查表法所列的表却很占空间。   
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: LabVIEW是一款图形化编程环境,可用于开发各种应用程序。CRC(循环冗余检验)是一种常用的数据校验方法,其中CRC-8是一种8位循环冗余检验。 在LabVIEW中,可以通过使用适当的函数和模块来实现CRC-8校验。下面是CRC-8校验的大致框图: 1. 输入数据:首先,在LabVIEW中设置输入的数据,这可以是一个字符串、数组或二进制数据。这些数据将被发送到CRC-8校验模块。 2. CRC-8生成多项式:定义CRC-8生成多项式,这是一个固定的值,用于生成8位CRC校验码。常见的CRC-8生成多项式有0x07和0x8C。 3. 初始化CRC寄存器:在进行CRC计算之前,需要将CRC寄存器的初始值设置为0xFF。 4. CRC计算循环:使用循环结构,在每个循环中对输入数据进行处理。首先,将每个输入字节与CRC寄存器的值进行异或操作,然后将结果与生成多项式进行异或。这一步将更新CRC寄存器的值。 5. 是否还有更多的数据:在每个循环后,检查是否还有更多的数据需要处理。如果还有,返回到第4步;否则,进入下一步。 6. 最终CRC校验码:当所有的数据都被处理后,最终的CRC校验码将保存在CRC寄存器中。 7. 输出结果:将最终的CRC校验码输出为一个整数、二进制串或十六进制串,以便进行进一步的分析或发送给其他设备。 以上是LabVIEW中实现CRC-8校验的大致框图。开发者可以根据具体需求和实际情况进行更详细的设计和实现。LabVIEW提供了一系列的函数和工具,使得CRC校验的实现相对简单并且灵活。 ### 回答2: LabVIEW CRC8校验框图可以用以下方式实现。 首先,我们需要一个输入字节的注册表,注册表的位数为8位。使用一个包含8个元素的布尔型一维数组来表示寄存器。 接下来,我们需要一个CRC多项式,用于生成校验码。CRC多项式通常是一个二进制数,比如0x07。我们可以使用一个8位元素的布尔型一维数组来表示CRC多项式。 然后,我们将输入字节与寄存器的最高位进行异或运算,并将结果存储在一个临时变量中。 接下来,我们将寄存器的每一位向右移动一位,并将临时变量放入寄存器最低位。 然后,我们检查寄存器的最高位是否为1,如果是,则进行下一步操作。 我们需要将CRC多项式与寄存器进行异或运算,并将结果存储在寄存器中。 然后,我们重复以上步骤,直到处理完所有字节。 最后,我们将寄存器的值作为校验码输出。 这个LabVIEW CRC8校验框图的基本原理就是按照CRC多项式生成校验码的步骤进行计算,并将结果存储在寄存器中。整个过程可以使用循环结构来实现,以便处理多个字节的输入数据。 ### 回答3: 在LabVIEW中使用CRC8进行校验的过程可以通过以下步骤来实现: 首先,生成CRC8多项式的查找表。通过计算并存储每个可能输入值的输出CRC8校验值,以便在实际校验时使用。 然后,将要校验的数据输入到一个循环中。循环会逐个读取数据的每个字节,并将其作为输入传递给CRC8校验模块。 在CRC8校验模块中,首先需要初始化CRC8校验值。这可以通过将一个预定义的初始值加载到一个变量中来实现。 随后,循环中的每个字节都会被逐个输入到CRC8校验模块中。在每个循环迭代中,校验模块将当前的CRC8校验值与当前输入字节进行异或运算。 接下来,利用CRC8多项式查找表,将校验模块的输出与该字节的所有可能值进行查找,并加载相应的CRC8校验值。 最后,将输出的CRC8校验值与预期的校验值进行比较,以判断输入数据的完整性和准确性。 整个过程的框图可以如下所示: _____________ | | Data ----->| 循环开始 |-----> CRC8校验模块 ----->| 比较校验值 | |_____________| | ↓ CRC8多项式查找表 这个框图说明了在LabVIEW中使用CRC8进行校验的基本过程。通过逐个字节输入数据,并在校验模块中进行异或运算和查找,可以计算出输入数据的CRC8校验值,并与预期值进行比较,以验证数据的正确性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值