Forum: Mikrocontroller und Digitale Elektronik CRC 8 Probleme bei cyclic redundancy check


von Deed D. (Gast)


Lesenswert?

Hallo zusammen,

ich habe für meine Bachelorarbeit ein Programm für die CRC8 Berechnung
bekommen und kann es noch nicht ganz nachvollziehen.(Vor allem was die
Tabelle zu bedeuten hat!)

Hier ein Ausschnitt:

int rticanmmcrc_capl(message * Msg,int CsBitPos,int CsLength)
{
    int MsgLength = 0;
    int MsgID     = 0;
    int kk = 0;
    int BytePos = 0;

  int CsBitRem = 0;
    byte CheckSum = 0;
    word xor_value = 0;

    byte CRC8_11D_LookUpTable[256] = {
                        0x00, 0x1d, 0x3a, 0x27,
                        0x74, 0x69, 0x4e, 0x53,
                        0xe8, 0xf5, 0xd2, 0xcf,
                        0x9c, 0x81, 0xa6, 0xbb,
                        0xcd, 0xd0, 0xf7, 0xea,
                        0xb9, 0xa4, 0x83, 0x9e,
                        0x25, 0x38, 0x1f, 0x02,
                        0x51, 0x4c, 0x6b, 0x76,
                        0x87, 0x9a, 0xbd, 0xa0,
                        0xf3, 0xee, 0xc9, 0xd4,
                        0x6f, 0x72, 0x55, 0x48,
                        0x1b, 0x06, 0x21, 0x3c,
                        0x4a, 0x57, 0x70, 0x6d,
                        0x3e, 0x23, 0x04, 0x19,
                        0xa2, 0xbf, 0x98, 0x85,
                        0xd6, 0xcb, 0xec, 0xf1,
                        0x13, 0x0e, 0x29, 0x34,
                        0x67, 0x7a, 0x5d, 0x40,
                        0xfb, 0xe6, 0xc1, 0xdc,
                        0x8f, 0x92, 0xb5, 0xa8,
                        0xde, 0xc3, 0xe4, 0xf9,
                        0xaa, 0xb7, 0x90, 0x8d,
                        0x36, 0x2b, 0x0c, 0x11,
                        0x42, 0x5f, 0x78, 0x65,
                        0x94, 0x89, 0xae, 0xb3,
                        0xe0, 0xfd, 0xda, 0xc7,
                        0x7c, 0x61, 0x46, 0x5b,
                        0x08, 0x15, 0x32, 0x2f,
                        0x59, 0x44, 0x63, 0x7e,
                        0x2d, 0x30, 0x17, 0x0a,
                        0xb1, 0xac, 0x8b, 0x96,
                        0xc5, 0xd8, 0xff, 0xe2,
                        0x26, 0x3b, 0x1c, 0x01,
                        0x52, 0x4f, 0x68, 0x75,
                        0xce, 0xd3, 0xf4, 0xe9,
                        0xba, 0xa7, 0x80, 0x9d,
                        0xeb, 0xf6, 0xd1, 0xcc,
                        0x9f, 0x82, 0xa5, 0xb8,
                        0x03, 0x1e, 0x39, 0x24,
                        0x77, 0x6a, 0x4d, 0x50,
                        0xa1, 0xbc, 0x9b, 0x86,
                        0xd5, 0xc8, 0xef, 0xf2,
                        0x49, 0x54, 0x73, 0x6e,
                        0x3d, 0x20, 0x07, 0x1a,
                        0x6c, 0x71, 0x56, 0x4b,
                        0x18, 0x05, 0x22, 0x3f,
                        0x84, 0x99, 0xbe, 0xa3,
                        0xf0, 0xed, 0xca, 0xd7,
                        0x35, 0x28, 0x0f, 0x12,
                        0x41, 0x5c, 0x7b, 0x66,
                        0xdd, 0xc0, 0xe7, 0xfa,
                        0xa9, 0xb4, 0x93, 0x8e,
                        0xf8, 0xe5, 0xc2, 0xdf,
                        0x8c, 0x91, 0xb6, 0xab,
                        0x10, 0x0d, 0x2a, 0x37,
                        0x64, 0x79, 0x5e, 0x43,
                        0xb2, 0xaf, 0x88, 0x95,
                        0xc6, 0xdb, 0xfc, 0xe1,
                        0x5a, 0x47, 0x60, 0x7d,
                        0x2e, 0x33, 0x14, 0x09,
                        0x7f, 0x62, 0x45, 0x58,
                        0x0b, 0x16, 0x31, 0x2c,
                        0x97, 0x8a, 0xad, 0xb0,
                        0xe3, 0xfe, 0xd9, 0xc4 };

    MsgLength = Msg.dlc;
    MsgID = Msg.ID;

      CsBitRem = (CsBitPos % 8);
    BytePos = (CsBitPos - CsBitRem) / 8;


    switch (MsgID)
    {

      case 0x3C: {xor_value = 197;}; break; //CRC_CON_VEH
      case 0x1CA: {xor_value = 116;}; break; //CRC_CTR_CNV_48V_2

      default: {return(-1);}
    }

    CheckSum = CRC8_11D_LookUpTable[(byte)(xor_value & 0x00ff)];
    CheckSum = CRC8_11D_LookUpTable[CheckSum ^ (byte)(xor_value>>8)];

    for (kk=0; kk<MsgLength; kk++)
    {
    if(kk != BytePos)
    {
      CheckSum = CRC8_11D_LookUpTable[CheckSum ^ (byte)(Msg.BYTE(kk))];
    }
    }

    return(CheckSum); // Return of CRC (TX)
}

Wäre super wenn mir jemand helfen könnte, verstehe noch nicht wie das
Generatorpolynom zustande kommt und wo ich es finde.

LG

: Verschoben durch Moderator
von W.S. (Gast)


Lesenswert?

Michael H. schrieb:
> Wäre super wenn mir jemand helfen könnte, verstehe noch nicht wie das
> Generatorpolynom zustande kommt

Du willst den akademischen Grad eines Bachelors erwerben und stellst 
hier eine DERARTIGE Frage?

Eigentlich soll so eine Arbeit dokumentieren, daß derjenige, der sie 
einreicht, in der Lage ist, selbständig und wissenschaftlich zu arbeiten 
und seine Ergebnisse selbst erzielt zu haben.

Was meinst du, was aus dir werden mag, wenn du derartig in einer Firma 
einen Posten als Entwickler oder Konstrukteur etc. annimmst?

W.S.

von Deed D. (Gast)


Lesenswert?

Ja, ich will den akademischen Grad eines Bachelors erwerben und ja, ich 
stelle hier eine "DERARTIGE" Frage!
Ich gebe Ihnen vollkommen Recht, dass eine Arbeit eigenständig 
geschrieben werden muss. Des weiteren gebe ich Ihnen Recht, dass man 
seine Ergebnisse selbst erzielen muss. Aber um diese Ziele zu erreichen, 
ist es dennoch vollkommen legitim, sich Tipps, Anregungen oder Meinungen 
anderer zu holen. Sei es von anderen Personen/Experten, oder im 
übertragenen Sinne von Fachliteratur. Falls Sie wirklich allen Ernstes 
glauben, dass das niemand macht, der den akademischen Grad eines 
Bachelors erwerben will, dann muss ich Sie enttäuschen. Hier werden Sie 
keine gute Arbeit finden.
Des weiteren werden Sie keinen erfolgreichen Entwickler/Konstrukteur 
finden, der seine Kollegen nicht beim Namen kennt. ;)
Ich will aber hier keine tiefere Diskussion führen, denn das bringt mich 
tatsächlich nicht weiter.
Falls Sie mir also dennoch helfen wollen, würde ich mich freuen!

Beste Grüße

von Nop (Gast)


Lesenswert?

Michael H. schrieb:
> (Vor allem was die Tabelle zu bedeuten hat!)

Sie heißt "CRC8_11D_LookUpTable", und was eine Lookup-Tabelle ist, weißt 
Du ja hoffentlich. Eine CRC berechnet man "eigentlich" bitweise, was 
dann aber pro Datenbyte 8 Schritte erfordert. Um, ein ganzes Datenbyte 
auf einmal durchzuziehen, nimmt man eine Lookup-Tabelle.

Damit Du auch ein wenig selbständig arbeiten kannst, lies Dir erstmal 
den Wikipedia-Artikel zum Thema CRC durch. Danach gehst Du zu 
https://create.stephan-brumme.com/crc32/ , was zwar für CRC32 ist, aber 
das Prinzip ist dasselbe.

Da findest Du auch Code, um die Lookuptabelle für CRC32 zu generieren. 
Dann schaust Du, wo Du das Generatorpolynom für CRC32 in der 
Lookuptabelle wiederfindest, und wo der daher analog dazu in Deiner 
Tabelle ist.

Das ist allerdings in der "reversed" Form, weil die Bits gerade 
andersrum reingeschoben werden, d.h. für das eigentliche 
Generatorpolynom brauchst Du davon die bitgespiegelte Form. Das x^8 ist 
dabei logischerweise nicht vorhanden, das ist implizit.

von Das dass das das !!! (Gast)


Lesenswert?

Nop schrieb:
> Danach gehst Du zu https://create.stephan-brumme.com/crc32/ , was zwar
> für CRC32 ist, aber das Prinzip ist dasselbe.
>
> Da findest Du auch Code, um die Lookuptabelle für CRC32 zu generieren.
> Dann schaust Du, wo Du das Generatorpolynom für CRC32 in der
> Lookuptabelle wiederfindest, und wo der daher analog dazu in Deiner
> Tabelle ist

Äh, hier gibt's das Ding komplett und Original
https://www.google.com/search?q=painless+guide+to+crc

Und dann ein paar Testvektoren vom AUTOSAR Konsortium
https://www.google.com/search?q=autosar+crc

Hab das für Arbeit auch einmal in CAPL und embedded C gießen müssen. 
Viel Erfolg damit.

von Deed D. (Gast)


Lesenswert?

Danke für die Antworten,

was ich allerdings noch nicht verstehe ist, warum hier:

Michael H. schrieb:
> switch (MsgID)
>     {
>
>       case 0x3C: {xor_value = 197;}; break; //CRC_CON_VEH
>       case 0x1CA: {xor_value = 116;}; break; //CRC_CTR_CNV_48V_2
>
>       default: {return(-1);}

xor_value so gewählt wird. Normalerweise wird doch der ID direkt für die 
Berechnung benutzt, oder?

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.