Forum: Mikrocontroller und Digitale Elektronik MSP430 CRC-Check des ROM's


von Tomi T. (Firma: xxx) (kaptainchaos)


Lesenswert?

Moin,
ich versuche zurzeit einen CR-Check des ROM’s in meinem MSP430 zu 
implementieren, leider bringen mich die im Netz und hier im Forum 
gefundenen Infos nicht weiter. Das Projekt lässt sich ohne Fehler 
kompilieren und eine Checksumme wird erstellt, welche ich im .map-file 
finde.
Folgendes Einstellungen wurden getätigt:
Im Linker habe ich IAR mitgeteilt das es eine Checksumme erstellen soll, 
mit folgenden Parametern:

Size: 2bytes;  CRC16 (0x11021); Complement As is; Bit order MSB first; 
Alignment: 2

Zusätzlich habe ich nach einem Beispiel in der .xcl-Datei folgendes 
eingefügt:

//-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT,CHECKSUM=2100-FFBD
-Z(CONST)DATA16_C,DATA16_ID,DIFUNCT=2100-FFBD
-Z(CONST)CHECKSUM#2100-FFBD*

Im der Main werden dann beim Systemstart folgende Unterprogramme 
aufgerufen:
1
sum = fast_crc16(sum,(unsigned char *)0x2100, 0xFFBB-0x2100+1);
2
sum = fast_crc16(sum,(unsigned char *)0xFFBC, 2);
Die Werte über welchen Bereich die Checksumme erstellt wurde (0x2100 & 
0XFFBB) und die Position der Checksumme habe ich nach dem Kompilieren 
aus der .map-Datei.
Zur Berechnung der Checksumme verwende ich folgenden Code:

1
unsigned short 
2
fast_crc16(unsigned short sum, unsigned char *p, unsigned short len)
3
  {   
4
   while (len--)
5
   sum = crc16_table[(sum >> 8) ^ *p++] ^ (sum << 8);
6
   return sum; 
7
  }

Hinter crc16_table befindet sich eine Tabelle, mit dem vielfachen von 
0x1021 zur Berechnung des Polynoms.
Bei dem verwendeten MSP430 handelt es sich um den MSP430F2410.
Wie schon geschrieben scheint es so als würde die Checksumme korrekt 
hinterlegt werden, leider stimmt die errechnete Checksumme nicht mit der 
gespeicherten überein.
Vielleicht hat ja jemand einen Tipp oder findet einen Fehler in meiner 
Überlegung.

Schon einmal vielen Dank für die Hilfe :-)

von Erich (Gast)


Lesenswert?

Mit dem MSP430 kenne ich mich konkret nicht aus.
Hoffe aber trotzdem was beitragen zu können.

Es gibt unterschiedliche Varianten von CRC16, siehe
http://de.wikipedia.org/wiki/Zyklische_Redundanzpr%C3%BCfung#Polynome_und_Typen
(zusätzliche Hinweise am Textende unten).

Weiter ist (natürlich) zu beachten, daß der Speicherort (mit Inhalt 
0xFFFF) der Soll-CRC nicht in die vom Linker gemachte CRC-Erstellung 
eingehen darf.

Wichtig ist bei Angabe der "oberen" Adresse auch immer, ob deren Inhalt 
noch eingeht oder eben nicht mehr mit eingeht. Ob also die Anzahl <Ende> 
- <Start> ist, oder <Ende> - <Start> + 1 .

Auch gibt es unabhängige Tools, die eine CRC aus einem .hex File (u.a.) 
erstellen können. Dort müssen dann ebenso als Parameter der/(die) 
Adressbereich(e), die Zieladresse der zu erstellenden CRC, sowie deren 
Typ definiert werden.
Ein solches Tool ist z.B.  SRecord   http://srecord.sourceforge.net/
In der zugehörigen Dokumentation  srecord-1.56.pdf  sind auf Seite 51+52 
auch etliche Hinweise zu Varianten des CRC16 beschrieben.

Erich

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.