Collection of different CRC calculations

Dependents:   Waldo_Embed_V2

Work in Progress

Committer:
sam_grove
Date:
Tue May 14 22:14:09 2013 +0000
Revision:
1:ec8513f94d23
Parent:
0:28e16d33040f
untested but just formatted

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:28e16d33040f 1
sam_grove 0:28e16d33040f 2 #define CRC32_POLYNOMIAL 0xEDB88320L
sam_grove 0:28e16d33040f 3
sam_grove 0:28e16d33040f 4 void CRC32Value(unsigned long &CRC, unsigned char c)
sam_grove 0:28e16d33040f 5 {
sam_grove 0:28e16d33040f 6 /////////////////////////////////////////////////////////////////////////////////////
sam_grove 0:28e16d33040f 7 //CRC must be initialized as zero
sam_grove 0:28e16d33040f 8 //c is a character from the sequence that is used to form the CRC
sam_grove 0:28e16d33040f 9 //this code is a modification of the code from the Novatel OEM615 specification
sam_grove 0:28e16d33040f 10 /////////////////////////////////////////////////////////////////////////////////////
sam_grove 0:28e16d33040f 11 unsigned long ulTemp1 = ( CRC >> 8 ) & 0x00FFFFFFL;
sam_grove 0:28e16d33040f 12 unsigned long ulCRC = ((int) CRC ^ c ) & 0xff ;
sam_grove 0:28e16d33040f 13 for (int j = 8 ; j > 0; j-- )
sam_grove 0:28e16d33040f 14 {
sam_grove 0:28e16d33040f 15 if ( ulCRC & 1 )
sam_grove 1:ec8513f94d23 16 {
sam_grove 0:28e16d33040f 17 ulCRC = ( ulCRC >> 1 ) ^ CRC32_POLYNOMIAL;
sam_grove 1:ec8513f94d23 18 }
sam_grove 0:28e16d33040f 19 else
sam_grove 1:ec8513f94d23 20 {
sam_grove 0:28e16d33040f 21 ulCRC >>= 1;
sam_grove 1:ec8513f94d23 22 }
sam_grove 0:28e16d33040f 23 }
sam_grove 0:28e16d33040f 24 CRC = ulTemp1 ^ ulCRC;
sam_grove 0:28e16d33040f 25 }
sam_grove 0:28e16d33040f 26
sam_grove 0:28e16d33040f 27 /* --------------------------------------------------------------------------
sam_grove 0:28e16d33040f 28 Calculates the CRC-32 of a block of data all at once
sam_grove 0:28e16d33040f 29 //the CRC is from the complete message (header plus data)
sam_grove 0:28e16d33040f 30 //but excluding (of course) the CRC at the end
sam_grove 0:28e16d33040f 31 -------------------------------------------------------------------------- */
sam_grove 0:28e16d33040f 32 unsigned long CalculateBlockCRC32(
sam_grove 0:28e16d33040f 33 unsigned long ulCount, /* Number of bytes in the data block */
sam_grove 0:28e16d33040f 34 unsigned char *ucBuffer ) /* Data block */
sam_grove 0:28e16d33040f 35 {
sam_grove 0:28e16d33040f 36 //////////////////////////////////////////////////////////////////////
sam_grove 0:28e16d33040f 37 //the below code tests the CRC32Value procedure used in a markov form
sam_grove 0:28e16d33040f 38 //////////////////////////////////////////////////////////////////////
sam_grove 0:28e16d33040f 39 unsigned long CRC = 0;
sam_grove 1:ec8513f94d23 40 for (int i = 0; i<ulCount; i++)
sam_grove 1:ec8513f94d23 41 {
sam_grove 1:ec8513f94d23 42 CRC32Value( CRC, *ucBuffer++ );
sam_grove 1:ec8513f94d23 43 }
sam_grove 0:28e16d33040f 44 return CRC;
sam_grove 0:28e16d33040f 45 }
sam_grove 0:28e16d33040f 46
sam_grove 0:28e16d33040f 47 /*
sam_grove 0:28e16d33040f 48 unsigned long CalculateBlockCRC32(
sam_grove 0:28e16d33040f 49 unsigned long ulCount,
sam_grove 0:28e16d33040f 50 unsigned char *ucBuffer )
sam_grove 0:28e16d33040f 51 {
sam_grove 0:28e16d33040f 52 ////////////////////////////////////////////
sam_grove 0:28e16d33040f 53 //original code from the OEM615 manual
sam_grove 0:28e16d33040f 54 ////////////////////////////////////////////
sam_grove 0:28e16d33040f 55 unsigned long ulTemp1;
sam_grove 0:28e16d33040f 56 unsigned long ulTemp2;
sam_grove 0:28e16d33040f 57 unsigned long ulCRC = 0;
sam_grove 0:28e16d33040f 58 while ( ulCount-- != 0 )
sam_grove 0:28e16d33040f 59 {
sam_grove 0:28e16d33040f 60 ulTemp1 = ( ulCRC >> 8 ) & 0x00FFFFFFL;
sam_grove 0:28e16d33040f 61 ulTemp2 = CRC32Value( ((int) ulCRC ^ *ucBuffer++ ) & 0xff );
sam_grove 0:28e16d33040f 62 ulCRC = ulTemp1 ^ ulTemp2;
sam_grove 0:28e16d33040f 63 }
sam_grove 0:28e16d33040f 64 return( ulCRC );
sam_grove 0:28e16d33040f 65 }
sam_grove 0:28e16d33040f 66 */