Calcular un CRC simple

7

En la hoja de datos de ET1200 EtherCAT ASIC (página 94), estoy dijo que necesito calcular un CRC de algunos de los datos de 16 bits en su EEPROM. La única descripción de este CRC es:

  

El byte bajo [de la palabra 7] contiene el resto de la división de la palabra 0 a la palabra 6 como un número sin signo dividido por el polinomio \ $ x ^ 8 + x ^ 2 + x + 1 \ $ (valor inicial 0xFF).

Por algún motivo, leer la página de Wikipedia en Calcular un CRC hace que mi cerebro se derrita. Sobre todo porque el código de ejemplo está escrito en un lenguaje especial.

¿Puede alguien, por favor, simplemente decirme qué necesito agregar a qué, y cambiar de lugar y qué? En C preferentemente.

    
pregunta Rocketmagnet

2 respuestas

9

Esto suena como 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;
}

Tomado de: enlace

enlace

Implementaciones de C sin tabla de búsqueda (especialmente buena para la función optimizada de CPU de 8 bits):

enlace

    
respondido por el Toby Jaffey
1

Eso suena como el algoritmo CRC-8 / ROHC. De acuerdo con el Catálogo de algoritmos CRC parametrizados , su los parámetros son:

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

Tenga en cuenta que CRC-8 utiliza el mismo polinomio , pero utiliza un valor inicial de 0x00 , no 0xFF . También es un algoritmo "no reflejado" (los bits son primero MSbit). Sus parámetros son:

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

Estos parámetros se pueden usar con varias herramientas que pueden calcular CRC o generar código CRC, como Cálculo de CRC en línea o pycrc, un generador gratuito de código fuente de CRC .

    
respondido por el Craig McQueen

Lea otras preguntas en las etiquetas