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 :-)