Mikrocontroller und Digitale Elektronik
›
Thread
CRC-16 X25 und XMODEM Berechnung mit CRC-Modul von dsPIC33EP
C
CRC-Desaster
Gast
29.10.2016 20:39
#4773595
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 }
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.
Neuen Thread starten
Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.