The CRC polynomial equation is user configurable, allowing any polynomial
equation to be used for the CRC checksum calculation. The polynomial and accumulator
sizes are determined by the PLEN bits. For an n-bit accumulator, PLEN = n-1 and the corresponding
polynomial is n+1 bits. This allows the accumulator to be any size up to 32 bits with a
corresponding polynomial up to 33 bits. The MSb and LSb of the polynomial are always
‘1
’ which is forced by hardware. Therefore,
the LSb of the CRCXOR Low Byte register is hardwired high and always reads as
‘1
’.
All polynomial bits between the MSb and LSb are specified by the CRCXOR registers. For
example, when using the standard CRC32, the polynomial is defined as
0x4C11DB7
0x04C11DB6
. Reading the CRCXOR registers will return
0x04C11DB7
because the LSb is always ‘1
’. Refer to
the following example for more details.
Standard CRC32 Polynomial (33 bits):
Standard 32-bit Polynomial Representation:
0x04C11DB7
CRCXORT = 0x04 =
0b00000100
CRCXORU = 0xC1 =
0b11000001
CRCXORH = 0x1D =
0b00011101
CRCXORL = 0xB7 = 0b1011011-
(1)
Data Sequence: 0x55,
0x66, 0x77, 0x88
DLEN = 0b00111 // Number of bits written to CRCDATA registers (Data
Length)
PLEN = 0b11111 // MSb position of the polynomial
(Polynomial Length)
Data Passed into the CRC:
// SHIFTM = 0(Shift Mode: MSb
first)
0x55 0x66 0x77 0x88 = 01010101 01100110 01110111
10001000
// SHIFTM = 1(Shift Mode: LSb
first)
0x55 0x66 0x77 0x88 = 10101010 01100110 11101110
00010001
CRC Check Value (ACCM =
1
, data is augmented with zeros)
//
When SHIFTM = 0, CRC Result = 0xC60D8323
CRCOUTT
= 0xC6 = 0b11000110
CRCOUTU = 0x0D =
0b00001101
CRCOUTH = 0x83 =
0b10000011
CRCOUTL = 0x23 =
0b00100011
// When SHIFTM = 1, CRC Result =
0x843529CC
CRCOUTT = 0x84 =
0b10000100
CRCOUTU = 0x35 =
0b00110101
CRCOUTH = 0x29 =
0b00101001
CRCOUTL = 0xCC = 0b11001100
1
’ and will always be
treated as a ‘1
’ by the CRC for calculating the CRC check
value. This bit will be read in software as a ‘0
’.