Forum: Mikrocontroller und Digitale Elektronik CRC-CAN Prüfsumme berechnen C Code


von ODS (Gast)


Lesenswert?

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
   }

von Karl H. (kbuchegg)


Lesenswert?

Verabschiede dich als erster von der Darstellung eines 'Bits' in Form 
eines Characters '0' oder '1'.

Nimm dir den Datentyp auf deinem µC, der 16 Bit hat (ev. ein 'int') und 
arbeite mit Bitoperationen. Und, Oder, Xor und um 1 Position schieben.

Ausgangspunkt könnte auch Fremdcode sein, den man mal studiert, wie die 
das machen. Wenn mich mein Gedächtnis nicht trügt, dann ist im Wikipedia 
Artikel zu CRC entsprechender Code für C angegeben.
Aber erst mal musst du mit Bitoperationen klarkommen. Mit diesen 
'Bit-Strings' (mir fällt kein besserer Name ein), verbaust du dir schon 
mal alles. Alles weitere folgt dann daraus.

: Bearbeitet durch User
von ODS (Gast)


Angehängte Dateien:

Lesenswert?

Hi Karl,

vielen Dank für deine Anwort. Mir ging es erstmal darum den Algorithmus
der im beigefügten Datenblatt dargestellt ist umzusetzen, damit der 
richtige CRC Wert berechnet wird. Damit kann ich für feste Kommandos
den CRC Wert als eine Konstante ins Programm einpfelegen um wenigstens 
die
ersten Tests durchführen zu können.

Ich schreibe momentan meine Bachelorthesis und habe relativ wenig Zeit 
mich
mit der CRC Berechnung zu beschäftigen. Fragen kostet ja nichts ;), 
evtl. hat jemand diese Berechnung die im Datenblatt dargestellt ist 
programmiert.
Wenn nicht muss ich mich wohl einen Tag damit beschäftigen um es zu 
realisieren.

Einen Fremdcode aus diesem Forum konnte ich schon testen. Leider konnte 
ich auch durch weiteres anpassen nicht den gewünschten CRC Wert 
berechnen der im Datenblatt für ein Beispielkommando angegeben ist.

von Rudolph (Gast)


Lesenswert?

Ich kann da nur kein CAN drin entdecken.

von ODS (Gast)


Lesenswert?

Ja das ist ja das Problem Rudolf, im Datenblatt wird ein das Polynom 
dafür angegeben und entspricht eben der CRC-CAN. Ich hab dazu C Codes 
parat nur die liefern mir einen anderen Wert.

von Rudolph (Gast)


Lesenswert?

Ah, so wie hier:
http://www.mikrocontroller.net/articles/CAN_CRC_Berechnung

Da kümmert sich allerdings normalerweise der µC drum und es gibt nur 
irgendwo ein CRC-Fehler Bit das gesetzt ist oder nicht.
Also erschliesst sich mir gerade im Zusammenhang mit CAN nicht, wie man 
überhaupt an die Bits rankommen will und warum man da was berechnen 
wollte würde.
Das hilft jetzt nicht bei Deinem Problem.

Aber vielleicht würde Dir eine andere Thread-Überschrift helfen jemanden 
zu finden der da mehr drüber weiss?
CRC-Berechnung LTC6804?

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.