Forum: Fahrzeugelektronik CAN-FD CRC-17 Berechnung stimmt nicht mit erhaltene CRC


von Eddy (Gast)


Angehängte Dateien:

Lesenswert?

Guten Tag,

Kann jemanden bitte mir sagen, was ich falsch mache bei der Berechnung 
CRC-17 folgender Nachricht (siehe auch CANoe Bild):
1
std::uint8_t msgReceived[61]={0,0,0,1,0,1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,1,0,1,1,0,1,0,0,0,0,0,1,0,0,1,0,1,0,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1};
2
3
// wo...
4
5
std::uint8_t bitsForCalculation[27] = { 0,   //SOF 
6
        0,0,1,0,1,1,0,0,1,0,1, // BASE-ID = 0x165
7
        0,                     // RRS Bit
8
        0,                     // IDE Bit
9
        1,                     // FDF Bit
10
        0,                     // res Bit
11
        0,                     // BRS Bit
12
        0,                     // ESI Bit
13
        0,0,1,0,0,             // DLC=0 (1x dynamisch Stuff Bit)
14
        0,0,1,1                // SBC=1 (Gray: 3) ** 1ste and 2te Fixed bits 
15
                               // nicht drin
16
};
17
18
std::uint32_t receivedCRC_17 = 0x1A049;

ABER... wenn ich es selber ausrechne, ich bekomme immer CRC_17 = 
**0xAD5** statt **0x1A049** wie es in CANoe ausgegeben wurde (siehe 
CANoe Screenshot).
Für die Berechnung habe ich alle Bits genommen, wie in die ISO 
vorgeschrieben ist [Seite 33]: SOF, Arbitration field, Control Field, no 
Data Field (DLC = 0), dynamischen Stuff Bits ohne Fixed Stuff Bits und 
SBC Feld [Stuff Bits Count] - siehe bitsForCalculation Code oben.

Basis der Kalkulation ist das Polynom CRC_17 = 0x3685B 
(Bin:110110100001011011). Hier einen Link wo man es online rechnen kann 
**
 (https://asecuritysite.com/comms/crc_div?a=1010101010&b=10001) **

Ich bitte um Hiiiilfe!!! Ich weiss nicht mehr was ich noch falsch mache 
oder ob ich etwas vergesse!

Vielen Dank im Vorab!

PS: Die msgReceived hat sogar EOF Recessive Bits am Ende, die sollen 
aber für die Berrechnung fällig irrelevant sein.

Gruß,

Ed

von Dieter (Gast)


Lesenswert?

Man muss beachten dass der Startwert für die CRC Berechnung nicht wie 
beim normalen CAN 0x0 ist sondern das MSB gesetzt hat. dann kommt 
0x1A049 anstelle 0x00AD5 als CRC raus.

von Eddy (Gast)


Angehängte Dateien:

Lesenswert?

Dieter schrieb:
> Man muss beachten dass der Startwert für die CRC Berechnung nicht wie
> beim normalen CAN 0x0 ist sondern das MSB gesetzt hat. dann kommt
> 0x1A049 anstelle 0x00AD5 als CRC raus.

Hallo Dieter,

Vielen Dank für die Antwort. Wenn ich das richtig verstanden habe, soll 
ich folgende array nehmen?:
1
std::uint8_t bitsForCalculation[24] = { 
2
        1,0,1,1,0,0,1,0,1, // BASE-ID = 0x165
3
        0,                     // RRS Bit
4
        0,                     // IDE Bit
5
        1,                     // FDF Bit
6
        0,                     // res Bit
7
        0,                     // BRS Bit
8
        0,                     // ESI Bit
9
        0,0,1,0,0,             // DLC=0 (1x dynamisch Stuff Bit)
10
        0,0,1,1                // SBC=1 (Gray: 3) ** 1ste and 2te Fixed bits 
11
                               // nicht drin
12
};

Wenn **NEIN**, ein bisschen Licht in dieser Dunkelheit bitte!!

Wenn **JA**, ich verstehe trotzdem nicht, da ich immer noch die 0x0AD5 
bekomme.
Ich habe es sogar mit Ihrer Anmerkung händisch gemacht (siehe Bild)... 
und ich  bekomme immer dasselbe Ergebnis :-(
Ich weiss, dass es evtl. eine dumme Kleinigkeit ist, aber ich sehe es 
nicht...

von Dieter (Gast)


Lesenswert?

Für die CRC Berechnung wird der Wert der CRC mit einem Startwert 
initialisiert. In der von Dir verlinkten Webseite mit der CRC Berechnung 
sehe ich keine Möglichkeit den Startwert einzugeben (das wird dann 
vermutlich immer 0x0 sein ohne es jetzt geprüft zu haben). Für die 
CAN-FD CRC braucht man aber einen Startwert der CRC mit gesetztem MSB, 
also hilft die Webseite nicht weiter.

von Dieter (Gast)


Lesenswert?

Bei diesem CRC Online Calculator kann man den Startwert für die CRC 
vorgeben:

https://leventozturk.com/engineering/crc/

Polxnomial: 110110100001011011
Input Data: 000101100101001000001000011
Initialise: 110000000000000000 (oder 000000000000000000 für 0xAD5)

Der Wert "110000000000000000" ist nötig weil man hier 18 Bit für das 
Register eingibt.

von Eddy (Gast)


Lesenswert?

Dieter schrieb:
> Bei diesem CRC Online Calculator kann man den Startwert für die CRC
> vorgeben:
>
> https://leventozturk.com/engineering/crc/
>
> Polxnomial: 110110100001011011
> Input Data: 000101100101001000001000011
> Initialise: 110000000000000000 (oder 000000000000000000 für 0xAD5)
>
> Der Wert "110000000000000000" ist nötig weil man hier 18 Bit für das
> Register eingibt.
Vielen Dank Dieter,
Du hast mir wirklich weitergeholfen. Es war die "Kleinigkeit" der 
CRC_INIT_VECTOR, dass ich übergesehen habe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.