Forum: Mikrocontroller und Digitale Elektronik CRC8 - Hilfe bei der Bildung des CRC8 über mehrere Bytes


von Jack (Gast)


Lesenswert?

Hallo,

ich habe zwar dutzende Beiträge zum Thema CRC8 gefunden, aber ich habe 
ein recht spezifisches Verständnisproblem.

Ich möchte die CRC8 Checksumme über mehrere Bytes bilden. Konkret möchte 
ich mit einem ATMEGA48 die CRC8 Checksummen des SMBus für einen MLX90614 
IR-Temperatursensor berechnen.
Die Berechnung des CRC8 von einem Byte funktioniert bereits problemlos.
Dazu habe ich einige Implementierungen nachvollzogen und letztendlich 
meine eigene geschrieben.

Möchte ich auf dem Papier den CRC8 von mehreren Bytes berechnen, 
schreibe ich diese hintereinander auf, rechne und komme aufs richtige 
Ergebnis.
Möchte ich diese Aufgabe effektiv mit einem 8-Bit AVR bewältigen, sagt 
mir die Theorie, dass ich den CRC des erstes Bytes berechne und diesen 
als SEED wieder in die CRC Berechnung des nächsten Bytes mit einfließen 
lasse.
Hier verlässt mich die Theorie... Es ist logisch, dass ich den Rest der 
letzten "Division" in die nächste mit einfließen lassen muss. Aber wie?

Ich fürchte meine Frage wird vielleicht nicht ganz klar.
Angenommen ich habe ein Polynom x^8+x^2+x^1+1 und ich möchte den CRC der 
Nachricht 0xB4 0xB4 berechnen. Dann stellt es für mich kein Problem da 
den CRC des ersten Bytes zu berechnen, dieser ist 0x05. Im nächsten 
Schritt kommt wieder 0xB4 als Datenbyte, ich habe 0x05 als SEED und nun?

Ich komme an dem Punkt nicht weiter... Egal wie viel ich recherchiere...

Danke, fürs lesen meiner Frage.
Ich freue mich auf Antworten

von Karl H. (kbuchegg)


Lesenswert?

Sch dir halt an, wie andere das machen. Du bist ja nicht der erste, der 
eien CRC8 berechnet

http://websvn.hylands.org/filedetails.php?repname=Projects&path=%2Fcommon%2FCrc8.c&sc=1
1
uint8_t Crc8Block( uint8_t crc, uint8_t *data, uint8_t len )
2
{
3
    while ( len > 0 )
4
    {
5
        crc = Crc8( crc, *data++ );
6
        len--;
7
    }
8
9
    return crc;
10
11
} // Crc8Block

einfach nacheinander alle Bytes durch die CRC8 Funktion durchschleusen, 
wobei das Ergebnis eines Funktionsaufrufs als Vorgabe des zu 
modifizierenden CRC Wertes für den nächsten dient.

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.