Forum: Mikrocontroller und Digitale Elektronik 1 Wire CRC STM32


von Leopold N. (leo_n)


Angehängte Dateien:

Lesenswert?

Hi,

ich versuche gerade, die CRC Berechnung von Maxim mit der 8Bit CRC nach 
AN187 durchzuführen. Dafür möchte ich das STM32-interne CRC Modul 
benutzen (STM32L010RBT6). Dazu verwende ich den Code aus dem Anhang. Das 
Problem ist, dass die falsche Prüfsumme am Ende rauskommt. Getestet habe 
ich gegen diese Website (https://www.lddgo.net/en/encrypt/crc) und gegen 
den empfangenen CRC Code. Der ausgelesene 64-Bit ROM Code ist: 
0x6472779C1E64FF28.
Der CRC Code ist ja dann 0x64 (was die Website auch korrekt berechnet).
Den CRC Datenstrom schiebe ich wie folgt in das CRC_DR:
0x28
0xFF
0x64
0x1E
0x9C
0x77
0x72

Doch schon für das erste Byte (0x28) wird ein CRC Wert von 0x3F aus dem 
CRC_DR ausgelesen, die Website sagt für diesen Wert einen CRC Code von 
0xE1.

Ich verstehe nicht was ich jetzt falsch mache.
Die Registerwerte des initialisierten CRC Moduls sind im Anhang.

Danke schonmal im Voraus

von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Leopold N. schrieb:
> Dazu verwende ich den Code aus dem Anhang. Das
> Problem ist, dass die falsche Prüfsumme am Ende rauskommt. Getestet habe
> ich gegen diese Website (https://www.lddgo.net/en/encrypt/crc) und gegen
> den empfangenen CRC Code.

Stimmen da überhaupt der Startwert und Polynom überein? Du verrätst uns 
ja leider nicht mit was für Werten du die Funktion aufrufst und auch 
nicht mit welchen Werten du auf der Webseite getestet hast. Man sieht 
auch nicht wie du das Array mit den 8Bit-Werten überhaupt 
verarbeitest...

von Leopold N. (leo_n)


Lesenswert?

Dadurch, dass die richtige Prüfsumme (0x64) rauskommt, vermute ich mal 
stark, dass die richtigen Parameter gewählt wurden. Als Algorithm muss 
man natürlich  CRC-8-MAXIM auswählen. Der Startwert steht im CRC_INIT 
Register (0x00) und das Polynom ist 0x31 im CRC_POL Register.

: Bearbeitet durch User
von Leopold N. (leo_n)


Lesenswert?

Irgend W. schrieb:
> Man sieht
> auch nicht wie du das Array mit den 8Bit-Werten überhaupt
> verarbeitest...

Ich schreibe nacheinander die Werte

Leopold N. schrieb:
> 0x28
> 0xFF
> 0x64
> 0x1E
> 0x9C
> 0x77
> 0x72

in das CRC_DR Register und lese danach den Wert aus dem CRC_DR Register 
aus.

von N. M. (mani)


Lesenswert?

Caste dein DR Pointer Mal explizit auf 8 Bit bevor du drauf schreibst. 
Ich hatte damals, als ich die Routinen für mich geschrieben habe, damit 
Probleme weil dann teilweise ein 32 Bit Zugriff auf das Register 
stattfand.

P.S. Code als Bild ist suboptimal.

: Bearbeitet durch User
von Dieter S. (ds1)


Lesenswert?

Leopold N. schrieb:

> Doch schon für das erste Byte (0x28) wird ein CRC Wert von 0x3F aus dem
> CRC_DR ausgelesen, die Website sagt für diesen Wert einen CRC Code von
> 0xE1.
>
> Ich verstehe nicht was ich jetzt falsch mache.

Die REV_IN und REV_OUT Einstellungen sind falsch (die müssen beide 
gesetzt werden). Wenn man die CRC so berechnet wie das CRC Modul 
konfiguriert ist kommt 0x3F heraus und nicht 0xE1.

von Leopold N. (leo_n)


Lesenswert?

Ok, also REV_IN und REV_OUT zu setzen in Kombination mit explizitem 
8-Bit Zugriff hat geholfen.

Vielen Dank.

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.