|
Программирование одного мк другим, Вопрос по программированию |
|
|
|
Oct 13 2006, 07:51
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы Вот как раз щас занимаюсь портативным копиром микросхем. Думаю что прошить программу в другой MK можно , раз мк может себя стирать... то уж передать собственный код в другой мк наверное несложно..
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Oct 13 2006, 08:06
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Цитата(chief_olimp @ Oct 13 2006, 11:45)  Цитата(ILYCHOFF @ Oct 13 2006, 10:40)  Посмотрел по форуму вроде ничего не попалось. Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.
МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.
так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы (прошиваемой). а что бы просто клонировались... есть устройства которые умеют это делать, но так просто не выйдет Почему не выйдет? Считаю с одного мк страницу флеши, а потом запишу по SPI в другой, мне бы алгоритм посмотреть программирования или исходник, в даташите табл. 26-15 Мне непонятно, что за адрес страницы, какой это адрес???
|
|
|
|
|
Oct 13 2006, 08:13
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
Я делал вот так. Сразу извиняюсь за качество кода, писался он в экстремальном режиме из серии это должно было быть сделано еще вчера (кто-то на фирме отправил большую партию контролеров, довольно далеко, с непрошитами микросхемами) поэтому поял, писал, собирал в корпус в один день. Устройство следующие 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]
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Oct 13 2006, 08:34
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
[/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--;
Далее запись конфигурации и защиты
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Oct 13 2006, 08:54
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(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 Мне непонятно, что за адрес страницы, какой это адрес??? Можно конечно и таким образом. То есть в программе "мастера" кроме всего прочего реализуется программатор. Но тогда я не совсем представляю как они у вас работать будут. То есть сложно всё получается. Всётаки более правильный, на мой взгляд, подход с бутлоадером. Алгоритм программирования (если вы пойдёте по первому пути) находится в даташите на саму микросхему. Там всё очень просто.
|
|
|
|
|
Oct 13 2006, 09:01
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

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

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 5-07-05
Из: Великий Новгород
Пользователь №: 6 536

|
Цитата(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 Мне непонятно, что за адрес страницы, какой это адрес??? Можно конечно и таким образом. То есть в программе "мастера" кроме всего прочего реализуется программатор. Но тогда я не совсем представляю как они у вас работать будут. То есть сложно всё получается. Всётаки более правильный, на мой взгляд, подход с бутлоадером. Алгоритм программирования (если вы пойдёте по первому пути) находится в даташите на саму микросхему. Там всё очень просто. Нужно именно два контроллера которые могли бы друг другу зашивать свою прошивку...
|
|
|
|
|
Oct 13 2006, 10:34
|
Частый гость
 
Группа: Свой
Сообщений: 196
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 922

|
Свой код, который я привел выше писал, как говориться на одном дыхании без проработки и планирования общей структуры программы и устройства, пользуясь только Даташатам и спаеной макеткой, контролировал, что написал программатором. В даташате достаточно хорошо описан алгоритм, но если есть проблемы попробуйте использовать мой код. Если что-то не понятно я Вам по нему обязательно отвечу
--------------------
Тяжелое детство - 8-битные игрушки на 8-дюемовых дискетах
|
|
|
|
|
Oct 13 2006, 22:54
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(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(); }
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|