Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Программирование одного мк другим
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ILYCHOFF
Посмотрел по форуму вроде ничего не попалось. Задача такая. Есть два мк ATMega128 связаны между собой по SPI нужно, чтобы один мк залил в другой свою прошивку. Со считыванием из флеш все нормально. Интересует как залить в другой мк, смотрел ДШ по программированию по SPI, не все понятно. Хочется посмотреть как делают грамотные люди. Может у кого есть исходники по этой теме.

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

МК связаны так, выводы SPI одного мк связаны с выводами PDI и PDO другого RESETом управляет отдельный вывод мк.

так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы (прошиваемой). а что бы просто клонировались... есть устройства которые умеют это делать, но так просто не выйдет
add
Цитата
так ничего не выйдет. нужна программа для прошивки (в первом процессоре) и внешняя память для программы

Вот как раз щас занимаюсь портативным копиром микросхем.
Думаю что прошить программу в другой MK можно , раз мк может себя стирать... то уж передать собственный код в другой мк наверное несложно..
ILYCHOFF
Цитата(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
А как адресуются страницы во флеш памяти??? Просто по порядку 0x0000, 0x0001, и т. д. ?
У меги 128 получается 500 страниц как раз для адреса страницы отводится 9 бит.
Правильно я думаю?
SasaVitebsk
Цитата(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
Цитата(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
возьми за исходное программатор AVR910, в инете были исходники, замени работу с компортом на работу с внешней памятью, сей программатор работает и шьет почти все АВРки, исходники неплохо прокомментированны
prottoss
Цитата(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
Спасибо большое всем за ответы, буду разбираться....
yarunt
Цитата(ILYCHOFF @ Oct 16 2006, 05:50) *
Спасибо большое всем за ответы, буду разбираться....

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


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

Если ты едешь туда лично, то никаких таких фокусов не надо, а если не лично - то рано или поздно притулят впараллель SPI-slave только на приём, который сольёт куда сочтёт нужным всю последовательность и потом можно и вырезать нужное для дизассемблирования, и шо хош.
Так что - правильно было сказано - шифрование. Только "дешифратор" - в ЦЕЛЕВОМ устройстве, а в "коробочке" - всего лишь AT45DBсколько_надо с зашифрованной программой. И пусть бутлоадер в целевом читает, декодирует, самопрошивается.
Igor26
Цитата
Если ты едешь туда лично

Если я поеду туда лично, то возьму свой лаптоп и залью. А если едет человек, которому пол дня нужно объяснять, что такое FUSE-биты? Плавали, знаем.
Далее. О закрытии кода речи нет. Не нужно этого. Пусть разбираются в 20к кода, если хотят.
prottoss
Цитата(Igor26 @ Dec 17 2006, 04:30) *
Цитата
Если ты едешь туда лично

Если я поеду туда лично, то возьму свой лаптоп и залью. А если едет человек, которому пол дня нужно объяснять, что такое FUSE-биты? Плавали, знаем.
Далее. О закрытии кода речи нет. Не нужно этого. Пусть разбираются в 20к кода, если хотят.


А зачем разбираться? Клонировать достаточно инохда...)
Panych
Я пытаюсь запрограммировать из 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 );


ВОПРОС СНЯТ!
этого не происходит, ошибка в мозгах была...
=VRA=
Цитата(ILYCHOFF @ Oct 13 2006, 10:40) *
Хочется посмотреть как делают грамотные люди
Вот они - ключевые слова, на которые никто до сих пор не обратил внимания!



А грамотные люди делают так, чтобы необходимость в таком извращении просто не возникала - тогда и не придется гланды через ж... вырезать a14.gif
ArtemKAD
Цитата
редставьте себе некую маленькую коробочку, в которой кроме источника питания, разъёма ISP,пары светодиодов, кварца и, собственно кристалла больше ничего нет. В кристалл, в секцию бутлоадера зашит собственно программатор и закрыт всеми возможными для него, бутлоадера, битами защиты.

У нас так сделано уже лет 8. Только в коробочке в последних вариантах я ставлю панельку с нулевым усилием - для смены целевого устройства меняется только пишущий кристалл.
Ну и еще небольшой совет. Кроме выше названного поставить пищалку для контроля завершения записи - хорошо помогает smile.gif .
SasaVitebsk
А я бы сделал стандартно (на мой взгляд). В обоих однокристалках реализовал бы бутлоадер. А по SPI только передача данных. То есть канал. В этом случае по SPI возможна заливка проги любым из источников. Возможно кодирование/декодирование (если на уровне однокристалки то примитивное).
Dmitry_Od
Цитата(ILYCHOFF @ Oct 13 2006, 09:40) *
... Есть два мк ATMega128 связаны между собой ... чтобы один мк залил в другой свою прошивку...


А если взять третий камень и управление заливкой/считыванием возложить на него?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.