ILYCHOFF
Oct 13 2006, 07:40
Посмотрел по форуму вроде ничего не попалось. Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.
МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.
chief_olimp
Oct 13 2006, 07:45
Цитата(ILYCHOFF @ Oct 13 2006, 10:40)

Посмотрел по форуму вроде ничего не попалось. Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.
МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.
так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы (прошиваемой). а что бы просто клонировались... есть устройства которые умеют это делать, но так просто не выйдет
Цитата
так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы
Вот как раз щас занимаюсь портативным копиром микросхем.
Думаю что прошить программу в другой MK можно , раз мк может себя стирать... то уж передать собственный код в другой мк наверное несложно..
ILYCHOFF
Oct 13 2006, 08:06
Цитата(chief_olimp @ Oct 13 2006, 11:45)

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

Посмотрел по форуму вроде ничего не попалось. Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.
МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.
так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы (прошиваемой). а что бы просто клонировались... есть устройства которые умеют это делать, но так просто не выйдет
Почему не выйдет? Считаю с одного мк страницу флеши, а потом запишу по SPI в другой, мне бы алгоритм посмотреть программирования или исходник, в даташите табл. 26-15
Мне непонятно, что за адрес страницы, какой это адрес???
Я делал вот так. Сразу извиняюсь за качество кода, писался он в экстремальном режиме из серии это должно было быть сделано еще вчера (кто-то на фирме отправил большую партию контролеров, довольно далеко, с непрошитами микросхемами) поэтому поял, писал, собирал в корпус в один день. Устройство следующие Mega 8 перешивает AtTiny2313. Код для tiny находиться в программной памяти mege
[code]
countErr=0;
ST:
RESET_OFF
mode.errProg=0;
// включаем режим програмирования
StartSPI(C_ENABALD_PROG_1);
StartSPI(C_ENABALD_PROG_2);
temp=StartSPI(C_ENABALD_PROG_3);
if(temp != 0X53)
{
mode.errProg=1;
}
StartSPI(C_ENABALD_PROG_4);
if(mode.errProg==1)
{
countErr++;
if(countErr==ERROR_COUNT_PROG)
{
goto START;
}
else
{
goto ST;
}
}
// стираем кристал
GRIN_OFF
StartTaimer1();
if(mode.clear==0)
{
StartSPI(C_CLEAR_PROG_1);
StartSPI(C_CLEAR_PROG_2);
StartSPI(C_CLEAR_PROG_3);
StartSPI(C_CLEAR_PROG_4);
mode.clear=1;
RESET_ON
Timer0Start(0,5);
goto ST;
}
adres.adres_int=0;
countData=0;
mode.clear=1;
page=64;
// команда режим програмирования
do
{
count16=32;
tempAdres=0;
do
{
if(mode.byteLorH==0)
{
temp=DATA[countData];
mode.byteLorH=1;
StartSPI(C_SAVE_L_PROG_1);
StartSPI(C_CLEAR_PROG_3);
StartSPI(tempAdres);
StartSPI(temp);
}
else
{
temp=DATA[countData+1];
mode.byteLorH=0;
StartSPI(C_SAVE_H_PROG_1);
StartSPI(C_CLEAR_PROG_3);
StartSPI(tempAdres);
StartSPI(temp);
countData=countData+2;
tempAdres=tempAdres+1;
}
Timer0Start(0,3);
count16--;
}while(count16);
StartSPI(C_PAGE_PROG);
StartSPI(adres.adres_Arx[1]);
StartSPI(adres.adres_Arx[0]);
StartSPI(C_CLEAR_PROG_4);
page--;
adres.adres_int=adres.adres_int+16;
Timer0Start(0,3);
}while(page);
// запись конфигурации
StartSPI(C_CONFIG_L_1);
StartSPI(C_CONFIG_L_2);
StartSPI(C_CONFIG_L_1);
StartSPI(C_CONFIG_L_4);
Timer0Start(0,3);
// запись защиты
StartSPI(C_LOOK_1_1);
StartSPI(C_LOOK_1_2);
StartSPI(C_ENABALD_PROG_3);
StartSPI(C_LOOK_1_4);
Timer0Start(0,3);
unsigned char StartSPI(unsigned char data)
{
mode.spi=1;
SPDR=data;
do
{
}while(mode.spi);
data=0;
data=SPDR;
return data;
}
[code]
[/quote]
Почему не выйдет? Считаю с одного мк страницу флеши, а потом запишу по SPI в другой, мне бы алгоритм посмотреть программирования или исходник, в даташите табл. 26-15
Мне непонятно, что за адрес страницы, какой это адрес???
[/quote]
Маленький коментарий:
if(temp != 0X53) // 0X53 кристал должен ответить если перешел в режим программирование
далее идет код стирания кристала и повторения входа в режим програмирования
далее заполняем буфер страницы для разных конролеров размер может отличаться
count16=32;
tempAdres=0;
do
{
if(mode.byteLorH==0)
{
temp=DATA[countData];
mode.byteLorH=1; // записываем младший байт
.
.
.
else
{
temp=DATA[countData+1];
mode.byteLorH=0;
StartSPI(C_SAVE_H_PROG_1); // записываем старший байт
.
.
.
// переносим из буфера в нужную страницу
StartSPI(C_PAGE_PROG);
StartSPI(adres.adres_Arx[1]);
StartSPI(adres.adres_Arx[0]);
StartSPI(C_CLEAR_PROG_4);
page--;
Далее запись конфигурации и защиты
ILYCHOFF
Oct 13 2006, 08:50
А как адресуются страницы во флеш памяти??? Просто по порядку 0x0000, 0x0001, и т. д. ?
У меги 128 получается 500 страниц как раз для адреса страницы отводится 9 бит.
Правильно я думаю?
SasaVitebsk
Oct 13 2006, 08:54
Цитата(ILYCHOFF @ Oct 13 2006, 11:06)

Цитата(chief_olimp @ Oct 13 2006, 11:45)

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

Посмотрел по форуму вроде ничего не попалось. Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.
МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.
так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы (прошиваемой). а что бы просто клонировались... есть устройства которые умеют это делать, но так просто не выйдет
Почему не выйдет? Считаю с одного мк страницу флеши, а потом запишу по SPI в другой, мне бы алгоритм посмотреть программирования или исходник, в даташите табл. 26-15
Мне непонятно, что за адрес страницы, какой это адрес???
Можно конечно и таким образом. То есть в программе "мастера" кроме всего прочего реализуется программатор. Но тогда я не совсем представляю как они у вас работать будут. То есть сложно всё получается.
Всётаки более правильный, на мой взгляд, подход с бутлоадером.
Алгоритм программирования (если вы пойдёте по первому пути) находится в даташите на саму микросхему. Там всё очень просто.
Цитата(ILYCHOFF @ Oct 13 2006, 12:50)

А как адресуются страницы во флеш памяти??? Просто по порядку 0x0000, 0x0001, и т. д. ?
У меги 128 получается 500 страниц как раз для адреса страницы отводится 9 бит.
Правильно я думаю?
Mege128 имеет 512 страниц, размер страницы 64 (16 разрядных слов)
ILYCHOFF
Oct 13 2006, 10:19
Цитата(SasaVitebsk @ Oct 13 2006, 12:54)

Цитата(ILYCHOFF @ Oct 13 2006, 11:06)

Цитата(chief_olimp @ Oct 13 2006, 11:45)

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

Посмотрел по форуму вроде ничего не попалось. Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.
МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.
так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы (прошиваемой). а что бы просто клонировались... есть устройства которые умеют это делать, но так просто не выйдет
Почему не выйдет? Считаю с одного мк страницу флеши, а потом запишу по SPI в другой, мне бы алгоритм посмотреть программирования или исходник, в даташите табл. 26-15
Мне непонятно, что за адрес страницы, какой это адрес???
Можно конечно и таким образом. То есть в программе "мастера" кроме всего прочего реализуется программатор. Но тогда я не совсем представляю как они у вас работать будут. То есть сложно всё получается.
Всётаки более правильный, на мой взгляд, подход с бутлоадером.
Алгоритм программирования (если вы пойдёте по первому пути) находится в даташите на саму микросхему. Там всё очень просто.
Нужно именно два контроллера которые могли бы друг другу зашивать свою прошивку...
Свой код, который я привел выше писал, как говориться на одном дыхании без проработки и планирования общей структуры программы и устройства, пользуясь только Даташатам и спаеной макеткой, контролировал, что написал программатором. В даташате достаточно хорошо описан алгоритм, но если есть проблемы попробуйте использовать мой код. Если что-то не понятно я Вам по нему обязательно отвечу
demaven
Oct 13 2006, 11:43
возьми за исходное программатор AVR910, в инете были исходники, замени работу с компортом на работу с внешней памятью, сей программатор работает и шьет почти все АВРки, исходники неплохо прокомментированны
prottoss
Oct 13 2006, 22:54
Цитата(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();
}
ILYCHOFF
Oct 16 2006, 04:50
Спасибо большое всем за ответы, буду разбираться....
yarunt
Dec 15 2006, 16:16
Цитата(ILYCHOFF @ Oct 16 2006, 05:50)

Спасибо большое всем за ответы, буду разбираться....
есть исходник на абилдере и только на 128 только лонирование флеш. isq 446-319-072
Igor26
Dec 15 2006, 17:30
Была такая идея, но говорю сразу - это только мысль и реализована она пока не была.
Представьте себе некую маленькую коробочку, в которой кроме источника питания, разъёма ISP,пары светодиодов, кварца и, собственно кристалла больше ничего нет. В кристалл, в секцию бутлоадера зашит собственно программатор и закрыт всеми возможными для него, бутлоадера, битами защиты. Его задача - последовательно читать флэш с нулевого адреса и формировать сигналы программирования для внешнего кристалла. Т.е. кристалл в коробочке - это и есть автономный программатор. Так прелесть, помоему, в том, что берем эту коробочку, шьём ее как целевое устройство (секция бутлоадера защищена, значит он и не затрется при шитье) и забывам об этом. Далее, приезжаем на объект, вставляем коробочку в целевой девайс. Коробочка стартует с бутлоадера и начинает шить то, что в нее зашили "как в целевое устройство".
Извиняюсь за некую сумбурность, смерть как устал за неделю. :-)
prottoss
Dec 15 2006, 17:55
Цитата(Igor26 @ Dec 15 2006, 21:30)

Была такая идея, но говорю сразу - это только мысль и реализована она пока не была.
Представьте себе некую маленькую коробочку, в которой кроме источника питания, разъёма ISP,пары светодиодов, кварца и, собственно кристалла больше ничего нет. В кристалл, в секцию бутлоадера зашит собственно программатор и закрыт всеми возможными для него, бутлоадера, битами защиты. Его задача - последовательно читать флэш с нулевого адреса и формировать сигналы программирования для внешнего кристалла. Т.е. кристалл в коробочке - это и есть автономный программатор. Так прелесть, помоему, в том, что берем эту коробочку, шьём ее как целевое устройство (секция бутлоадера защищена, значит он и не затрется при шитье) и забывам об этом. Далее, приезжаем на объект, вставляем коробочку в целевой девайс. Коробочка стартует с бутлоадера и начинает шить то, что в нее зашили "как в целевое устройство".
Извиняюсь за некую сумбурность, смерть как устал за неделю. :-)
Идея хорошая, но зачем код для целевого девайса вгонять в МК программатора, для этого есть DataFlash или EEPROM. Дешевле получится и место столько же, если не меньше...
demaven
Dec 16 2006, 09:22
просто товарищ желает сохранить свой код в тайне от всех, а из внешней флешки, как он считает, код этот могут считать. Но ему никто не запрещает в контроллер вставить дешифратор а во флешку писать зашифрованный код и задача упростится, можно будет писать любые программы, меняя только флешку
Цитата(Igor26 @ Dec 15 2006, 16:30)

Так прелесть, помоему, в том, что берем эту коробочку, шьём ее как целевое устройство (секция бутлоадера защищена, значит он и не затрется при шитье) и забывам об этом. Далее, приезжаем на объект, вставляем коробочку в целевой девайс. Коробочка стартует с бутлоадера и начинает шить то, что в нее зашили "как в целевое устройство".
Если ты едешь туда лично, то никаких таких фокусов не надо, а если не лично - то рано или поздно притулят впараллель SPI-slave только на приём, который сольёт куда сочтёт нужным всю последовательность и потом можно и вырезать нужное для дизассемблирования, и шо хош.
Так что - правильно было сказано - шифрование. Только "дешифратор" - в ЦЕЛЕВОМ устройстве, а в "коробочке" - всего лишь AT45DBсколько_надо с зашифрованной программой. И пусть бутлоадер в целевом читает, декодирует, самопрошивается.
Igor26
Dec 17 2006, 00:30
Цитата
Если ты едешь туда лично
Если я поеду туда лично, то возьму свой лаптоп и залью. А если едет человек, которому пол дня нужно объяснять, что такое FUSE-биты? Плавали, знаем.
Далее. О закрытии кода речи нет. Не нужно этого. Пусть разбираются в 20к кода, если хотят.
prottoss
Dec 17 2006, 00:40
Цитата(Igor26 @ Dec 17 2006, 04:30)

Цитата
Если ты едешь туда лично
Если я поеду туда лично, то возьму свой лаптоп и залью. А если едет человек, которому пол дня нужно объяснять, что такое FUSE-биты? Плавали, знаем.
Далее. О закрытии кода речи нет. Не нужно этого. Пусть разбираются в 20к кода, если хотят.
А зачем разбираться? Клонировать достаточно инохда...)
Panych
Jan 21 2008, 09:47
Я пытаюсь запрограммировать из Mega128 Tiny26.
Вход в синхронизацию проходит, но при этом Flash заполняется какими-то значениями - память оказывается заполненной какими-то значениями даже после команды "Стирание памяти".
В чем может быть загвоздка?
Код
char mark = 0;
char temp = 0;
INITIALIZATION(); // инициализация портов
while ( mark == 0 ) // будем добиваться входа в синхронизацию
{
// вход в режим программирования
CLEARBIT( DDRE, 6 ); // Reset = High
DELAYMS( 1 );
// Reset = Low
CLEARBIT( PORTE,6 );
SETBIT( DDRE, 6 );
CLEARBIT( PORTE,6 );
DELAYMS( 20 );
// вход в синхронизацию
SEND_SPI( 0xAC );
SEND_SPI( 0x53 );
temp = SEND_SPI( 0xAA );
if( temp == 0x53 )
{
SEND_SPI( 0xAA );
mark = 1;
}
}
// стирание памяти
SEND_SPI( 0xAC );
SEND_SPI( 0x80 );
SEND_SPI( 0x00 );
SEND_SPI( 0x00 );
ВОПРОС СНЯТ!
этого не происходит, ошибка в мозгах была...
Цитата(ILYCHOFF @ Oct 13 2006, 10:40)

Хочется посмотреть как делают грамотные люди
Вот они - ключевые слова, на которые никто до сих пор не обратил внимания!
А грамотные люди делают так, чтобы необходимость в таком извращении просто не возникала - тогда и не придется гланды через ж... вырезать
ArtemKAD
Jan 21 2008, 14:58
Цитата
редставьте себе некую маленькую коробочку, в которой кроме источника питания, разъёма ISP,пары светодиодов, кварца и, собственно кристалла больше ничего нет. В кристалл, в секцию бутлоадера зашит собственно программатор и закрыт всеми возможными для него, бутлоадера, битами защиты.
У нас так сделано уже лет 8. Только в коробочке в последних вариантах я ставлю панельку с нулевым усилием - для смены целевого устройства меняется только пишущий кристалл.
Ну и еще небольшой совет. Кроме выше названного поставить пищалку для контроля завершения записи - хорошо помогает

.
SasaVitebsk
Jan 21 2008, 21:39
А я бы сделал стандартно (на мой взгляд). В обоих однокристалках реализовал бы бутлоадер. А по SPI только передача данных. То есть канал. В этом случае по SPI возможна заливка проги любым из источников. Возможно кодирование/декодирование (если на уровне однокристалки то примитивное).
Dmitry_Od
Jan 27 2008, 12:15
Цитата(ILYCHOFF @ Oct 13 2006, 09:40)

... Есть два мк ATMega128 связаны между собой ... чтобы один мк залил в другой свою прошивку...
А если взять третий камень и управление заливкой/считыванием возложить на него?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.