Wie funktioniert eine CRC-Prüfung zwischen Mikrocontroller und EEPROM?

Ich habe eine Kommunikation zwischen einem EEPROM und einem Mikroprozessor über SPI und möchte mich um die Datenintegrität kümmern.

Könnten Sie bitte mein Verständnis unten bestätigen?

Ich habe Daten, die ich zusammen mit einem CRC-Code in das EEPROM schreiben möchte. Vor dem Schreiben in EEPROM verwende ich ein CRC16-Polynom, um einen CRC-Code zu generieren und ihn an die Daten anzuhängen und über SPI an das EEPROM zu senden.

Wenn ich das EEPROM nach dem Zurücksetzen des Systems lese oder die Zeit erneut über SPI vom Mikrocontroller abstimme, werden die Daten zusammen mit dem CRC-Code gelesen (Daten + CRC) und durch dasselbe CRC16-Polynom geteilt, um es mit dem Rest Null zu überprüfen? Wenn Nulldaten gut sind, sonst nicht.

Könnten Sie bitte bestätigen, ob mein obiges Verständnis richtig ist?

Ich muss nur die Datenintegrität für einen Speicherblock implementieren, und dafür führe ich eine doppelte CRC-Prüfung für einen einzelnen Speicherblock durch, indem ich einen redundanten Block implementiere.

Mit einer Prüfsumme (das Addieren aller Bytes) können Sie das Ergebnis entweder nur Nullen oder nur Einsen haben. Bei einem CRC ist dies nicht zu erwarten, nicht normal. Sie führen alle außer den CRC-Bytes durch den Algorithmus und vergleichen dann mit den CRC-Bytes auf dem Eeprom.
@old_timer Entweder das, oder den CRC von Daten + CRC berechnen und einen konstanten Prüfwert erwarten, der im einfachsten Fall auf Null gesetzt werden kann. Es wurde unten bereits besprochen.
Nun, sicherlich nicht einfach auf Null zu bringen, das erfordert entweder einen schwachen CRC oder viele Füllbytes, die verwendet werden, um das Endergebnis abzustimmen. Im Allgemeinen möchten Sie keinen schwachen CRC, also überprüfen Sie im Allgemeinen die Bytes. Die Ausnahme wäre, unabhängig von der Nutzlast nach einem festen Ergebnis zu suchen. Für eine Prüfsumme ist es dann üblich, die Fülldaten zu integrieren, um ein festes Ergebnis zu erzielen, eher normal als Ausnahme.

Antworten (1)

Der Rest wird immer derselbe sein, aber ob er immer Null oder etwas anderes ist, hängt vom genauen CRC-Algorithmus ab, nämlich dem "final xor".

Wenn Sie beispielsweise 10 Byte an Daten schreiben müssen und aus diesen Daten 2 Byte CRC berechnet haben, schreiben Sie 12 Byte in den Speicher.

Wenn Sie zurücklesen, lesen Sie alle 12 Bytes, berechnen den CRC aus den ersten 10 Bytes und überprüfen, ob der berechnete CRC mit den 2 Bytes des aus dem Speicher zurückgelesenen CRC übereinstimmt.

Es gibt auch eine andere Methode, um den CRC aller 12 zurückgelesenen Bytes zu berechnen. Sie summiert sich zu einem konstanten Prüfwert, wenn der CRC korrekt ist, aber je nach verwendetem CRC-Algorithmus kann das Ergebnis immer Null sein, aber es kann etwas sein sonst auch.

Danke, stimme mit meinem Verständnis überein.
Es ist Null, wenn das letzte Wort CRC ist. CRC(Daten+CRC)=0
@MarkoBuršič es wird Null sein, wenn der Algorithmus zur Berechnung des CRC über CRC und Daten kein abschließendes xor enthält. Daher kann der Prüfwert immer null oder eine andere Konstante sein, die nicht null ist, je nachdem, welcher Algorithmus verwendet wird.