CRC Berechnung anhand Tabelle

Gast #4686620
hallo,

ich bin auf einer code gestoßen und möchte gerne wissen, was der code 
(funktion) macht:
_applid ist ein fixen Wert= 3660 (CRC-ID), was bedeutet dieser Wert?
Argument _data[] enthält byte(0 bis 7) wobei byte(0) ist die CRC-Wert 
(gesendet), alle andere Argumente haben ein Wert Null.

wie wird hier der Rest gebildet?

danke im Voraus!
Max

hier die Funktion:

int calcCRC8 (int _offset, int _applid, int _length, byte _data[], int 
_CRCoffset)
{
  int crc_ist = 0;
  int i;

  // CRC Lookup-table
  int K_CRC_TABLE_CRC8[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
  };

  // Berechne CRC Low-Byte von Application-ID
    crc_ist = K_CRC_TABLE_CRC8[(_applid & 0x00ff)];

  // Berechne CRC High-Byte von Application-ID
    _applid = (_applid & 0x00ff); // wegen M10 verfahren muss das untere 
nibble der CRC-ID (0xFFF) auf CRC-ID (0xFF) geschnitten werden.

  crc_ist = K_CRC_TABLE_CRC8[crc_ist^(_applid >> 8)];

  // Berechne CRC vom Datenbereich
    if (_CRCoffset>0)
    {
        for(i = 0; i < _length - 1; i++)
        {
           crc_ist = K_CRC_TABLE_CRC8[crc_ist^_data[i + _offset]];
      }
    }
    else
    {

  for(i = 1; i < _length; i++)
      {
        crc_ist = K_CRC_TABLE_CRC8[crc_ist^_data[i + _offset]];
      }
    }

  return crc_ist;
}
Gast #4687010
Erstmal grundlegend, was eine CRC macht:
http://www.mikrocontroller.net/articles/CRC

Die naive Realisierung bräuchte einen Schleifendurchlauf pro Bit (nicht 
Byte) der Eingangsdaten.

Das kann man beschleunigen, wenn man eine Lookuptabelle nimmt. In diesem 
Fall werden immer 4 Bit auf einmal gerechnet, dafür braucht man 256 Byte 
an Tabellenplatz im ROM. Man kann auch ein ganzes Byte auf einmal 
rechnen, braucht dann aber 2kByte im ROM, weil die Tabelle größer ist.

appl_id ist eine Konstante, die in die CRC zusätzlich zu den Daten 
einfließt.

Sowas kann man z.B. nutzen, wenn man Konfigurationsdaten oder so hat, 
deren Format sich aber mit einer neuen Version der Software-Anwendung 
ändern könnte. Damit die neue Software dann nicht Konfigdaten im alten 
Format einliest und sich verschluckt, kann man eine Versionierung des 
Formats einführen.
Gast #4687175
Hallo,

erstmal danke für den Antwort,

>>appl_id ist eine Konstante, die in die CRC zusätzlich zu den Daten
einfließt.

wie wird diese konstante berechnet, ich habe festgestellt dass dies von 
Sender zu Sender unterschiedlich ist! ist das nicht der Polynom selber?

Grüße
MAX
Gast #4687207
frage noch...


in der For-Schleife:

  for(i = 1; i < _length; i++)
      {
        crc_ist = K_CRC_TABLE_CRC8[crc_ist^_data[i + _offset]];
      }
    }

wird immer mit dem letzten Data_Byte berechnet, _length = dlc des CANs, 
ist 8 in dieser Fall, loop ist hier unnötig man kann auch return 
K_CRC_TABLE_CRC8[crc_ist^_data[7 + _offset]] ausgeben!!??


Grüße
Max

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.

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.