Не пользуйтесь чужими функциями, не разобравшись как они работают. Вот кусок тестов (работает на 2148 и 2368) Почему-то, у меня не получилось работать со всеми заявленными допустимыми размерами. Но то что здесь - работает 100%
/* Коды команд IAP */
#define IAP_CMD_PREPARE 50
#define IAP_CMD_WRITE 51
#define IAP_CMD_ERASE 52
#define IAP_CMD_CHECK 53
#define IAP_CMD_PART 54
#define IAP_CMD_VERSION 55
#define IAP_CMD_COMPARE 56
/* Коды статуса */
#define CMD_SUCCESS 0
#define INVALID_COMMAND 1
#define SRC_ADDR_ERROR 2
#define DST_ADDR_ERROR 3
#define SRC_ADDR_NOT_MAPPED 4
#define DST_ADDR_NOT_MAPPED 5
#define COUNT_ERROR 6
#define INVALID_SECTOR 7
#define SECTOR_NOT_BLANK 8
#define SECTOR_NOT_PREPARED 9
#define COMPARE_ERROR 10
#define BUSY 11
typedef LPC_INT32U U32;
/* Точка входа в IAP */
#define IAP_LOCATION 0x7FFFFFF1
typedef void (*IAP)(U32[], U32[]);
U32 command[5];
U32 result[2];
/******************************************************************************
; Функция записи данных в сектор.
;******************************************************************************/
void flash_write(U32 Buf_Dst[], U32 Buf_Src[])
{
IAP iap_entry = (IAP)(IAP_LOCATION);
// Отключение прерываний.
__disable_interrupt();
// Отключение PLL.
PLLCON = 0x00;
PLLFEED=0xAA;
PLLFEED=0x55;
// Подготовка сектора к стиранию.
while (1)
{
command[0] = IAP_CMD_PREPARE;
command[1] = SECT_Settings_ROM;
command[2] = SECT_Settings_ROM;
command[3] = 0x00;
command[4] = 0x00;
iap_entry (command, result);
if (result[0] == CMD_SUCCESS){break;}
if (result[0] == BUSY){continue;}
goto flash_write_exit;
}
// Стирание сектора.
while (1)
{
command[0] = IAP_CMD_ERASE;
command[1] = SECT_Settings_ROM;
command[2] = SECT_Settings_ROM;
command[3] = 8000;
iap_entry (command, result);
if (result[0] == CMD_SUCCESS){break;}
if (result[0] == BUSY){continue;}
goto flash_write_exit;
}
// Подготовка сектора к записи.
while (1)
{
command[0] = IAP_CMD_PREPARE;
command[1] = SECT_Settings_ROM;
command[2] = SECT_Settings_ROM;
command[3] = 0x00;
command[4] = 0x00;
iap_entry (command, result);
if (result[0] == CMD_SUCCESS){break;}
if (result[0] == BUSY){continue;}
goto flash_write_exit;
}
// Запись сектора.
while (1)
{
command[0] = IAP_CMD_WRITE;
command[1] = (U32)(Buf_Dst);
command[2] = (U32)(Buf_Src);
command[3] = 512;//0x2000;
command[4] = 8000;
iap_entry (command, result);
if (result[0] == CMD_SUCCESS){break;}
if (result[0] == BUSY){continue;}
goto flash_write_exit;
}
flash_write_exit:
ConfigurePLL();