There is a three byte packet header.
<--------1st byte-----><--------2nd byte-----><--------3rd byte------------->
---------------------------------------------------------------------------------------------
| 8bits | 8bits | 3 bits| 5 bits (CRC ) |
---------------------------------------------------------------------------------------------
for example: 0D 0B 40 ---> Input Data stream ( 19 bits)
04 ---> CRC ( 5bits)
Now combining 0D 0B 44 ----> Data stream after CRC (24 bits)
The function addCrc() generates a 5 bit CRC checksum, which is the part of the header. I am not getting how this checksum is implemented?
Expand|Select|Wrap|Line Numbers
- inline void byteUpdate(unsigned char data);
- void addCrc(unsigned char* start);
- unsigned char byteCrc[256];
- unsigned char shftRgstr;
- unsigned char k;
- unsigned short i;
- unsigned short j;
- // CRC generator polynomial x^5+x^2+1 represented in a byte, starting
- // from the most significant bit, excluding the first bit
- const unsigned char Aal2CpsPoly = 0x28;
- // Below table generated is used in calculating the CRC
- {
- for (i=0; i<256; i++)
- {
- byteCrc[255-i] = 0;
- for (j = 0xff80 - i*0x0100; j != 0x8000; j <<= 1)
- {
- if ((byteCrc[255-i] & 0x80) ^ ((j & 0x8000) >> 8))
- {
- byteCrc[255-i] <<= 1;
- byteCrc[255-i] ^= Aal2CpsPoly;
- } else
- {
- byteCrc[255-i] <<= 1;
- }
- }
- }
- }
- void Aal2CpsCrc::byteUpdate(unsigned char data)
- {
- shftRgstr = byteCrc[shftRgstr ^ data];
- }
- // Function used in calculating the CRC
- void Aal2CpsCrc::addCrc(unsigned char* start)
- {
- shftRgstr = 0;
- byteUpdate(*start++);
- byteUpdate(*start++);
- for (k = (*start & 0xe0) | (0x10); k != 0x80; k <<= 1)
- {
- if ((shftRgstr & 0x80) ^ (k & 0x80))
- {
- shftRgstr <<= 1;
- shftRgstr ^= Aal2CpsPoly;
- } else
- {
- shftRgstr <<= 1;
- }
- }
- *start = (*start & 0xe0) | (shftRgstr >> 3);
- }
The width(W) of a poly is the actual bit position of the
highest bit. For example, the width of 10011 is 4, not 5. For the
Having chosen a poly, we can proceed with the calculation. This is
simply a division (in CRC arithmetic) of the message by the poly. The
only trick is that W zero bits are appended to the message before the
CRC is calculated. Thus we have:
Original message : 0000 1101 0000 1011 0100 0000
Poly :100101
Message after appending W zeros : 0000 1101 0000 1011 0100 0000 0000 0
Now we simply divide the augmented message by the poly using CRC
____ 00101111111011110_______________________
100101) 1101 0000 1011 0100 0000 0000 0 Augmented message (0000 1101 0000 1011 0100 0000 + 00000)
1001 01
-----------
001010
000000
----------
.
.
.
.
and so on
.
.
001100
000000
-----------
01100 = Remainder = CRC
Note: The sum uses CRC addition(Binary Arithmetic with No Carries, that is XOR operation)
The manually calculated CRC(01100) is not matching with the calculated CRC (04 - 00100) from the above algorithm. So can somebody help me in resolving this discrepancies?
Regards,
Mohammed Fareed