Forum: Mikrocontroller und Digitale Elektronik CRC-16 mit M32C über 126 Byte Blöcke


von Marcus (Gast)


Lesenswert?

hallo,

ich arbeite mit einem Renesas M32C85 Controller, der CRC Register
integriert hat. D.h. man schreibt jeweils ein Byte in das CRCIN
register und nach 2 Takten liegt angeblich in CRCD der dazugehörige
CRC-16 (CCITT oder wie das poly heisst) wert.

wäre ja schön, wenn dies so wäre... leider kenne ich mich damit gar
nicht aus und mit 2 seiten im manual isses auch alles recht knapp
beschrieben.
hat damit jemand schon was gemacht?

meine hauptfrage besteht darin:
ich möchte 128 byte blöcke in einem EEPROM per page write speichern;
würde also gerne 126 byte daten mit dem CRC-16 sichern (=>128byte).
kann ich das CRCIN register so bedienen, dass ich 126 byte nacheinander
reinschiebe und der controller mir nach dem 126ten eine 16bit CRC zu
diesem block liefert?!?

danke im voraus!

von A.K. (Gast)


Lesenswert?

Ohne die Funktion des Controllers zu kennen, liegt freilich folgendes
Vorgehen nahe:
- Polynom (CCCIT/CRC16/...) definieren wenn möglich/nötig.
- CRC-Akkumulator initialisieren (0 oder ~0, je nach Polynom).
- Alle Bytes reinschieben.
- Akkumulierte CRC rausholen.

von Marcus (Gast)


Lesenswert?

hi,

danke erst mal. zu deinem post:
Polynom kann aus 3 standard polynomen gewählt werden, wobei ich das
normale CCCIT CRC-16 nehmen werde (einstellbar über 2 register bits).
CRC-Akku lässt sich ebenfalls initialisieren (0000 oder FFFF).
aber dann weiss ich halt nicht, ob ich einfach meine 126 Bytes
nacheinander in das 8 bit breite CRCIN register schieben kann (16
bittige CRC wert sollte dann in CRCD liegen), oder wie das überhaupt
funzt. müsste ja eigentlich auch eine maximale anzahl von bytes geben,
die man da sinnvoller weisse mit einem CRC-16 sichern kann, oder?!

hier mal der link zu dem (>3mb) datenblatt und die beschreibung der CRC
calculation (Seite 289-290):

http://eu.renesas.com/fmwk.jsp?cnt=Documentation.jsp&fp=/products/mpumcu/m16c_family/m32c80_series/m32c85_group/&title=Documentation&lid=52#

von Marcus (Gast)


Lesenswert?

zu dem link:
2ter von oben
...Hardware Manual

von A.K. (Gast)


Lesenswert?

Nu, passt doch. Das Polynom scheint festgelegt zu sein (wo sind die 2
Bits?). Anonsten wie oben beschrieben, CRCD = "CRC-Akku", mit 0
initialisieren, die Datenbytes nach CRCIN schieben, danach berechnete
CRC in CRCD abholen. Und nicht schneller als 1 Byte alle 2 Takte, wenn
das beim M32c überhaupt geht.

von Marcus (Gast)


Lesenswert?

die bits zum CRC setting stehen woanders, heissen aber CRC0 und CRC1 in
irgendeinem register. is ja auch egal...

also du verstehst das auch so, dass ich initialisiere, dann 126 mal 1
byte nacheinander reinschiebe und dann den CRC-16 wert zu diesen 126
byte in CRCD liegen habe!?
da muss man aber sicherlich noch ein bit setzen (CRC transmit oder
ähnlich) nach jedem byte... da muss ich noch mal schauen...

aber danke erst mal!

noch was:
kannst du da auch irgenwie erkennen, wie das ganze beim lesen, oder
verifizieren der rückgelesenen 128 byte später klappen soll?

von A.K. (Gast)


Lesenswert?

Sachte, CRC0/CRC1 gehören zu einer ganz anderen Baustelle/Schnittstelle,
haben hiermit nichts zu tun. Serielle Schnittstellen haben ihre eigenen
CRC-Generatoren.

Lesen/Schreiben ist hinsichtlich der CRC der gleiche Vorgang. Wobei
manche CRCs die Eigenheit haben, dass man beim Emfang den gesamten
Block mitsamt der empfangenen CRC reinschiebt, und bei korrekten Daten
anschliessend 0 rauskriegt. Aber ob man das nun so macht, oder schlicht
die CRCs vergleich, macht kaum einen Unterschied.

von A.K. (Gast)


Lesenswert?

Apropos: Kann es sein, dass Du mit dem M32c die Latte etwas arg hoch
gelegt hast?

von Marcus (Gast)


Lesenswert?

danke dir. hast recht... die anderen register gehören woanders hin...
sorry, aber die "Latte" habe leider nicht ich so hoch gelegt, sondern
die ist vorgegeben, da ich nur ein klitzekleines teil des ganzen
programmiere.
soweit komme ich mit dem aber auch klar. nur das mit dem CRC ist mir
nicht ganz klar geworden in dem manual.
danke dir noch mal!

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.