Не пользуйтесь чужими функциями, не разобравшись как они работают. Вот кусок тестов (работает на 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();