CAN CRC Berechnung
Berechnung einer CAN CRC Checksumme
CAN Frame von SOF bis Datenbit0 (Divident) | 00000100100000000100000000001110111 |
Generatorpolynom (Divisor) | X15+X14+X10+X8+X7+X4+X3+1
1100010110011001 |
Im Prinzip geht es darum den Dividenten durch den Divisor zu teilen, der Rest entspricht der CAN CRC Checksumme.
Der schnellste Weg diese Division in einem µController durchzuführen besteht daran den Dividenten so weit nach links zu schieben bis eine 1 auf der linken Seite steht. Nun wird der vordere Teil des Dividenten mit dem Divisor einer XOR Verknüpfung unterbunden, was einer Substraktion entspricht. Das jeweilige Ergebniss wird dann wieder so weit nach links geschoben bis wieder eine 1 vorne steht und die nächste XOR Verknüpfung stattfinden kann.
Hier habe ich mal ein kleines Beispiel für die Berechnung dargestellt. Es handelt sich um ein CAN Frame mit einem 11 bit Itendifier und 2 Bytes Datenlänge was sich im ungünstigsten Fall durch einen 29 bit Itendifier und 32 Datenbits auf insgesamt 69 Stellen ausweiten kann.
<avrasm> 100100000000100000000001110111000000000000000 1100010110011001||||||||||||||||||||||||||||| XOR
|||||||||||||||||||||||||||||
01010101100100010||||||||||||||||||||||||||||
1100010110011001|||||||||||||||||||||||||||| XOR ----------------|||||||||||||||||||||||||||| 01101110101110110||||||||||||||||||||||||||| 1100010110011001||||||||||||||||||||||||||| XOR ----------------||||||||||||||||||||||||||| 0001100011101111000|||||||||||||||||||||||| 1100010110011001|||||||||||||||||||||||| XOR ----------------|||||||||||||||||||||||| 0000001011100001001110|||||||||||||||||| 1100010110011001|||||||||||||||||| XOR ----------------|||||||||||||||||| 01111101110101111||||||||||||||||| 1100010110011001||||||||||||||||| XOR ----------------||||||||||||||||| 001111100011011011||||||||||||||| 1100010110011001||||||||||||||| XOR ----------------||||||||||||||| 001111010100001000||||||||||||| 1100010110011001||||||||||||| XOR ----------------||||||||||||| 001100001001000100||||||||||| 1100010110011001||||||||||| XOR ----------------||||||||||| 000001111101110100000|||||| 1100010110011001|||||| XOR ----------------|||||| 001111100011100100|||| 1100010110011001|||| XOR ----------------|||| 001111010111110100|| 1100010110011001|| XOR ----------------|| 001100000110110100 1100010110011001 XOR ---------------- 0000010000101101 das ist die CRC Checksumme</avrasm>
Der Divident wird solange nach links geschoben bis eine 1 vorne steht, nun kann man vom vorderen Teil des Dividenten den Divisor mit einer XOR Verknüpfung abziehen, das wiederholt sich solange bis keine weitere XOR Verknüpfung mehr durchgeführt werden kann weil der Divident kürzer als der Divisor geworden ist. Dieser Rest ist dann die CAN CRC Checksumme, die der Sender nach den Datenbytes mit anhängt. Ich habe das Linksschieben hier nicht mit aufgeführt, sondern den Divisor einfach unter die nächste 1 gesetzt habe.