Berechnung eines einfachen CRC

7

Im Datenblatt für den ET1200 EtherCAT ASIC (Seite 94) wird mir mitgeteilt, dass ich eine CRC einiger der 16-Bit-Daten in seinem EEPROM berechnen muss. Die einzige Beschreibung dieses CRC lautet:

Das niedrige Byte [von Wort 7] enthält den Rest der Division von Wort 0 zu Wort 6 als vorzeichenlose Zahl geteilt durch das Polynom (Anfangswert 0xFF).x8+x2+x+1

Aus irgendeinem Grund lässt mein Gehirn schmelzen, wenn ich die Wikipedia-Seite über die Berechnung eines CRC lese . Zumal der Beispielcode in einer speziellen Sprache geschrieben ist.

Kann mir bitte jemand sagen, was ich zu was hinzufügen muss, und wohin und so weiter? In C vorzugsweise.

Raketenmagnet
quelle

Antworten:

10

Das klingt nach CRC8.

/*  
 * crc8.c
 * 
 * Computes a 8-bit CRC 
 * 
 */

#include <stdio.h>


#define GP  0x107   /* x^8 + x^2 + x + 1 */
#define DI  0x07


static unsigned char crc8_table[256];     /* 8-bit table */
static int made_table=0;

static void init_crc8()
     /*
      * Should be called before any other crc function.  
      */
{
  int i,j;
  unsigned char crc;

  if (!made_table) {
    for (i=0; i<256; i++) {
      crc = i;
      for (j=0; j<8; j++)
        crc = (crc << 1) ^ ((crc & 0x80) ? DI : 0);
      crc8_table[i] = crc & 0xFF;
      /* printf("table[%d] = %d (0x%X)\n", i, crc, crc); */
    }
    made_table=1;
  }
}


void crc8(unsigned char *crc, unsigned char m)
     /*
      * For a byte array whose accumulated crc value is stored in *crc, computes
      * resultant crc obtained by appending m to the byte array
      */
{
  if (!made_table)
    init_crc8();

  *crc = crc8_table[(*crc) ^ m];
  *crc &= 0xFF;
}

Entnommen aus: http://www.rajivchakravorty.com/source-code/uncertainty/multimedia-sim/html/crc8_8c-source.html

http://sbs-forum.org/marcom/dc2/20_crc-8_firmware_implementations.pdf

C-Implementierungen ohne Nachschlagetabelle (besonders gut für die 8-Bit-CPU-optimierte Funktion):

http://websvn.hylands.org/filedetails.php?repname=Projects&path=%2Fcommon%2FCrc8.c&sc=1

Toby Jaffey
quelle
Vielen Dank! Jetzt, da ich weiß, dass es einen richtigen Namen hat, kann ich plötzlich einen Beispielcode dafür bei Google finden.
Raketenmagnet
@joby, froh dich wieder zu sehen! Möchten Sie einige Informationen aus diesen Quellen mitbringen, damit wir nicht auf Fäulnis reagieren?
Kortuk
@Kortuk Fair Punkt, los geht's
Toby Jaffey
@JobyJaffey, und los geht's. Ich hoffe, Sie bleiben hier und beantworten weitere Fragen!
Kortuk
Ein Problem, das ich mit diesem Code habe, ist, dass das Polynom GP nirgendwo im Code verwendet wird. Welches Polynom verwendet der CRC zur Berechnung seiner CRC-Tabelle? (DI wird jedoch verwendet.
Owl
1

Das klingt nach dem CRC-8 / ROHC-Algorithmus. Gemäß dem Katalog parametrisierter CRC-Algorithmen sind seine Parameter:

width=8 poly=0x07 init=0xff refin=true refout=true xorout=0x00 check=0xd0 name="CRC-8/ROHC"

Beachten Sie, dass CRC-8 dasselbe Polynom verwendet, jedoch einen Anfangswert von 0x00nicht verwendet 0xFF. Es ist auch ein "nicht reflektierter" Algorithmus (Bits sind zuerst MSbit). Seine Parameter sind:

width=8 poly=0x07 init=0x00 refin=false refout=false xorout=0x00 check=0xf4 name="CRC-8"

Diese Parameter können mit verschiedenen Tools verwendet werden, die CRCs berechnen oder CRC-Code generieren können, z. B. Online-CRC-Berechnung oder pycrc, ein kostenloser CRC-Quellcode-Generator .

Craig McQueen
quelle