Was the flash erased beforehand? Here is the code I've used for programming flash. It is in use in the field in a very large number of installations. It is in IAR format but the conversion should be easy.
Regards -Bill Knight R O SOftWare flash.h ------ #ifndef INC_FLASH_H #define INC_FLASH_H #include "typedefs.h" void flashEraseSector(void *addr); void flashProgramBlock(void *addr, void *data, uint16 count); #define flashProgramMemory(addr, data) flashProgramBlock(addr, data, sizeof (data)); #endif flash.c ------- #define FCLK_FREQ (450e3) // flash programming clock frequency #define FCLK_DIVIDER (MCLK / FCLK_FREQ) // good from 1 to 64 /****************************************************************************** * * Function Name: void _flashControl() * * Description: * This low level function checks the value of 'count' and if * non-zero writes the referenced data to flash. If it is zero, it * erases the flash sector containing the address. * * Calling Sequence: * uint8 *addr destination address in flash * uint8 *data pointer to data to write * uint16 count number of bytes to write * * Returns: * void * * NOTE: this function is marked 'monitor' so the compiler will save * the current interrupt state on entry and restore it on exit. *****************************************************************************/ static monitor void _flashControl(uint8 *addr, uint8 *data, uint16 count) { uint8 ie1; ie1 = IE1; // get current interrupt enables IE1 &= ~(NMIIE | ACCVIE | OFIE); // disable enabled interrupts FCTL2 = FWKEY + // key FSSEL_1 + // use MCLK FCLK_DIVIDER; // setup divider - 1..64 FCTL3 = FWKEY; // LOCK = 0 if (count) { FCTL1 = FWKEY | WRT; // set WRITE bit do // loop through, writing the data *addr++ = *data++; while (--count); } else { FCTL1 = FWKEY | ERASE; // set ERASE bit *addr = 0; // write to address in sector to start erase } FCTL1 = FWKEY; // clear WRITE/ERASE bit FCTL3 = FWKEY | LOCK; // LOCK = 1 IE1 = ie1; // restore interrupt enables } /****************************************************************************** * * Function Name: void flashEraseSector() * * Description: * Erase one flash sector * * Calling Sequence: * void *addr address within sector to be erased * * Returns: * void * *****************************************************************************/ void flashEraseSector(void *addr) { _flashControl(addr, NULL, 0); } /****************************************************************************** * * Function Name: void flashProgramBlock() * * Description: * Program a block of data in flash * * Calling Sequence: * void *addr destination address in flash * void *data pointer to data to write * uint16 count number of bytes to write * * Returns: * void * *****************************************************************************/ void flashProgramBlock(void *addr, void *data, uint16 count) { _flashControl(addr, data, count); }