Connect with Expertise | Find Experts, Get Answers, Share Insights

calculation of 32 bit CRC(Cyclic Redundancy Code)in C

 
Join Date: Nov 2009
Posts: 3
#1: Jan 11 '10
please help me!!
i have written a program to calculate 32 bit CRC(used for ETHERNET)..but its not working and giving correct output..
please let me know my mistakes..

output should be :E7 B0 51 93
Expand|Select|Wrap|Line Numbers
  1. /**************  program starts here *************************/
  2. typedef unsigned long ul;
  3. typedef unsigned char uchar;
  4.  
  5. uchar buffer_bytes[64] = {0x00,0x14,0x85,0x31,0x24,0x10,0x00,0x15,0x00,0x15,0x9f,0x07,0x08,0x06,0x00,0x01,0x08,0x00,0x06,0x04,0x00,0x02,0x00,0x15,0x00,0x15,0x9f,0x07,0xc0,0xa8,0x00,0x02,0x00,0x14,0x85,0x31,0x24,0x10,0xc0,0xa8,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  6. ul     remainder ,temp;        //to get 32 bit number
  7. unsigned short weld,joint;
  8.  
  9. unsigned char i,count = 0 ,str_length =64,  *ptr,j;
  10.  
  11.  
  12. #define MSB 0x80000000;
  13. #define POLY 0x04C11DB7    
  14. #define printf printf_fast_f
  15.  
  16. void init_uart(void)
  17. {
  18.     ES = 0 ;                    //Disable serial interrupt.
  19.     SCON = 0x50 ;                //mode 0,REN enabled
  20.     BDRCON = 0x0E ;                //
  21.  
  22.     PCON &= 0x7F ;
  23.     BRL = 224 ;
  24.     BDRCON |= 0x10 ;    
  25. }
  26.  
  27. void putchar(uchar send_this)
  28. {
  29.     uart_send_char(send_this);
  30. }
  31.  
  32. void main(void)
  33. {
  34.     init_uart();
  35.  
  36.     ptr = &buffer_bytes[0];
  37.  
  38.     //----------------------------------------------------------------------------------------------------------/
  39.     //            get 32 bit number out of the whole string                                                         /
  40.     //----------------------------------------------------------------------------------------------------------/
  41.     weld = (unsigned short)*ptr;                                                                                                   
  42.     ptr++;                                                                                                                              
  43.     weld = ((weld << 8) & 0xff00) +  (unsigned short)*ptr;        //16 bit number higher                                            
  44.     ptr++;
  45.     joint =  (unsigned short)*ptr;
  46.     ptr ++;
  47.  
  48.     joint = ((joint << 8) &0xff00) + (unsigned short) *ptr    ;    //16 bit number lower
  49.     ptr ++;                                                        //pointer points the next byte after 4th byte
  50.     remainder =  weld;
  51.     remainder = (remainder << 16) & 0xffff0000  ;        
  52.     remainder = remainder + joint;                                    //32 bit number
  53.  
  54.  
  55.     //remainder = remainder ^ (ul) 0xFFFFFFFF;
  56. //----------------------------------------------------------------------------------------------------
  57.  
  58.     //str_length = str_length  - 4;
  59.  
  60.     for(j = str_length; j>0 ; j--)                    //str_length = no. of bytes in string
  61.     {
  62.         if((remainder & (ul)0xFF000000)==0x00000000)
  63.         {
  64.             remainder = remainder << 8;
  65.             remainder = (remainder & (ul)0xFFFFFF00) | (ul)*ptr;
  66.         }
  67.         else
  68.         {
  69.             for(i=0; i<8 ; i++)
  70.             {
  71.             printf(" %lx\r\n",remainder);
  72.                 if((remainder & (ul)0x80000000) == (ul)0x80000000)        //if MSB is high then shift left by 1, get next bit 0
  73.                 {                                                        
  74.                     remainder = remainder << 1;
  75.  
  76.                     if((*ptr & 0x80) == 0x80)
  77.                     {
  78.                         remainder |= (ul)0x00000001;
  79.                     }
  80.                     else 
  81.                     {
  82.                         remainder |= (ul)0x00000000;
  83.                     }
  84.                     *ptr = *ptr << 1;                            //XOR remainder with POLY
  85.                     printf("msg %lx\r\n",remainder);
  86.  
  87.                     remainder = remainder ^ (ul)0x04C11DB7;
  88.                     printf("XOR abov msg wiD POLY\r\n");
  89.                 }
  90.                 else
  91.                 {
  92.  
  93.                 //    while((remainder & (ul)0x80000000) == (ul)0x00000000)
  94.                 //    {
  95.                         remainder = remainder << 1;
  96.                         if((*ptr & 0x80) == 0x80)
  97.                         {
  98.                             remainder |= (ul)0x00000001;
  99.                         }
  100.                         else
  101.                         { 
  102.                             remainder |= (ul)0x00000000;
  103.                         }
  104.                         *ptr = *ptr << 1;
  105.                 //        i++;
  106.                 //        if (i >= 8)break;
  107.                     //}
  108.  
  109.                 }
  110.             }
  111.             ptr ++;
  112.             //printf("ptr = %2x\r\n",*ptr);
  113.         }
  114.     }

Reply