Hallo zusammen,
ben=F6tige wieder mal die Hilfe eines ARM7 bzw. C-Experten: Ich arbeite mit dem Keil Evakuation-Board mit dem 2368 von NXP und der Keil MDK Version 4.03. In meiner Software habe ich die Wahl, aus Kompatibilit=E4tsgr=FCnden = Daten =FCber den=20 I2C-Bus in ein externes RAM oder in den FLASH des Controllers zu = schreiben. Das Schreiben und Lesen ins RAM funktioniert einwandfrei, der CRC wird richtig = berechnet.
Das Speichern und Auslesen ins und aus dem FLASH funktioniert = anscheinend ebenfalls einwandfrei, nur bei der Berechnung des CRC nach dem Auslesen erhalte = ich ein falsches Ergebnis und wei=DF=20 nicht, weshalb. Die Daten werden richtig geschrieben und auch wieder = ausgelesen (jedenfalls lt. Debugger).
Wenn ich den CRC (ohne erneutes Schreiben oder Auslesen der Daten) 5 mal = berechnen lasse, erhalte ich 3 unterschiedliche Ergebnisse. Ich benutze haargenau die gleiche Routine und die gleichen Buffer wie = bei der Berechnung =FCber I2C.
Es werden im Flash keine Daten versehentlich =FCberschrieben oder = gel=F6scht. Auch stehen sie im Memory-Bereich an der richtigen Adresse. (Sie werden ja richtig ausgelesen.)
Wo ist der sch... Fehler?
Hat jemand eine Idee? Bin f=FCr jeden Hinweis oder Tip dankbar!
Freundlicher Gru=DF
Roland Kuhn
Hier mein Code (Ausz=FCge):
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=
#define START_ADRESS_DATA 0x00010000 // Startadresse Flashdaten
#define numFlash 512 // Blockgr=F6=DFe, Anzahl Bytes zum Schreiben
int i;
unsigned char rec_buf[numFlash]; unsigned char send_buf[numFlash]; long crc, crc_read;
for (i=3D0;i> 24)& 0xFF); // CRC anh=E4ngen send_buf[238]=3D(char)((crc >> 16)& 0xFF); // statt char > unsigned = char einstellen bringt nichts send_buf[239]=3D(char)((crc >> 8)& 0xFF); send_buf[240]=3D(char)(crc & 0xFF);
// hier die Daten =FCber den I2C-Bus ins RAM schreiben, funktioniert = einwandfrei send_to_ram(send_buf); // Daten ins RAM schreiben read_from_ram (rec_buf); // Daten aus RAM in rec_buf schreiben
crc=3Dcrc32i(&rec_buf[1],236); // CRC vom 1. Wert (nicht vom 0ten!) = =FCber 235 Bytes // berechnen crc_read=3D rec_buf[237]; crc_read=3D(crc_read>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=