Guten Tag zusammen, ich versuche das Flash meines MSP430F2618 zu beschreiben, genau zu sagen das Information Memory. Das ganze geschieht während dem Programmablauf. und es funktioniert auch, wenn ich das Segment vorher lösche, bevor ich es schreiben will. Wenn das flash nur geschrieben wird, ohne das segment zu löschen dann stehts neues drin. Kann mir jemand sagen wo das problem liegt? hier mein code: uint8 nv_write( uint8 *addr, uint16 len, uint8 *buf ) { uint8 rtrn = NV_SUCCESS; if ( (len != 0) && (addr>=(uint8*)0x1000) && (addr<=(uint8*)0x10BF) ) { //flashErasePage(addr); <-- damit funktionierts, ohne nicht flashWrite(addr, len, buf); while ( len-- ) { if(*addr++ != *buf++) { rtrn = NV_FAILURE; } } } else { rtrn = NV_FAILURE; } return rtrn; } void flashWrite( uint8 *addr, uint16 len, uint8 *buf ) { initFlash(); FCTL3 = FWKEY; // Clear Lock bit FCTL1 = FWKEY + WRT; // Set WRT bit for write operation while ( len-- ) { *addr++ = *buf++; // Write value to flash } FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit doneFlash(); } STATIC void initFlash(void) { HAL_ENTER_CRITICAL_SECTION( fuIntState ); // Hold off interrupts. s_savWDT = WDTCTL & 0xFF; WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer FCTL2 = FWKEY + FSSEL_1 + FN5 + FN3 + FN1 + FN0; // 363kHz } STATIC void doneFlash() { // restore WDT WDTCTL = WDTPW + s_savWDT; HAL_EXIT_CRITICAL_SECTION( fuIntState ); // Re-enable interrupts. return; } void flashErasePage(uint8 *addr) { initFlash(); FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit *addr = 0; // Dummy write to erase Flash segment FCTL1 = FWKEY; // Clear ERASE bit FCTL3 = FWKEY + LOCK; // Set LOCK bit doneFlash(); return; } Vielen Dank für eure Hilfe.
Ohne genau zu wissen, was Du da machst, würde ich sagen, daß Flash vor dem schreiben immer gelöscht werden muß, also alle Bits eines Bytes müssen vor dem Schreiben "1" sein, das Schreiben setzt die betreffenden Bits auf "0".
>Wenn das flash nur geschrieben wird, ohne das segment zu löschen dann >stehts neues drin. Was bedeutet das?
Du weisst, dass beim Programmieren des Flashs die Bits nur von 1 auf 0 gesetzt werden können? --> Wenn flash nicht leer und du willst was definiertes haben, musst du vorher löschen. Peter
@Jörg S. : nichts neues sollte es heissen. das mit dem löschen habe ich befürchtet, ich habe es einfach nicht im MSP430x2xx Family User's Guide gefunden. der nachteil ist einfach das es von den ca 10'000 mal die man das flash beschreiben kann, immer gleich 2 abgezogen werden durch (löschen/schreiben), oder?
Flash neu beschreiben ohne vorher zu löschen ist prinzipiell schon möglich, allerdings können dabei -wie schon gesagt- lediglich bits von '1' auf '0' gesetzt werden, nicht umgekehrt! Es gibt aber Grenzen, der "Wiederbeschreibbarkeit"! Les Dir mal das hier durch, insbesondere Kap3.2 und Kap3.3: http://focus.ti.com/lit/an/slaa334a/slaa334a.pdf
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.