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!
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.
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#
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.
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?
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.
Apropos: Kann es sein, dass Du mit dem M32c die Latte etwas arg hoch gelegt hast?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.