Hallo,
kann mir vielleicht einer bitte helfen, und sagen warum die CRC16 XMODEM
Berechnung funktioniert und CRC16 X25 mir ein falsches Wert liefert:
name="X-25" width=16 poly=0x1021 init=0xffff refin=true refout=true
xorout=0xffff
name="XMODEM" width=16 poly=0x1021 init=0x0000 refin=false refout=false
xorout=0x0000
Ich benötige die CRC16 X25, weil das ein fremdes System ist, und ich das
nicht ändern kann!
Hier werden die beide Berechnungen ausgeführt:
1 | unsigned char messageString[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
|
2 |
|
3 | // CRC-16 X-25, geht nicht und liefert ein Wert von 0x8DDF soll aber 0x6DD4
|
4 | crcResult = CRC_ChecksumByte( messageString, 8, 0xFFFF, 0xFFFF, 1, 1);
|
5 |
|
6 | // CRC-16 XMODEM, funktioniert CRC=0x76AC
|
7 | crcResult = CRC_ChecksumByte( messageString, 8, 0x0000, 0x0000, 0, 0);
|
Hier ist die eigentliche Berechnung:
1 | unsigned int CRC_ChecksumByte( unsigned char *data, unsigned char Number_of_bytes, unsigned int initCRC, unsigned int xorOut, unsigned int refIn, unsigned int refOut)
|
2 | {
|
3 | unsigned char volatile *dest = ( unsigned char * ) &CRCDATL;
|
4 | unsigned int crc = 0; unsigned char c = 0;
|
5 |
|
6 | CRCWDATL = initCRC;
|
7 | IFS4bits.CRCIF=0; //CRC status Flag is Cleared
|
8 |
|
9 | CRCCON1bits.CRCGO = 1;
|
10 |
|
11 | do
|
12 | {
|
13 | while(1 != CRCCON1bits.CRCMPT);
|
14 |
|
15 | while( (0 == CRCCON1bits.CRCFUL) && (0 < Number_of_bytes) )
|
16 | {
|
17 | c = (unsigned char)*data++;
|
18 | if (refIn==1) {c = reflect(c, 8);}
|
19 | *dest = c;
|
20 |
|
21 | Number_of_bytes--;
|
22 | }
|
23 | } while( 0 < Number_of_bytes );
|
24 |
|
25 | while(!IFS4bits.CRCIF)
|
26 | Nop();
|
27 |
|
28 |
|
29 | CRCDATL = 0x0000; /* Do this to shift the last word out of the CRC shift register */
|
30 |
|
31 | while( CRCCON1bits.CRCFUL == 1 );
|
32 | while(CRCCON1bits.CRCMPT!=1);
|
33 | CRCCON1bits.CRCGO=0;
|
34 |
|
35 | crc = CRCWDATL;
|
36 | if (refOut==1) {crc=reflect(crc, 16);}
|
37 |
|
38 | return ( crc ^ xorOut);
|
39 | }
|
40 |
|
41 |
|
42 |
|
43 | unsigned int reflect (unsigned int crc, int bitnum) {
|
44 |
|
45 | // reflects the lower 'bitnum' bits of 'crc'
|
46 |
|
47 | unsigned int i, j=1, crcout=0;
|
48 |
|
49 | for (i=(unsigned int)1<<(bitnum-1); i; i>>=1) {
|
50 | if (crc & i) crcout|=j;
|
51 | j<<= 1;
|
52 | }
|
53 | return (crcout);
|
54 | }
|