CAN CRC Berechnung: Unterschied zwischen den Versionen

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche
Zeile 3: Zeile 3:
[[Datei:CAN-Telegramm.png]]
[[Datei:CAN-Telegramm.png]]


<big>
{| class="wikitable"
{| class="wikitable"
|-
|-
Zeile 8: Zeile 9:
|-
|-
| '''Generatorpolynom (Divisor)'''
| '''Generatorpolynom (Divisor)'''
||X<sup>15</sup>+X<sup>14</sup>+X<sup>10</sup>+X<sup>8</sup>+X<sup>7</sup>+X<sup>4</sup>+X<sup>3</sup>+1
||X<sup>15</sup>+X<sup>14</sup>+X<sup>10</sup>+X<sup>8</sup>+X<sup>7</sup>+X<sup>4</sup>+X<sup>3</sup>+1<br />= 1100010110011001
1100010110011001
|}
|}


Zeile 16: Zeile 16:
Der einfachste Weg diese Division in einem µController durchzuführen besteht darin 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-Funktion verknüpft, was einer Substraktion entspricht. Das jeweilige Ergebnis wird dann wieder so weit nach links geschoben bis wieder eine 1 vorne steht und die nächste XOR Verknüpfung stattfinden kann.
Der einfachste Weg diese Division in einem µController durchzuführen besteht darin 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-Funktion verknüpft, was einer Substraktion entspricht. Das jeweilige Ergebnis 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.
Hier habe ich mal ein kleines Beispiel für die Berechnung dargestellt. Es handelt sich um ein empfangenes CAN Frame bei dem die Stufingbits schon entfernt wurden, 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>
<avrasm>
Zeile 60: Zeile 60:
                             0000010000101101 das ist die CRC Checksumme</avrasm>
                             0000010000101101 das ist die CRC Checksumme</avrasm>


Wenn der Divident kürzer als der Divisor geworden ist kann nicht mehr weiter geteilt werden und der 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.
Wenn der Divident kürzer als der Divisor geworden ist kann nicht mehr weiter geteilt werden und der Rest ist dann die CAN CRC Checksumme, die der Sender nach den Datenbytes anhängt hat. Der Empfänger vergleicht seine selbst errechnete Checksumme mit der Checksumme im CAN-Frame um zu überprüfen ob die Nachricht Fehler enthält.Ich habe das Linksschieben hier nicht mit aufgeführt, sondern den Divisor einfach unter die nächste 1 gesetzt habe.</big>

Version vom 26. Juni 2011, 12:35 Uhr

Berechnung einer CAN CRC Checksumme

CAN-Telegramm.png

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 um 15 Stellen erweiterten Dividenten durch den Divisor zu teilen, der Rest entspricht der CAN CRC Checksumme.

Der einfachste Weg diese Division in einem µController durchzuführen besteht darin 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-Funktion verknüpft, was einer Substraktion entspricht. Das jeweilige Ergebnis 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 empfangenes CAN Frame bei dem die Stufingbits schon entfernt wurden, 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>

Wenn der Divident kürzer als der Divisor geworden ist kann nicht mehr weiter geteilt werden und der Rest ist dann die CAN CRC Checksumme, die der Sender nach den Datenbytes anhängt hat. Der Empfänger vergleicht seine selbst errechnete Checksumme mit der Checksumme im CAN-Frame um zu überprüfen ob die Nachricht Fehler enthält.Ich habe das Linksschieben hier nicht mit aufgeführt, sondern den Divisor einfach unter die nächste 1 gesetzt habe.