Цитата(tobias_ivan @ Nov 20 2006, 08:55)

Все решил!
Все-таки фузы стали програмироваться после того, как между записью соседних фузов добавил процедуру вхождения в режим программирования.
Всем спасибо!

ЗЫ. Кстати, где-то об этом читал, только не помню где...
Впервые слышу о таком. Всё программирование и всю верификацию делаю на одном входе в программирование (за исключением необходимости перевойти в программирование после стирания - но об этом написано явно в описании процедуры стирания).
Вот фрагмент кода avreal
Код
static void
DoWriteFuses(uchar i1, uchar i3)
{
uchar iobuf[4] = { 0xAC, i1, 0x00, i3 };
Dump4bytes(3, "WriteFuses command", iobuf);
SPIio(4, iobuf);
Delayus(fuses_delay);
Dump4bytes(3, "WriteFuses reply ", iobuf);
}
void
WriteFuses()
{
assert(dev_id >= 0);
assert(WorkChip()->fuselist != NULL);
os_printf("Programming fuses\n");
// fusein[].mask collected in CollectFuses to OR of all implemented fields
for(int i = 0; i < FUSE_SIZE; ++i)
{
// mask unused bits in fusein[].val to '1' (can be readed as 'x' => must be ignored)
fuseout[i].val = uchar((fuseout[i].val & fuseout[i].mask) // requested
| ((fusein[i].val | ~fusein[i].mask) & ~fuseout[i].mask)); // read | not_implemented
}
fusetype ft = WorkChip()->ftype;
switch (ft)
{
case F_NONE: // error
return;
case F_OLD1:
case F_OLD2:
DoWriteFuses(uchar((fuseout[0].val & 0xBF) | 0xA0), 0);
break;
case F_NEW:
fusemask fmask = WorkChip()->fmask;
if(fmask & FM_LOW && fuseout[FA_LOW].mask != 0)
DoWriteFuses(0xA0, fuseout[FA_LOW].val);
if(fmask & FM_HIGH && fuseout[FA_HIGH].mask != 0)
DoWriteFuses(0xA8, fuseout[FA_HIGH].val);
if(fmask & FM_EXT && fuseout[FA_EXT].mask != 0)
DoWriteFuses(0xA4, fuseout[FA_EXT].val);
if(fmask & FM_LOCK && fuseout[FA_LOCK].mask != 0)
DoWriteFuses(0xE0, fuseout[FA_LOCK].val);
break;
}
}