Hallo, ich möchte gerne diese Berechnung der CRC Checksumme in einen einfacheren Code umsetzen, den ich dann später auf dem Mikrocontroller (dsPIC)verwenden kann. Das Polynom x15 + x14 + x10 + x8 + x7 + x4 + x3 + 1 dafür. Ich verwende einen LTC6804 der auf diese Weise seine packte prüft.
1 | #include <stdio.h> |
2 | #include <string.h> |
3 | |
4 | char *MakeCRC(char *BitString) |
5 | {
|
6 | static char Res[16]; |
7 | char CRC[15]; |
8 | int i; |
9 | char DoInvert; |
10 | |
11 | for (i=0; i<15; ++i) |
12 | {
|
13 | CRC[i] = 0; |
14 | if(i==4) CRC[i]=1; |
15 | }// Init |
16 | |
17 | for (i=0; i<strlen(BitString); ++i) |
18 | {
|
19 | DoInvert = ('1'==BitString[i]) ^ CRC[14]; |
20 | |
21 | CRC[14] = CRC[13] ^ DoInvert; |
22 | CRC[13] = CRC[12]; |
23 | CRC[12] = CRC[11]; |
24 | CRC[11] = CRC[10]; |
25 | CRC[10] = CRC[9] ^ DoInvert; |
26 | CRC[9] = CRC[8]; |
27 | CRC[8] = CRC[7] ^ DoInvert; |
28 | CRC[7] = CRC[6] ^ DoInvert; |
29 | CRC[6] = CRC[5]; |
30 | CRC[5] = CRC[4]; |
31 | CRC[4] = CRC[3] ^ DoInvert; |
32 | CRC[3] = CRC[2] ^ DoInvert; |
33 | CRC[2] = CRC[1]; |
34 | CRC[1] = CRC[0]; |
35 | CRC[0] = DoInvert; |
36 | }
|
37 | |
38 | for (i=0; i<15; ++i) Res[14-i] = CRC[i] ? '1' : '0'; |
39 | Res[15] = '0'; |
40 | return(Res); |
41 | }
|
42 | |
43 | // A simple test driver:
|
44 | |
45 | |
46 | int main() |
47 | {
|
48 | char *Data, *Result; |
49 | |
50 | Data = "0000000000000001"; |
51 | Result = MakeCRC(Data); |
52 | |
53 | printf("CRC of [%s] is [%s] with P=[1100010110011001]\n", Data, Result); |
54 | |
55 | return(0); |
56 | }
|