0% found this document useful (0 votes)
16 views5 pages

CRC Clarify

This document describes an algorithm for generating cyclic redundancy check (CRC) values over a buffer of data. It provides the code for a CRC lookup table and function to calculate CRC values using the table. The function takes a seed value and buffer pointer as inputs and generates CRC check bits over the provided data.

Uploaded by

trueleewatch
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views5 pages

CRC Clarify

This document describes an algorithm for generating cyclic redundancy check (CRC) values over a buffer of data. It provides the code for a CRC lookup table and function to calculate CRC values using the table. The function takes a seed value and buffer pointer as inputs and generates CRC check bits over the provided data.

Uploaded by

trueleewatch
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 5

!

"
# $$ % &' "
#%$ $ (

)* ++,

# - . / 0 , # % 1#%
2 3 ) # - % $
# # % - 1 #% # ( $
. 4 5 % 6 () / # # % %
)$

. / 0 , %% 6 7 %
8 9 :- %
) 7 ;7 80 ($* 2 3 #%
) %
4:<;= < , > < > <? > $ / 0 , %% # 6 6
@ 6 -/ : @ /; - %
%

@ A . #% - / 0 ,2 3

/ %
) # - ( % - #% -
% $ # - %%
) - @/ ( -- ( %
)
#%) % 4 :<;= < , > <10 > <3 > $ 7 / ##
( 6) %( % $ B % ) % /
#% . 5% 5 %% 6 # 6%
% B # # - #% %
%
)$

- 6 # .0* -2 3 %6 - -
6 @ $ ( .
6 6 - 6 - 6 - : @ $ ;$
@ A . 5 6 ( 2?3

-%
% # ( @ .0 .0 2 3$

x0 x5 x12 x16
GATE A

LSB MSB
GATE C

GATE B
Data In : First Transferred Bit (MSB) first
Data Out
@ A7 # ( . / 0 ,C .

x0 x5 x12 x16

LSB MSB

GATE B
Data In : First Transferred Bit (MSB) first
Data Out
@ *A7 # ( . / 0 ,. .

6 ) %
% . - / %%
-%% # ( ( -@ 0 0 -
2,3$ ) . / 0 #%
) %
4:<;= < > < > < > < > < > $
x0 x2 x11 x21 x23 x32
GATE A

LSB MSB
GATE C

GATE B
Data In : First Transferred Bit (MSB) first Data Out

@ ?A7 # ( . / 0 C .
x0 x2 x11 x21 x23 x32

LSB MSB

GATE B
Data In : First Transferred Bit (MSB) first Data Out

@ ,A7 # ( . / 0 . .

. / 0 , %% # ,06 / ) (%
6 ## - 6 - $
## %
%6 6 $ @ 1 #%
-%
% # / ) % +1D?@5 :
- 6 % - 6 ;$

+1+, +1+++1+ +1-+ +1+++1+* +1+++1?? +1EE+1D +1 F+1++ +1+++1+? +1

/ (% %%6 ## -%
% #
/ ( % -+1++++ ( ) %% / ( %
$

+1+, +1+++1+ +1-++1+++1+* +1+++1?? +1EE+1D +1 F+1+++1+++1+? +1 !"#$!"%

1 #% / 0 , %% # % 6 6%
( % %% ## 6 6 % 2*3$

static U16 crc_table[256] = {


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,
};
/***********************************************************************
*
* FUNCTION:
* tc__fec_sdlc
*
* INPUTS:
* seed - (U16) initial value of check bits.
* buf - (unsigned char *) pointer to the buffer of
* data over which you wish to generate check
* bits.
* len - (int) number to bytes of data in the buffer.
*
* OUTPUTS:
*
* RETURNS:
* - (U16) the checkbits.
*
* EXTERNALLY READ:
* sdlc_table - (U16)[256] the lookup table for the CCITT SDLC
* generator polynomial (local to this module).
*
* EXTERNALLY MODIFIED:
*
* DESCRIPTION:
* This function implements CRC generation with the CCITT SDLC error
* polynomial (X16 + X12 + X5 + 1). You must provide it with an
* initial seed value, a pointer to a data buffer, and the byte length
* of the data buffer. It will return the unsigned 16-bit CRC.
*
* You may use this function to generate a CRC over data in scattered
* storage by making multiple calls to it. Just make sure that you
* pass a seed of 0xFFFF on the first call. On subsequent calls, pass
* a seed containing the return value of the previous call.
*
*/
U16
tc__fec_sdlc_s(U16 seed, unsigned char *buf, int len)
{
U16 crc, t;
unsigned char *p;
crc = seed;
p = buf;
while (len--) {
crc = crc_table[((crc >> 8) ^ *p++) & 0xff] ^ (crc << 8);
}
return (U16)crc;
}
#ifdef SLOWER_METHOD
U16
tc__fec_sdlc_f(U16 seed, unsigned char *buf, int len)
{
unsigned short crc, t;
unsigned short ch, xor_flag;
int i, count;
crc = seed;
count = 0;
while (len--) {
ch = buf[count++];
ch<<=8;
for(i=0; i<8; i++)
{
if ((crc ^ ch) & 0x8000)

*
{
xor_flag = 1;
}
else
{
xor_flag = 0;
}
crc = crc << 1;
if (xor_flag)
{
crc = crc ^ 0x1021;
}
ch = ch << 1;
}
}
return (unsigned short)crc;
}
#endif

2 3 % ( - # .
) : . ;. FED$ 2G % 3$ ( %6%A
#A
HH# 6% $ $ H# 6% H ( H ++1+ $# -
2 3
7 % % 8 7 80 @ % I777$ / $ I$* $
2 3 ! " # $@ 6 ++, 7 %
$
2*3J G 6) /# ) * ++,$
2?3 % " % ( - # . )
: . ; # ++ $ 2G % 3$ ( %6%A
#A
HH# 6% $ $ H# 6% H ( H 1+6 $# -
2,3" & ' % " ( # ) * % (
- # . ) : . ; # % ++ $ 2G % 3$ ( %6%A
#A
HH# 6% $ $ H# 6% H ( H 1 6 $# -

You might also like