I need to store my boards network ID into nonvolatile memory. I have been using the page_erase() and write_flash_chk():
page_erase(PAGE_START, 0xFF, FDM); write_flash_chk(PAGE_START, NewAddr, FDM);
PAGE_START = 0x0400
//FLASH WRITE CONFIGURATION USEC = 0x0C; //tFWT = 32.5 us MSECH = 0x4E; //MSEC for tFET = 10 ms MSECL = 0x20; // @32 MHz FTCON = 0xFF; //FWR = 0x0F & FER = 0x0F
Turning off those interrupts was a cure of symptoms. The problem is that you're erasing a page, which contains not only data, but also code. You can't seriously be surprised that erasing part of the code of your program in mid-operation makes the system somewhat less than reliably. As I said: the solution is to tell the linker not to put any code in that area, period. And even then you may have to turn off interrupts for the time being, depending on whether that EEROM is capable of reading from one page while writing/erasing another.