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.

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


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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.