CRC-CAN Prüfsumme berechnen C Code

Gast #3484881
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
   }
#3484978
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.
Gast #3488276
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.
Angehängte Dateien:
Gast #3488323
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.
Gast #3488363
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.