Tính toán CRC đơn giản


7

Trong biểu dữ liệu cho ET1200 EtherCAT ASIC (trang 94), tôi được cho biết rằng tôi cần tính CRC của một số dữ liệu 16 bit trong EEPROM của nó. Mô tả duy nhất về CRC này là:

Byte thấp [của từ 7] chứa phần còn lại của phép chia từ 0 đến từ 6 dưới dạng số không dấu chia cho đa thức x8+x2+x+1 (giá trị ban đầu 0xFF).

Vì một số lý do, đọc trang Wikipedia về Tính toán CRC khiến não tôi tan chảy. Đặc biệt vì mã ví dụ được viết bằng một ngôn ngữ đặc biệt.

Ai đó có thể vui lòng chỉ cho tôi biết những gì tôi cần thêm vào những gì, và thay đổi ở đâu và không có gì? Trong C tốt nhất là.

Câu trả lời:


10

Điều này nghe giống như 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;
}

Lấy từ: http://www.rajivchakravorty.com/source-code/uncerturdy/multidia-sim/html/crc8_8c-source.html

http://sbs-forum.org/marcom/dc2/20_crc-8_firmware_im THỰCations.pdf

Việc triển khai C không có bảng tra cứu (đặc biệt tốt cho chức năng tối ưu hóa CPU 8 bit):

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


Cảm ơn! Bây giờ tôi biết nó có một tên thích hợp, đột nhiên tôi có thể tìm thấy mã ví dụ cho nó trên Google.
Rocketmagnet

@joby, rất vui khi gặp lại bạn! Tâm trí mang một số thông tin từ các nguồn đó để chúng tôi không liên kết thối nhạy cảm?
Kortuk

@Kortuk Điểm công bằng, có bạn đi
Toby Jaffey

@JobyJaffey, và bạn đi. Hy vọng bạn quanh quẩn và trả lời một số câu hỏi!
Kortuk

Một vấn đề tôi gặp phải với mã này là đa thức, GP, không được sử dụng ở bất kỳ đâu trong mã. Vì vậy, CRC sử dụng đa thức nào để tính toán bảng CRC của nó :( Tuy nhiên, DI được sử dụng.
Owl

1

Nghe giống như thuật toán CRC-8 / ROHC. Theo Danh mục các thuật toán CRC được tham số hóa , các tham số của nó là:

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

Lưu ý rằng CRC-8 sử dụng cùng một đa thức, nhưng sử dụng giá trị ban đầu là 0x00không 0xFF. Nó cũng là một thuật toán "không phản xạ" (bit là MSbit đầu tiên). Thông số của nó là:

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

Các tham số này có thể được sử dụng với các công cụ khác nhau có thể tính toán CRC hoặc tạo mã CRC, chẳng hạn như tính toán CRC trực tuyến hoặc pycrc, trình tạo mã nguồn CRC miễn phí .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.