Цитата(ILYCHOFF @ Oct 13 2006, 15:40)

...Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.
МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.
Вам правильно сказал
demaven, возьмите исходник на ASM от AVR910... разобраться в нем досконально - пару дней от силы. Кроме этого даташит на М128, что бы знать количество страниц и их размер и вперед))) Вот Вам код для входа в режим программирования от моего программатора
Код
...
#define AVR_PROG_EN() Write123(0xAC, 0x53, 0x00)
...
/*****************************************************************************
Записывает последовательно 3 байта в SPI и возвращает результат от записи 3-го
******************************************************************************/
UCHAR Write123(UCHAR byte1, UCHAR byte2, UCHAR byte3)
{
ExSPI(byte1);
ExSPI(byte2);
return ExSPI(byte3);
}
...
/*****************************************************************************
Вход в режим программирования
******************************************************************************/
void SetProgMode(void)
{
UCHAR err = ACK;
SET_LED_RD();
SET_LED_WR();
// проверяем код устройства
if(S89 == g_DeviceType) //89S
{
ReleasePorts(); // отключаем порты
CatchPorts(); // подключаем порты к ISP
S89_DELAY_RESET(); // задержка
// посылаем команду входа в режим программирования
S89_PROG_EN();
}
else
{
// синхронизируемся с подключенным чипом
ReleasePorts(); // отключаем порты
CatchPorts(); // подключаем порты к ISP
AVR_DELAY_RESET(); // задержка
// 32 цикла попыток засинхронизироваться с программируемым МК
for(UCHAR c = 0; c < 32; c++)
{
// пытаемся вывести чип в режим программирования
// при посылке 3-го байта в SPI чип должен вернуть код предыдущей посылки
UCHAR ctrl_byte = AVR_PROG_EN();
ExSPI(0x00);
// получили верный контрольный байт - синхронизация выполнена
if(0x53 == ctrl_byte)
goto m1;
// если нет валидного возврата, то сдвигаем при каждой попытке строб
SET_SCK();
__delay_cycles(600); // задержка 50 мкс
CLR_SCK();
__delay_cycles(600);
}
// если мы не засинхронизировались,
// считаем, что устройство не найдено
ReleasePorts(); // отключаем порты
err = NACK; // посылаем код ошибки
}
m1:
PutChar(err);
CLR_LED_WR();
CLR_LED_RD();
}