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 :-)