Чего то я слегка заблудился в IAP.
Перед началом программирования флешки, провожу препарирование нужных секторов потом стираю потом проверяю, все ОК.
Далее начинаю засылать в контроллер странички по 256 байт и заливаю их (cм. листинг).
Процесс заканчивается без ошибок, но вот реальное содержимое флешки после программирования не совпадает. Несколько первых страниц (~10) пишутся без проблем затем начинаются "пробелы" чистой флеши. Еще очень не понятно, если в препаре LAST_SECTOR указать текущий, то когда странички доберутся до следующего сектора все встанет.
Код
int ProgramFirmware(unsigned char first_sect, int page, char * buf)
{
int i,j;
char start_sect,last_sect;
unsigned long Pointer;
start_sect = floor(page/128) + first_sect;
last_sect = start_sect;
switch(first_sect)
{
case 10:
Pointer = 0x18000;
break;
case 11:
Pointer = 0x20000;
break;
case 12:
Pointer = 0x28000;
break;
case 13:
Pointer = 0x30000;
break;
case 14:
Pointer = 0x38000;
break;
case 15:
Pointer = 0x40000;
break;
case 16:
Pointer = 0x48000;
break;
case 17:
Pointer = 0x50000;
break;
case 18:
Pointer = 0x58000;
break;
case 19:
Pointer = 0x60000;
break;
default : return FALSE;
}
Pointer = Pointer + ((unsigned long)page * 256);
Iap.status=CMD_SUCCESS+1;
while(Iap.status!=CMD_SUCCESS)
{
IDISABLE;
Iap.cmd=IAP_CMD_PREPARE;
Iap.par[0]=start_sect;
Iap.par[1]=last_sect+6; //!!! странность
iap_exec(&Iap);
IENABLE;
}
IDISABLE;
Iap.cmd=IAP_CMD_WRITE;
Iap.par[0]=Pointer;
Iap.par[1]=(unsigned long) buf;
Iap.par[2]=256;
Iap.par[3]=Fcclk/1000;
iap_exec(&Iap);
IENABLE;
while(Iap.status!=CMD_SUCCESS);
return TRUE;
}