mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik CRC Berechnung anhand Tabelle


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Max (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
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;
}

: Verschoben durch Moderator
von Nop (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
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.

von max (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von max (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.