Forum: Mikrocontroller und Digitale Elektronik 6bit CRC check on SENT slow channel Nachricht


von Reinhard (reinhard_k118)


Lesenswert?

Hallo bin gerade an einem SENT Bus Decoder. Die Fast Channel Nachricht 
kann ich mittels CRC 4 des SENT Frame dekodieren. Wenn ich nun 18 
Nachrichten einer Slow Channel Nachricht dekodiere scheint diese auch zu 
stimmen. Ich finde aber nichts wie man die 6 Bit CRC der Slow Message 
berechnet. Hat da jemand eine Tipp für mich.

Die ersten 6 Bit der zwei Datenströme sind 111111b beim B3 und im B2 
Strom eine CRC von 13d
Dann folgen:
Bit2 Datenstrom ist 110000000000b
Bit3 Datenstrom ist 001100000000b
Ist dekodiert eine Message ID von 0x06 und einem Datenwert von 0x03. Das 
stimmt mit dem Datenblatt bzw. SAE J2716 überein. Nur weiß ich nicht wie 
ich auf die CRC von 13d komme.

Vielen Dank

von Achim M. (minifloat)


Lesenswert?

Hier...
https://github.com/hoonjet/CheckSumForSENTprotocol
... hat jemand die 4- und die 6-Bit CRC als Matlab-Code abgelegt. 
Vielleicht kannst du das portieren?

mfg mf

von Reinhard (reinhard_k118)


Lesenswert?

Hab ihn mal mit einer Trial geöffnet. Hilft aber nicht wirklich. Sagt 
nämlich wenig aus darüber welche Daten in die Funktion gehen. Es gibt da 
eine Masterarbeit die kurz erwähnt, dass die Daten "in einer bestimmten 
Reihenfolge" in die CRC Funktion reinfließen müssen. Hätte das mal 
nachgebaut mit dem Polynom von der Matlab Funktion funktioniert aber 
nicht. Und die Masterarbeit beschreibt die CRC nicht weiter im Detail. 
(Seite 28)
https://diglib.tugraz.at/download.php?id=5b6d299123406&location=browse

von Reinhard (reinhard_k118)


Lesenswert?

Der Vollständigkeit Halber:
1
static const unsigned char crc6_table[] = {
2
    0, 25, 50, 43, 61, 36, 15, 22, 35, 58, 17, 8, 30, 7, 44, 53,
3
    31, 6, 45, 52, 34, 59, 16, 9, 60, 37, 14, 23, 1, 24, 51, 42,
4
    62, 39, 12, 21, 3, 26, 49, 40, 29, 4, 47, 54, 32, 57, 18, 11,
5
    33, 56, 19, 10, 28, 5, 46, 55, 2, 27, 48, 41, 63, 38, 13, 20
6
};
7
8
static unsigned char SYS_sent_calculateCRC6(unsigned char *data) {
9
  unsigned char checkSum6 = 21; // initialize checksum
10
11
  for(int i=0; i<4; i++){
12
    checkSum6 = data[i] ^ crc6_table[checkSum6];
13
  }
14
  checkSum6 = 0 ^ crc6_table[checkSum6]; 
15
16
  return checkSum6;
17
}
Der Pointer data muss dabei auf die 4 aufbereiteten Bytes zeigen so wie 
sie in der Masterarbeit beschrieben sind.

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.