CRC校验

///---------------------------------------------------------------------------------------
//计算Xmodem shifts the MSB of the CRC and the input first, while CCITT
//shifts the LSB of the CRC and the input first
uint16_t crc_ccitt_update (uint16_t crc, uint8_t data)
{
data ^= (uint8_t) (crc);
data ^= data << 4;
return ((((uint16_t)data << 8) | (uint8_t) (crc>>8)) ^ (uint8_t)(data >> 4)
^ ((uint16_t)data << 3));
}

unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
unit16_t crc = 0xFFFF;
void test(void)
{
    register uint8_t i;
    for(i = 0; i < sizeof(Table); i++)
    crc = crc_ccitt_update(crc, Table[i]);  //求出crc = 0x8A62
}
-----------------------------------------------------------------------------------------------
//查表
/****下表是常用ccitt 16,生成式1021反转成8408后的查询表格****/
unsigned short crc16_ccitt_table[256] =
{
0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
};
/*****CRC计算函数,可将第一个参数reg_init简化掉********/
unsigned short do_crc(unsigned short reg_init, unsigned char *message, unsigned int len)
{
    unsigned short crc_reg = reg_init;
        
    while (len--)
        crc_reg = (crc_reg >> 8) ^ crc16_ccitt_table[(crc_reg ^ *message++) & 0xff];
      
    return crc_reg;
}

unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
unit16_t crc = 0xFFFF;
void test(void)
{
    crc = do_crc(crc, Table, sizeof(Table));  //求出crc = 0x8A62
}
==============================================================================================
/法2查表加计算
unsigned int crc_ta[16]={ 
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
};

unsigned int Crc16(unsigned char *ptr, unsigned char len) 
{
unsigned int crc = 0x0000;
unsigned char da;

crc=0;
while(len--!=0)
 {
   da=crc>>12; 
   crc<<=4; 
   crc^=crc_ta[da^(*ptr/16)]; 
                              
   da=crc>>12; 
   crc<<=4; 
   crc^=crc_ta[da^(*ptr&0x0f)]; 
   ptr++;
}
return(crc);
}
unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
unit16_t crc = 0xFFFF;

void test(void)
{
    crc = Crc16(Table, sizeof(Table));  //求出crc = 0xB136
}
==========================================================================================
法3查表
unsigned int Table_CRC[256]={ // CRC余式表
        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};


unsigned int CRC_16_NEW( unsigned char * aData, unsigned int aSize )
{
    unsigned char  uintTmp;
 unsigned int i;
    unsigned int uintTmp1;
    unsigned int nAccum = 0X0000;

//    BuildTable16( cnCRC_16 ); //  or cnCRC_CCITT
    for ( i = 0; i < aSize; i++ ){
 uintTmp  = ( nAccum >> 8 );
 uintTmp ^= (*aData);
 uintTmp1 = ( nAccum << 8 );
        nAccum   = (uintTmp1 ^ Table_CRC[uintTmp]);
 aData++;
    }
    return nAccum;
}

unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
unit16_t crc = 0xFFFF;

void test(void)
{
    crc = CRC_16_NEW(Table, sizeof(Table));  //求出crc = 0xB136
}

-------------------------------------------------------------------------------------------------------------
法四
uint16_t Table_CRC[256];
#define cnCRC_16  0x1021
void BuildTable16( unsigned int aPoly )
{
    unsigned int i, j;
    unsigned int nData;
    unsigned int nAccum;

    for ( i = 0; i < 256; i++ )
    {
     asm("wdr");
        nData = ( unsigned int )( i << 8 );
        nAccum = 0;
        for ( j = 0; j < 8; j++ )
        {
            if ( ( nData ^ nAccum ) & 0x8000 )  //如果数据的最高位1
               nAccum = (( nAccum << 1 ) ^ aPoly);//CRC左移1位,
            else
                nAccum <<= 1;
            nData <<= 1;
        }
        Table_CRC[i] = ( unsigned long )nAccum;

   }
}
unsigned int CRC_16_NEW( unsigned char * aData, unsigned int aSize )
{
    unsigned char  uintTmp;
 unsigned int i;
    unsigned int uintTmp1;
    unsigned int nAccum = 0X0000;
   BuildTable16( cnCRC_16 ); //  or cnCRC_CCITT
    for ( i = 0; i < aSize; i++ ){
 uintTmp  = ( nAccum >> 8 );
 uintTmp ^= (*aData);
 uintTmp1 = ( nAccum << 8 );
        nAccum   = (uintTmp1 ^ Table_CRC[uintTmp]);
 aData++;
    }
    return nAccum;
}

unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
unit16_t crc = 0x0000;

void test(void)
{
   
    crc = CRC_16_NEW(Table, sizeof(Table));  //求出crc = 0xB136
}
/--------------------------------------------------------------------------------------------
uint16_t crc_xmodem_update (uint16_t crc, uint8_t data)
{
int i;
crc = crc ^ ((uint16_t)data << 8);
for (i=0; i<8; i++)
{
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
return crc;
}
unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
unit16_t crc = 0x0000;

void Test(void)
{
     register uint8_t i;
     crcWord = 0xFFFF;
    for(i = 0; i < sizeof(Table); i++)
    {
       crcWord = crc16_update(crcWord, Table[i]);   crcWord = 0xB136
    }
}
---------------------------------------------------------------------------------------------
unsigned int cal_crc(unsigned char *ptr, unsigned char len) 

    unsigned char i; 
    unsigned int crc=0; 
    while(len--!=0) 
   {  
       for(i=0x80; i!=0; i/=2)
       { 
           if((crc&0x8000)!=0)
           {
               crc*=2; crc^=0x1021;
            } /* 余式CRC乘以2再求CRC */ 
           else
              crc*=2; 
           if((*ptr&i)!=0)
              crc^=0x1021; /* 再加上本位的CRC */ 
       } 
       ptr++; 
    } 
    return(crc); 
}
void test(void)
{
   
    crc = cal_crc(Table, sizeof(Table));  //求出crc = 0xB136
}
---------------------------------------------------------------------------------------------
uint16_t crc16_update(uint16_t crc, uint8_t a)
{
int i;
crc ^= a;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}
return crc;
}
unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
void Test(void)
{
     register uint8_t i;
     crcWord = 0xFFFF;
    for(i = 0; i < sizeof(Table); i++)
    {
       crcWord = crc16_update(crcWord, Table[i]);   crcWord = 0x1F86
    }
}

//---------------------------------------------------------------------------------------------
unsigned char crc16hi, crc16lo;
void crc16(unsigned char r_data[],unsigned int length)
{
    unsigned char cl,ch;
    unsigned char savehi,savelo;
    int ii,flag;
    crc16hi=0xFF;
    crc16lo=0xFF;
    cl=0x1;
    ch=0xA0;
    for (ii=0;ii<length;ii++)
    {
        crc16lo=(crc16lo ^ r_data[ii]);
        for (flag=0;flag<8;flag++)
        {
            savehi=crc16hi;
            savelo=crc16lo;
            crc16hi=(crc16hi>>1);
            crc16lo=(crc16lo>>1);
            if ((savehi & 0x01)==0x01)
                    crc16lo=(crc16lo | 0x80);
            if ((savelo & 0x01)==0x01)
            {
                    crc16hi = (crc16hi ^ ch);
                    crc16lo = (crc16lo ^ cl);
            }        
        }
    }
}
unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
void Test(void)
{
         uint16_t crcWord = 0xFFFF;
       crc16_update(Table, sizeof(Table));   crchi = 0x1F; crclo = 0x86
  
}
--------------------------------------------------------------------------------------------
const unsigned int crctab[256]=
{
0x0000, 0xC1C0, 0x81C1, 0x4001, 0x01C3, 0xC003, 0x8002, 0x41C2,
0x01C6, 0xC006, 0x8007, 0x41C7, 0x0005, 0xC1C5, 0x81C4, 0x4004,
0x01CC, 0xC00C, 0x800D, 0x41CD, 0x000F, 0xC1CF, 0x81CE, 0x400E,
0x000A, 0xC1CA, 0x81CB, 0x400B, 0x01C9, 0xC009, 0x8008, 0x41C8,
0x01D8, 0xC018, 0x8019, 0x41D9, 0x001B, 0xC1DB, 0x81DA, 0x401A,
0x001E, 0xC1DE, 0x81DF, 0x401F, 0x01DD, 0xC01D, 0x801C, 0x41DC,
0x0014, 0xC1D4, 0x81D5, 0x4015, 0x01D7, 0xC017, 0x8016, 0x41D6,
0x01D2, 0xC012, 0x8013, 0x41D3, 0x0011, 0xC1D1, 0x81D0, 0x4010,
0x01F0, 0xC030, 0x8031, 0x41F1, 0x0033, 0xC1F3, 0x81F2, 0x4032,
0x0036, 0xC1F6, 0x81F7, 0x4037, 0x01F5, 0xC035, 0x8034, 0x41F4,
0x003C, 0xC1FC, 0x81FD, 0x403D, 0x01FF, 0xC03F, 0x803E, 0x41FE,
0x01FA, 0xC03A, 0x803B, 0x41FB, 0x0039, 0xC1F9, 0x81F8, 0x4038,
0x0028, 0xC1E8, 0x81E9, 0x4029, 0x01EB, 0xC02B, 0x802A, 0x41EA,
0x01EE, 0xC02E, 0x802F, 0x41EF, 0x002D, 0xC1ED, 0x81EC, 0x402C,
0x01E4, 0xC024, 0x8025, 0x41E5, 0x0027, 0xC1E7, 0x81E6, 0x4026,
0x0022, 0xC1E2, 0x81E3, 0x4023, 0x01E1, 0xC021, 0x8020, 0x41E0,
0x01A0, 0xC060, 0x8061, 0x41A1, 0x0063, 0xC1A3, 0x81A2, 0x4062,
0x0066, 0xC1A6, 0x81A7, 0x4067, 0x01A5, 0xC065, 0x8064, 0x41A4,
0x006C, 0xC1AC, 0x81AD, 0x406D, 0x01AF, 0xC06F, 0x806E, 0x41AE,
0x01AA, 0xC06A, 0x806B, 0x41AB, 0x0069, 0xC1A9, 0x81A8, 0x4068,
0x0078, 0xC1B8, 0x81B9, 0x4079, 0x01BB, 0xC07B, 0x807A, 0x41BA,
0x01BE, 0xC07E, 0x807F, 0x41BF, 0x007D, 0xC1BD, 0x81BC, 0x407C,
0x01B4, 0xC074, 0x8075, 0x41B5, 0x0077, 0xC1B7, 0x81B6, 0x4076,
0x0072, 0xC1B2, 0x81B3, 0x4073, 0x01B1, 0xC071, 0x8070, 0x41B0,
0x0050, 0xC190, 0x8191, 0x4051, 0x0193, 0xC053, 0x8052, 0x4192,
0x0196, 0xC056, 0x8057, 0x4197, 0x0055, 0xC195, 0x8194, 0x4054,
0x019C, 0xC05C, 0x805D, 0x419D, 0x005F, 0xC19F, 0x819E, 0x405E,
0x005A, 0xC19A, 0x819B, 0x405B, 0x0199, 0xC059, 0x8058, 0x4198,
0x0188, 0xC048, 0x8049, 0x4189, 0x004B, 0xC18B, 0x818A, 0x404A,
0x004E, 0xC18E, 0x818F, 0x404F, 0x018D, 0xC04D, 0x804C, 0x418C,
0x0044, 0xC184, 0x8185, 0x4045, 0x0187, 0xC047, 0x8046, 0x4186,
0x0182, 0xC042, 0x8043, 0x4183, 0x0041, 0xC181, 0x8180, 0x4040
};
unsigned int fcs_calc( unsigned char *buff, unsigned int len)
{
unsigned int fcs;
unsigned int q; // 临时寄存器
fcs = 0xFFFF; // 初始化CRC寄存器FCS
while(len--)
{
q = *(crctab+(*buff++^(fcs>>8)));
fcs = ((q&0xFF00)^(fcs<<8))|(q&0x00FF);
}
return(fcs);//^0xFFFF);// 将FCS(与0xFFFF异或值)作为CRC计算结果返回
}

unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
void Test(void)
{
         uint16_t crcWord = 0xFFFF;
       crcWord = (Table, sizeof(Table));   crcWord = 0x861F;
  
}
------------------------------------------------------------------------------------
//上表的获得

void BuildTable16( unsigned int aPoly , unsigned int *crctab)
{
    unsigned int i, j;
    unsigned int nData;
    unsigned int nAccum ;
   
    for ( i = 0; i < 256; i++ )
    {
     asm("WDR");
        nData = i;
        nAccum = 0x0000;
        for ( j = 0; j < 8; j++ )
        {
            if ( ( nData ^ nAccum ) & 0x0001 )  //如果数据的最高位1
               nAccum = (( nAccum >>1 ) ^ aPoly);//CRC左移1位,
            else
                nAccum >>= 1;
            nData >>= 1;
        }
        *crctab++ = (( unsigned long )nAccum<<8)|(( unsigned long )nAccum>>8);
   }
 
}

unsigned int fcs_calc(unsigned int *crctab, unsigned char *buff, unsigned int len)
{
unsigned int fcs;
unsigned int q; // 临时寄存器
fcs = 0xFFFF; // 初始化CRC寄存器FCS
while(len--)
{
q = *(crctab+(*buff++^(fcs>>8)));
fcs = ((q&0xFF00)^(fcs<<8))|(q&0x00FF);
}
return(fcs);//^0xFFFF);// 将FCS(与0xFFFF异或值)作为CRC计算结果返回
}
#define nPoly 0xA001
uint16_t Table_CRC[256];
unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
unsigned char Table[6]={0x80, 0x06, 0x00, 0x15, 0x00, 0x00};
void Test(void)
{
     uint16_t crc;
     BuildTable16(Table_CRC, nPoly);
     crc = fcs_calc(Table_CRC, Table, sizeof(Table));    
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值