Forum: Mikrocontroller und Digitale Elektronik CRC Berechnung anhand Tabelle


von Max (Gast)


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 User
von Nop (Gast)


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)


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)


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

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.