Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

CRC for 256 byte data

Status
Not open for further replies.

john2020

Full Member level 5
Full Member level 5
Joined
Nov 13, 2005
Messages
292
Helped
12
Reputation
24
Reaction score
8
Trophy points
1,298
Activity points
4,911
hi all,



Can the following code be used for detecting an error in a data packet of 256 bytes?


/*
* Function: Do_CRC8
* * Description:
* Computes the CRC value given the byte and the old CRC value as a static value
*
* Return Value: CRC value
* Parameters: Input data byte to be CRC'ed
* Remarks:
* uses a table driven method to speed things up.
*
* */
unsigned char Do_CRC8(unsigned char xx)
{
// this procedure calculates
const unsigned char code Table[256]={
0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D,
0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D,
0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD,
0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD,
0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA,
0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A,
0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A,
0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A,
0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4,
0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4,
0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44,
0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34,
0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63,
0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13,
0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83,
0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3

};

ucCRC=Table[ucCRC ^ xx];

return (ucCRC);
}


reply me with some suggestions and ideas as early as possible

regards
john
 

>Can the following code be used for detecting an error in a data packet of 256 bytes?

It looks plausable.

An 8bit CRC will let a lot of bad packets through undetected. When several bits in a packet get flipped or if a byte gets lost you have a rough 1 in 256 chance of the bad data having the same CRC8 as the original data so the error will not be detected.
 

hi throwaway18

thanks for your reply.have you tried implementing a CRC 16bit or 32bit?if so pls reply me.can you suggest me some good book,where i could retrieve more information about implementing CRC?
 

Your program is certainly very fast but it needs a lot of flash.
If you has enough time maybe this code can help your.

Gomez

/*****************************************************************************
*** ***
*** Funktion : crc8 ***
*** Description: function to calc crc8 sum ***
*** Input : pointer of old crc sum, new data ***
*** Output : non ***
*** ***
*****************************************************************************/
void crc8( unsigned char* crc, unsigned char data)
{
int index = 8;
int fb;

do{
fb = (*crc ^ data) & 0x01;
data>>=1;
*crc>>=1;

if(fb)
*crc^=0x8c;

}while(--index);
}

/*****************************************************************************
*** ***
*** Funktion : crc16 ***
*** Description: function to calc crc16 sum ***
*** Input : pointer of old crc sum, new data ***
*** Output : non ***
*** ***
*****************************************************************************/
void crc16(unsigned int* crc, unsigned char data)
{
int index = 8;
unsigned char fb;

*crc^= (unsigned long)data <<8;
do{
if(*crc & 0x8000)
*crc = (*crc<<1) ^ 0x1021;
else
*crc<<=1;
}while(--index);
}
 

Dear Gomez

thanks for your pseudo code.i will try that out,but ate you sure that it wil detect CRC for 256 byte data?anyways
let me check the output

regards
john
 

john2020 said:
thanks for your pseudo code.i will try that out,but ate you sure that it wil detect CRC for 256 byte data?anyways
let me check the output

If you don't believe me take a look at
**broken link removed**
page 29. It's the ame code which I use the whole time.
Also take a look at the crc-program at
http://www.qprox.com/downloads/software/CRC(5).exe
bat it can only calc 50 numbers.

For my pseudo code try:

unsigned char ucDataBytes[256] = {11,22,33.......};
unsigned char ucCRC_Sum,i;

for(i=0,ucCRC_Sum=0;i<256;i++)
crc8( &ucCRC_Sum, ucDataBytes);

Gomez
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top