Für J-1850 ist die Berechnung einer CRC-8 Prüfsumme erforderlich.

Ebenso verwenden verschiedene Fahrzeughersteller in Ihren CAN-Bus Protokollen die Prüfsummenberechnung wie sie in der Norm für SAE-J1850 festgelegt ist:

Generator Polynom: x8 + x4 + x3 + x2 + 1   => 0x1D

 

Initialwert: 0xFF

Abschliessender XOr Wert: 0xFF

 

Beispiel  für eine CAN-Message  DLC=8  , D0-D6 = Daten  D7=CRC-8-Prüfsummen:

xxx 8 0x00  0xC0 0xDF 0xAC 0xAA 0x07 0x40 0x6C

 

 

Beispielimplementierung in C  (Cygwin Terminal) crc8.c:

#include "stdio.h"

unsigned char crc8(unsigned char *data ,int length) {
    unsigned long crc;
    int i,bit;

    crc = 0xFF;
    for ( i=0 ; i<length ; i++ ) {
        crc ^= data[i];
        for ( bit=0 ; bit<8 ; bit++ ) {
            if ( (crc & 0x80)!=0 ) {
                crc <<= 1;
                crc ^= 0x1D;
            }
            else {
                crc <<= 1;
            }
        }
    }

    return (~crc)&0xFF;
}

//Testdaten
unsigned char crcData[] = {0x00, 0xC0,0xDF,0xAC,0xAA,0x07,0x40};              // 0x6C  ==> Mercedes J1850


int main(int argc, char **argv) {
    unsigned int i;

    for (i=0; i<sizeof(crcData);i++) {
        printf("0x%02X ",crcData[i]);
    }
    
    printf("   ==>  CRC-8 = 0x%X\n", crc8((unsigned char*)crcData,sizeof(crcData)));

    return 0;
}

Compilieren mit:
gcc crc8.c -o crc8.exe

Starten des Programms:  ./crc8.exe


 


Hier ist noch ein interessantes Tool für CRC:

http://reveng.sourceforge.net


Aufruf dieses Tool, um obiges zu validieren:

$ ./reveng.exe -m crc-8 -p 1D -i FF -x FF -X -c "00C0DFACAA0740"
6C

 Hier kommt die gleiche Prüfsumme "6C" raus :-)