Цитата(EXeGLuMATOR @ Apr 2 2008, 11:51)

command[0]= IAP_PREPARE_SECTOR; // IAP Command: Prepare Sectors for Write (50)
а чему равно IAP_PREPARE_SECTOR? Бывает указывают 0x50... Прерывания не забываете запрещать? В конце ОЗУ не забыли зарезервировать область 32 байта для IAP чтобы в нее случайно стек не залез?
Код
// (Philips) Status Codes
enum iap_status_t
{
CMD_SUCCESS, INVALID_CMD,
SRC_ADDR_ERROR, DST_ADDR_ERROR, SRC_ADDR_NOT_MAPPED, DST_ADDR_NOT_MAPPED,
COUNT_ERROR, INVALID_SECTOR, SECTOR_NOT_BLANK, SECTOR_NOT_PREPARED,
COMPARE_ERROR, BUSY, PARAM_ERROR, ADDR_ERROR, ADDR_NOT_MAPPED,
CMD_LOCKED, INVALID_CODE, INVALID_BAUD_RATE, INVALID_STOP_BIT, CODE_READ_PROT_ENABLED, OUT_OF_MEMORY, MAX_ERROR
};
enum iap_cmd_t
{
PREPARE = 50, COPY, ERASE, BLANK_CHECK, GET_PART_ID, GET_BOOT_VER, COMPARE,
SIZE_ALIGN = 0xFFFFFFFF // make iap_cmd_t 4-bytes width
};
struct iap_command_t
{
iap_cmd_t Command;
uint32_t Param[4];
};
struct iap_result_t
{
iap_status_t Status;
uint32_t Result[4];
};
extern "C" __thumb void IAP(iap_command_t *params, iap_result_t *result); // IAP объявлено в скрипте линкера, компилится более эффективный вызов, чем по указателю.
iap_status_t Erase (uint_fast8_t start_sector, uint_fast8_t end_sector)
{
iap_command_t Cmd;
iap_result_t Res;
Cmd.Command = PREPARE;
Cmd.Param[0] = start_sector;
Cmd.Param[1] = end_sector;
critical_t cs;
IAP(&Cmd, &Res);
if (Res.Status == CMD_SUCCESS)
{
Cmd.Command = ERASE;
Cmd.Param[0] = start_sector;
Cmd.Param[1] = end_sector;
Cmd.Param[2] = CCLK / 1000;
IAP(&Cmd, &Res);
}
return Res.Status;
}