Forum: Mikrocontroller und Digitale Elektronik CRC-16 X25 und XMODEM Berechnung mit CRC-Modul von dsPIC33EP


von CRC-Desaster (Gast)


Lesenswert?

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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.