Forum: Mikrocontroller und Digitale Elektronik Sent Protokoll CRC berechnen


von Sam (Gast)


Angehängte Dateien:

Lesenswert?

hallo zusammen,

Für die Implementierung des SENT-Protokolls sind die Datenbytes 6, also
24-Bit-Daten, einschließlich eines Statushalbbytes, eines CRC-Halbbytes
und eines Pausenimpulses.

Ich muss den CRC für 6 Daten-Nibbles berechnen. Der erste Wert für die
CRC-Berechnung ist, wie ich weiß, 5.

Aber wenn ich das Signal mit Ozs dekodiere. bekomme ich einen Fehler in
der Nachricht, weil ich zufällige Werte für CRC und für Status-Nibble
sende. nun zu meinen Fragen: Wie kann ich den CRC-Wert und die
Status-Nibbles berechnen?

ich habe den folgenden code gefunden:

uint8_t calculatedCRC, i;
const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11,
15, 2, 8, 5};
calculatedCRC = 5; // initialize checksum with seed "0101"

for (i = 0; i < 6; i++)
{
calculatedCRC = CrcLookup[calculatedCRC];
calculatedCRC = (calculatedCRC ^ Data[i]) & 0x0F;
}
// One more round with 0 as input
calculatedCRC = CrcLookup[calculatedCRC];



aber wenn ich die For-Schleife wie folgt folge,dann ist dies nach der
ersten Iteration nicht möglich, da der berechnete calculatedCrc wird 11
^ 11 sein . Ich brauche eure Hilfe, bitte!

1)  i=0 >>> calculatedCRC== 11
2)  i=1 >>> calculatedCRC==
3)  i=2 >>> calculatedCRC
4)  i=3 >>> calculatedCRC
5)  i=4 >>> calculatedCRC
6)  i=5 >>> calculatedCRC

von Tiramisu (Gast)


Lesenswert?

1. In der Schleife wird auf Data[] zugeriffen, wenn Du wirklich
   jemand dazu bekommen solltest, die sechs einfachen Schritte fuer
   Dich zu tun, sollte das nicht fehlen.
2. Ich vermute, Dein Problem liegt tiefer, das "^" denotiert ein EXOR.

von Sam (Gast)


Lesenswert?

Tiramisu schrieb:
> Ich vermute, Dein Problem liegt tiefer, das "^" denotiert ein EXOR.

Ach mensch. das ist nicht 11 hoch 11.danke dir

von Sam (Gast)


Lesenswert?

könntest du mir bitte sagen, wie man auf diese Tabelle kommen kann ?

const uint8_t CrcLookup[16] = {0, 13, 7, 10, 14, 3, 9, 4, 1, 12, 6, 11,
15, 2, 8, 5};

von Achim M. (minifloat)


Lesenswert?


: Bearbeitet durch User
von Robert-hh (Gast)


Lesenswert?

Sam schrieb:
> könntest du mir bitte sagen, wie man auf diese Tabelle kommen kann ?

Anbei ein kleines Python Script, welches die Tabelle erzeugt. 
EINgabgrößen sind die Bitlänge des CRC und das Polynom. Insofern kann es 
leicht für andere Polynome und Bitlängen verwendet werden. Hinweis: Im 
kommentar steht ^ für Potenzieren, im Code für XOR.
1
bits = 4
2
polynome = 0b1101  # (x^4 +) x^3 + x^2 + 1  (1 is x^0 -> lowest bit set, x^4 is implicit set)
3
4
uprmask  = 1 << (bits - 1)  # Masking the upper bit of the crc
5
entries = 2 ** bits
6
crcmask = entries - 1
7
crctab = bytearray(entries)
8
9
10
for i in range(entries):
11
    crc = i
12
    for _ in range(bits):
13
        crc = ((crc << 1) ^ (polynome if (crc & uprmask) else 0))
14
    crctab[i] = crc & crcmask
15
16
print("crc%d_tab = (" % bits, end="")
17
for i in range(entries):
18
    print("%d" % crctab[i], end="")
19
    if (i == (entries - 1)):
20
        print(")")
21
    elif ((i % 16) == 15):
22
        print(",\n            ", end="")        
23
    else:
24
        print(", ", end="")

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.