Сверхмобильная прошивалка AVR по JTAG

AVR
Нередки случаи, когда оборудование, нуждающееся в обновлении ПО норовит быть в неожиданных и труднодоступных местах. Да еще и времени на обновление бывает в обрез. Хорошо, когда в оборудовании есть загрузчик, позволяющий прошиться по аплинку/радиоканалу/съемному носителю информации. А что если загрузчик устарел и его самого надо обновить? Или же у ПО напрочь слетела вся память? Тогда-то и востребуется такая штука, как «прошивалка». Маленьких размеров, питающийся от устройства хэдкраб, который сможет залить в устройство заранее подготовленный загрузчик или программу. И главное – никаких нетбуков/ноутбуков/проводов! Даже среднего образования не надо.

Итак, сверхмобильная прошивалка.
Схемотехника
Устройство представляет собой платку с разъемом JTAG (IDC-10, в том формате, который полюбился Atmel) и контроллера ATMega8. В качестве контроллера конкретно здесь может быть любой другой, совместимый по ногам, например, ATMega168.

Схема:


Плата:


Все прекрасно разводится на одном слое, без перемычек.

Принцип работы
Наш хэдкраб тактируется от внутреннего RC-генератора, т.к. JTAG — это синхронных интерфейс и тайминги не важны. Для отображения состояния на плате располагается сдвоенный красно-зеленый светодиод.
После подачи питания контроллер инициализирует линии JTAG (TMS, TCK, TDO, TDI), зажигает красный светодиод и согласно протоколу работы TAP-контроллера (Test Access Point, описание его работы можно найти в даташите на любой МК, поддерживающий JTAG) пытается ввести в режим программирования устройство, к которому он прицепился. Здесь небольшое лирическое отступление. В программе работа с TAP выглядит так:


  TAP(0x0D,6);
  shift_instruction(0x4,4);
  TAP(0x3,4);
  shift_instruction(0xA370,16);


Реализация функций TAP и shift_instruction выглядит следующим образом:


// Walk trough TAP
void TAP(unsigned long state, unsigned char count)
 {
  unsigned char i;
  JTAG_PORT&=~TCK;
  JTAG_PORT&=~TMS;
  for (i=0;i<count;i++)
   {
    if ((state&0x01)!=0x00)
     JTAG_PORT|=TMS; else
      JTAG_PORT&=~TMS;
    state>>=1;
    __delay_cycles(5);
    JTAG_PORT|=TCK;
    __delay_cycles(5);
    JTAG_PORT&=~TCK;
    __delay_cycles(5);
   }
 }

// Shift-IR
unsigned long shift_instruction(unsigned long instruction, unsigned char count)
 {
  unsigned char i;
  unsigned long x=0;
  JTAG_PORT&=~TMS;
  JTAG_PORT&=~TCK;
  for (i=0;i<count;i++)
   {
    if ((instruction&0x01)!=0x00)
     JTAG_PORT|=TDI; else
      JTAG_PORT&=~TDI;
    instruction>>=1;
    if (i==(count-1))
     JTAG_PORT|=TMS; // последний бит JTAG инструкции: подготовим уход из Shift-IR
    __delay_cycles(5);
    JTAG_PORT|=TCK;
    __delay_cycles(5);
    if ((JTAG_PIN&TDO)!=0x00) x|=0x80000000;
    x=(x>>1);
    JTAG_PORT&=~TCK;
    __delay_cycles(5);
   }
  return x;
 }


По сути, каждая операция по JTAG производится через TAP посредством этих двух функций в различных вариациях. Например так выглядит чтение байтов сигнатуры устройства:

unsigned long ReadSignByte(void)
 {
  unsigned long aa;
  TAP(0x0D,6);
  shift_instruction(0x05,4);
  TAP(0x3,4);
  shift_instruction(0x3200,15);

  TAP(0x0D,6);
  shift_instruction(0x05,4);
  TAP(0x3,4);
  aa=shift_instruction(0x3300,15);
  return aa;
 }


Остальные команды можно изучить в описании TAP или же, более наглядно, в прикрепленном к посту рабочем проекте. Лирическое отступление закончилось, вернемся к описанию работы.

После входа в режим программирования прошивалка сверяет байты сигнатур устройства с зашитыми в код прошивалки (не дай Б-г не то устройство прошьем). Если байты не совпадают, прошивалка деинициализирует линии JTAG и начинает мигать обоими светодиодами, пока её не отцепят от устройства. Короче говоря, отваливает от процесса. Если устройство всё же похоже на нужное, то прошивалка делает следующее:
— стирание кристалла (chip erase);
— прошивка память программы устройства из своей собственной памяти (program flash);
— проверка памяти программы устройства со своей собственной памятью (read flash);
— программирование битов конфигурации (fuses);
— программирование битов защиты (lock bits);
— отваливается, погасив все светодиоды.

Конечно же, прошивлка сама по себе не отвалится, её надо отстыковать). Но на момент погашения светодиодов, устройство, к которому наш хэдкраб был подключен, уже должно стартовать: готово к работе!
Если на этапе программирования или проверки возникнет несовпадение или ошибка, прошивалка отлипнет от порта и замигает светодиодами, т.е. опять-таки отвалит от процесса.

Нюансы
1) Естественно, для того чтобы прошивалка все-таки прошила устройство по JTAG, этот самый JTAG должен быть активирован на данном устройстве. Иначе придется применять прошивалку уже другого рода — по ISP. Подобное так же собиралось и функционирует.
2) Собственно сама прошивка для устройства располагается в памяти контроллера прошивалки и может занимать довольно много места. Если не будет влезать в Mega8, то можно применить Mega168, там больше флеша.
3) Бинарник прошивки устройства цепляется к прошивке хэдкраба на этапе линковки, это делается различными способами, в зависимости от среды разработки. В IAR это в свойствах проекта в Linker во вкладке Config указываем Raw binary image путь к файлу бинарника, задаем Symbol, Segment и Align например как a123, SEGa и 2 соответственно. Тогда на вкладке Extra Options надо будет добавить 2 строки:
-ZSEGa=EFF
-ga123
где EFF — это адрес, по которому будет располагаться бинарник устройства в памяти прошивалки.

Вот вроде бы и всё. Устройство бывает крайне полезным, когда устройства сверхподвижны и отлавливать их приходится буквально в поле.
Снова оговорюсь, что есть подобное же устройство, но для программирования через SPI.

UPD1. По просьбам трудящихся про SPI (ISP)
Данную плату можно использовать и для программирования в режиме ISP, для этого выводы схемы используются по такой таблице соответствия:
— вывод TMS разъема — это вход RESET устройства;
— вывод TCK разъма — это вход SCK устройства;
— вывод TDO разъема — это вход MISO устройства;
— вывод TDI разъма — это вход MOSI устройства.
Файлы проекта для релизации прошивалки по SPI в прикрепленном файле ISPviaSPI.zip

P.S. Прошу за ошибки сильно не пинать, это мой первый пост в сообществе :)
Файлы в топике: JTAGFlasher.zip, ISPviaSPI.zip

Комментарии (82)

RSS свернуть / развернуть
Можно еще флешку прицепить по I2C. Не надо будет перепрошивать контроллер, можно просто образ во флешку заливать.
0
есть подобное исполнение, но там не i2c, а spi используется, с возможностью загрузки прошивки с SD/MMC карты. Но! Это уже немного громоздко получается. А у меня самоцель была — в два рубля размерами обойтись)
0
SD понятно, но тут само просится — ноги свободные есть, шестиногий соик и два резистора уж можно втулить.
Но задачу решает, и отлично ;)
0
Так с другой стороны платы как раз MicroSD разъем войдет. Без ущерба для двухрублевых размеров:)
P.S. Нюанс от французского nuance а не от английского new:)
0
Насчет MicroSD идея отличная, надо обкатать при возможности.
З.Ы. Нюанс сейчас поправлю, сппсибо. Петька: — Василь Иваныч, а что такое «Нюанс»?...
+1
У китайцев на Ebay набрал кучу MicroSD разъемов. Карточка же в местном магазине 130р за 2Гб.
Теперь везде, где нужно много(и неочень) памяти — втыкаю MicroSD:)
0
О, забавно:)
AVR'овские JTAG-команды сам реверсил?
И зачем JTAG если есть ISP (который поуниверсальнее будет)?
0
Изначально были прошивалки только для ISP. Но вот появилось в серийном выпуске устройство, у которого доступ был сделан только по JTAG. Пришлось подстраиваться под реалии жизни :)
0
Реверсить там ничего не надо, всё детально описано в даташите. Взять хотя бы попсовую ATMega128 — все четко изложено, знай только кури.
0
А, точно. Закрыто тока то, что касается отладки.
0
а кто-нибудь видел такой же простой но по spi? чтоб без дисплея например.
пока только это чудо встречал diy.elektroda.eu/uprog-maly-szybki-przenosny-programator-avr-z-sd/?lang=en
0
В посте у меня перед P.S. есть оговорка:
Снова оговорюсь, что есть подобное же устройство, но для программирования через SPI.
Всё точно так же, только разъем на 6 контактов, и прошивка другая. Могу запилить еще пост)
0
однако получается что 2560 через него не прошьешь, памяти не хватит. в любом случае интересно
0
)))Недавно как раз занялся подобной темой и собрал автономный программатор)))
Сам думал в начале собрать что то подобное как в этой статье, только прошивка по ISP и память прикрутить типа 45db041 и прошивку хранить в ней… Но потом подумал что проще собрать уже готовое и не тратить время)
Вото собственно что получилось:
electronix.ru/forum/index.php?s=&showtopic=96114&view=findpost&p=994874
а оригинальный автономный здесь diy.elektroda.eu/uprog-maly-szybki-przenosny-programator-avr-z-sd/
На русском тут: www.rlocman.ru/forum/showthread.php?t=10327&page=7
Работает на ура))
0
  • avatar
  • adc
  • 22 ноября 2011, 11:09
шикарно мегу раскорячил)
0
«отлично, например» (с)
скажите, а про ISP реализацию отдельно написать нет желания, часом? или может исходничком можете поделиться. буду очень благодарен.
А то я тут как раз последний месяц регулярно ловлю себя на мысли сделать нечто подобное. Только планирую прицепить туда карту памяти с FS, дисплейчик и клавиатуру.
Чтоб снабдить производство портативным прошивальщиком с актуальными версиями прошивок всех производимых устройств. И они не будут бегать каждый раз с просьбами прошить/перепрошить, и себе же не отвлекаться на такие скучные вещи, да и вероятность того, что «кто-то что-то не то прошил», «версию перепутал» и т.д. сводится к минимуму.
0
Можно и отдельно написать, благо есть проектик «на коленке», который шил по SPI девайсы, с MMC/SD карты, с дисплейчиком и кнопочками, с запиткой от устройства. Другой вопрос — что конкретно интересует, в каком исполнении.
Но пока что смотрите UPD1 в посте, я добавил прошивку для реализации SPI.
0
Спасибо, это то, что надо. Что Вы имеете ввиду под «исполнением»?
0
Имел ввиду «хотелки». То, что следует внести, на свой взгляд. Например, кому-то нужно автономное питание, а кому-то — нет. Кому-то нужно автономное переключаемое питание 3,3/5 вольт.
0
ну в такую конкретику я не вдаюсь. не вижу тут проблем с адаптацией «под себя».
Можно гнаться за универсальностью, можно за компактностью и простотой. В моём случае решающим не является ни первое, ни другое. Хотя предпочтительней как раз таки максимальное соотношение простоты и достаточной функциональности в конкретных применениях. Всё-таки пользователь не всегда мыслит так же, как и разработчик, в результате устройство, которое имеет бОльший функционал и кажется лучшим для разработчика может не быть таковым для пользователя, ибо теряет в интуитивности.
0
На счет программатора по SPI + дисплейчика и клавиатуры сходите по ссылкам выше)
0
+5. Такая реализация вполне адекватная любым требованиям портативного программирования по SPI.
0
по ссылкам ходил. этот девайс видел и давненько.
собственно он был первым из того, что я по этой теме встретил. но ведь исходников нету в свободном доступе, а мне бы очень не хотелось привязывать себя к чужой прошивке без возможности поменять что-либо. тот же дисплей…
0
Согласен полностью! Когда возникла потребность в автономном программаторе, то собрал на скорую руку (по фотам это видно))) на макетке.
А так, хочу сам запилить, потому что в чужом варианте нет возможности подправить возможные баги и заточить под себя.
Спасибо автору за статью! Прям захотелось сварганить что нибудь своё)) Надеюсь появится серия подобных статей по автономным программаторам!
0
Тогда уж для полноты изложения материала, выкладывай и SPI версию прошивалки.
0
  • avatar
  • Aneg
  • 22 ноября 2011, 11:48
Выложил, UPD1, смотри.
0
Классное устройство!

Если расположить разъем не перпендикулярно плате, а в одну линию с ней, возможно, было бы удобнее подключать прошивалку к другим платам в случае наличия на них высоких выводных компонентов.
0
Согласен. Конкретно эта плата делалась для конкретной задачи, поэтому оказалось некритичным.
0
возможно, но надо ещё учитывать то, что не должно быть межанической нагрузки на контактные площадки при подключении/отключении, иначе регулярные обрывы гарантированы.
0
А что, если файл прошивки находится на подключенной к AtMega SD-карте?) Как тогда быть, как код программы переделать, чтобы постранично его по JTAG передавать?)
0
Можно организовать и это, благо у ATMega8 вроде хватает ресурсов для Read-Only с MMC/SD карты. Но это требует допиливание как платы, так и программы. Я такое проделывал на базе ATMega128, с менюшками и дисплеем. Могу адаптировать, пуркуа бы не па.
0
О, как раз у меня будет AtMega328 в качестве прошивалки)) Буду рад, если сможете выложить переделанное и сделанное)) Только я вот собираюсь прошивать ПЛИС(файл прошивки будет .svf), у которой отдельные выводы JTAG сразу есть)) Это несильно изменит дело?)
0
сильно изменит, причем кардинально. надо договариваться.
0
Прекрасное решение. Пусть расцветают разные прошивалки, пусть будут с карточкой и с дисплеем — каждому овощу свой фрукт! Но! В такой постановке задачи, когда речь идет о перепрошивке разбросанных х.з. где девайсов, к которым попадаешь далеко не всегда с ноутом и прочими благами, это решение на 100%.
Я глянул проект, там конечно красиво можно было дефинировать ножки, но это не проблема. По сути, можно взять любой проц, который есть под рукой и у которого достаточно памяти, сгенерить для него программу и ехать в поле.
Можно, я думаю, даже защититься от злоупотреблений в случае ценной программы, которую не хочется разбазаривать. Заложить в прогу этой прошивалки одноразовость операции. Прошила — и умерла :) И спокойно высылаешь ее почтой, там местный электрик дрожащими руками вставляет ее в разъем, прошивает и отправляет почтой назад. Нормально. Если сравнивать это с демонтажем модуля и его пересылкой или, тем более, с собственной поездкой на объект ради этой прошивки...
Плюсую.
0
Из одноразовой прошивалки код можно выдернуть. Если хочется защиты — лучше работать через бут.
0
Ну, брат, это ты уж высоко взял. Все можно сдернуть, наверное. Но давай говорить реально: в данном случае речь идет о таком уровне желания и уровне квалификации, который позволил бы слить бинарник из незалоченой микрухи. Все. Выше я свои программы не оцениваю.
Разовая прошивалка, отдав прошивку, тут же ее залочивает. И она сама залочена. То как ты видишь умельца, крадущего прогу? Он ставит сниффер, тянет все в огромный буфер, а потом из него вырезает нужный бинарник? Ну, да. Такому умельцу лучше программатор в руки не давать (неважно, сверхмобильный или иной). Но я идею уважаемого Dominikanez намотал на ус. Для простых эмбеддеров типа меня, далеких от мыслей о всемирном заговоре против его лучшей в мире програмульки, попадающих иногда в ситуации: ехать в тьмутаракань потому что понял, эх, бждлдь! хомутнул же я как! — отличный выход.
0
Да, сниффер — проще всего. Либо схема, прикидывающаяся прошиваемым контроллером и дампящая прошивку. И то и другое достаточно просто и дешево.
0
ОК, пусть это будет предупреждением тем, кто хочет защититься от несанкционированного копирования. И не только тем, кто ленив, как я и готов почтой отправлять «сверхмобильник», но и вообще тем, кто делает такую (физически) маленькую вещь, в которой, допустим, есть некая секретная инфо…
Так что замечание твое принято. Но есть ряд случаев, когда осознанное решение отдать «сверхмобильник» вполне катит.
Это мне напомнило Фьюздоктора. Для простой операции комп не нужен :)
0
А можна как то доработать устройство, добавить две кнопки: запись и стереть
0
Девайс очень полезный за что автору спасибо!!!
Но вот возникли некоторые вопросы после изготовления самого девайса (прошивка SPI версия).
С IARом раньше не работал вроде бы все правильно настроил вроде прикрутил бинарник как в статье написано но после компиляции зашивки в девайс и подключении к таргет плате горит красный загорается желтый потом они начинают мигать(ошибка как понимаю) копался-копался и получается что он код записывает черти куда пример(программа мигание светодиодом) как нада, а вот что получилось считывал обычным программатором.
1. Вопрос почему он туда пуляет код, а не пишет его в начале как нужно?
2. Есть подозрение что я неправильно конвертирую hex в bin (делаю конвертером скачанном в инете). Подскажите если не сложно как это лучше делать?
Заранее благодарен.
0
Можно глянуть проект в IAR целиком? С подцепленным бинарником и настройками.
0
Кидаю проект целиком тк скриншотами и копипастам не удобно…
Я понимаю что я где то накосячил но ума не приложу где…
Буду вам признателен если покажете где мой бок.
0
Мельком глянул, нашел косячок: адресация массива в программе идет с адреса 0x800, там якобы лежит массив с прошивкой прошиваемого девайса. Почему якобы: в диалоге доп. опций линковщка указан адрес 0xEFF. Надо в строке параметров линковщика указать вместо "-ZSEGa=EFF" вот так: "-ZSEGa=7FF". Попробуйте.
0
Еще обратите внимание на строки в программе
при записи: for (i=0;i<80;i++)
при верификации: for (i=0;i<(80*64);i++)
магическая цифра 80 — это размер прошивки в полных страницах. Эту величину надо менять под конкретную прошивку. Чем меньше число, тем быстрее пройдет прошивка, поэтому лучше выставлять под свою. Сейчас она у вас шьёт 80 страниц, из них большинство — пустые, 0xFF.
0
Ситуация изменилась в лучьшую сторону теперь пишет данные в еачало но все равно не те данные пишет в отличии от нужного
0
прошу прощения за очепятку *пишет данные в начало
0
А какой кристалл шьёте с помощью прошивалки?
0
таргет чип для проверки взял Atmega8
0
По сути это моя недоработка. Надо было в исходниках избавиться от «магических чисел», как правильно подметил Vga. Дело в том, что исходник который вы пользуете, предназначен для Mega128 и прочих у которых размер страницы и адресация страницы немного отличается от Mega8.
Код для записи в Mega8 вместо
for (j=0;j<64;j++)
{
k=store[0x800+i*128+j*2];
putLbyte(j,k);
k=store[0x800+i*128+j*2+1];
putHbyte(j,k);
}

должен быть:
for (j=0;j<32;j++)
{
k=store[0x800+i*64+j*2];
putLbyte(j,k);
k=store[0x800+i*64+j*2+1];
putHbyte(j,k);
}

И для верификации вместо
for (i=0;i<(80*64);i++)
{
k=store[0x800+i*2];
if (k!=getLbyte(i)) fuckoff();
k=store[0x800+i*2+1];
if (k!=getHbyte(i)) fuckoff();
}
должен быть:
for (i=0;i<(80*32);i++)
{
k=store[0x800+i*2];
if (k!=getLbyte(i)) fuckoff();
k=store[0x800+i*2+1];
if (k!=getHbyte(i)) fuckoff();
}
0
По сути вы замечательный человек что выложили полезный проект в сеть и то что отозвались на просьбы о помощи…
А моя недоработка что я до конца не разобрался в прицепе работы (я только учусь) и стал доставать вопросами.
0
Возник глупый вопрос:
как вы посоветуете в таком случае все же писать количество страниц в зависимости от размера программ или можно оставить 80?
Хотя почему 80 если у меги допустим 8й в RWW области 96 страниц
0
Цифра 80 родилась из размера моего бинарника. Берем размер бинарника, скажем, 5082 байта и делим его на 64 (размер страницы Mega8 в байтах, 32 слова), округляя результат в большую сторону.
Цифра должна подбираться под размер конкретной прошивки, либо как вы правильно заметили, берется максимально допустимый размер. Но максимальный размер невыгоден по времени. Если стоит задача прошивать партию устройств в промышленных масштабах, то времени будет тратиться меньше, если задавать конкретный размер страниц, чтобы не шить и не проверять пустые неиспользуемые страницы.
0
теперь данные пишутся правильно но он какого фига разорвал мне его вот
но мне кажеться что это я накуралесил
0
возник вопрос сейчас заполняю пробелы в знаниях…
64 байта 32 слова то есть грубо говоря 2 строчки хекса в моем случае?
0
Четыре строчки hex'а.
По 16 байт в строчке, 8 слов в строчке. 4 строчки = страничка Mega8
0
елки-палки вы правы!!!
0
тогда получается что он у меня отрывает страницу 2ю от первой и пишет ее через одну. Теперь становиться понятней буду ковырять еще раз спасибо вам за отзывчивость!
0
Если после ковыряния ничего не получится, кидайте с-исходник, гляну.
0
вот этот кусок задает адрес страницы если я правильно понимаю
void FlashPage(unsigned char page)
 {
  SPIFF(0x4C);
  SPIFF(page>>2);
  SPIFF(page<<6);
  SPIFF(0x00);
 }

то может причина в нем что он мне вторую страницу прошивки записывает через одну в третью???
:1000000012C019C018C017C016C015C014C013C044
:1000100012C011C010C00FC00EC00DC00CC00BC06C
:100020000AC009C008C011241FBECFE5D4E0DEBF5E
:10003000CDBF02D011C0E4CF84E087BB90E22FEFA8
:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
:1000800033EC49E0215030404040E1F700C000002F
:1000900088B3892788BBF3CFF894FFCFFFFFFFFF1A
:1000A000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF60
:1000B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF50
0
Да. Вы кажется правы, попробуйте:
SPIFF(0x4C);
SPIFF(0x0F&(page>>3));
SPIFF(page<<5);
SPIFF(0xFF);
0
ВСЕ работает=)
Только я как обычно по невнимательности не глянул лок и фьюз биты и после удачной прошивки таргет чип потух пришлось подпаиваться параллельным программатором чтоб разлочить…
но все теперь работает! СПАСИБО ВАМ ОГРОМНОЕ!!!
Не сочтите за наглость но не могли бы ли вы объяснить математику вот этого куска:
SPIFF(0x4C);
SPIFF(0x0F&(page>>3));
SPIFF(page<<5);
SPIFF(0xFF);

Я вижу что это битовые операции сначала 3 в право, запись, 5 в лево, запись.
Но вообщем не понимаю ситуацию с формированием адреса страницы. Объясните пожалуйста.
0
В даташите на AVRки, к примеру на Mega8, в разделе Memory Programming есть табличка Serial Programming Instruction Set. Нас интересует Write Program Memory Page. Гляньте. Переменная page у нас представлена одним байтом, а загружаться она должна с разрывом, как указано в табличке. Таковы особенности протокола программирования.
0
Ясно) Спасибо вам еще раз!
0
На здоровье :)
0
при записи: for (i=0;i<80;i++)
при верификации: for (i=0;i<(80*64);i++)
Фи, магические числа. Можно ж было их в дефайны вынести.
0
Полностью согласен.
0
Уважаемый автор, объясните, пожалуйста что делает TAP(0x0D,6)? Вы используете это перед шифтом «Programming Specific JTAG Instruction», но курение и перекуривание еще несколько раз даташита не очень помогло. В случае с TAP(0x03,4) всё понятно и остальное в коде предельно понятно. Прошу прощения за вопрос уровня «новичок-дебил». Заранее благодарен.
0
Вот что есть по этому поводу в даташитах Atmel:
PROG_COMMANDS ($5): The AVR specific public JTAG instruction for entering programming commands via the JTAG port. The 15-bit Programming Command Register is selected as data register. The active states are the following:
• Capture-DR: the result of the previous command is loaded into the data register.
• Shift-DR: the data register is shifted by the TCK input, shifting out the result of the previous command and shifting in the new command.
• Update-DR: the programming command is applied to the Flash inputs.
• Run-Test/Idle: one clock cycle is generated, executing the applied command.
То есть понятно, что мы должны что-то сделать, что-то сплясать, прежде чем использовать специфичные для программирования Atmel функции?
Это и делается путём навигации по TAP: 0x0D=001101, то есть путь будет таким (пользуйтесь блок схемой TAP-состояний): 1-0-1-1-0-0 (Select-DR Scan, Capture-DR, и т.д.). А потом уже снова, начиная с Run-Test/Idle можно приступать к Shift-IR.
0
Спасибо за ответ.Вроде же олучается, что Вы полностью проходите TAP из Run-State/Idle и возвращаетесь в Run-State/Idle, а потом вводите 0x05, а я так понял по даташиту и описаниям того же механизма у Xilinx — надо попасть в Shift-DR, ввести комманду, а уже потом двигаться дальше по TAP-состояниям и вводить инструкции, тоесть: 1-0 (дергаем TMS), скормить регистру 0х05 (дергаем TCK), а потом 1-1-0 (дергаем TMS), вываливаемся обратно в дефолтный режим, а дальше уже Shift-IR и т.д. Я так понимаю, даташиты я читать не умею, как видимо и вообще читать…
0
Вы всё верно понимаете.
Просто есть у AVR специфичные вещи, которые я описал выше. Так и выделено в документе: The AVR specific public JTAG instruction for entering programming commands via the JTAG port. Танцы с бубном. Не станцуешь с бубном — не войдешь в редим программирования.
0
приму к сведению))) Для меня контроллеры всего-лишь «интересно что это», а для Вас, как я понял, работа, так что… спасибо за разъяснения, удачи и успехов Вам.
0
Спасибо :)
0
Всем привет…
Может тема немного устарела, последний коммент больше двух лет назад был… Хотел узнать, возможно реализовать примерно тоже самое но МК должны общаться по UART, для того чтобы поменять только некоторые параметры в прошивке, с компа это делается очень легко с переходником USB-TTL и терминалом… Но хочется забить все команды в ATmega8 и не таскать всегда ноут с собой...:)
0
  • avatar
  • Tron
  • 17 марта 2016, 18:52
Конечно можно. Разрешаю!
+1
Ху… Я думал запретите!!!

Просто я не совсем понимаю как это сделать… В терминале я вбиваю конкретные цифры и слова а МК отвечает, а тут немного другое… В просторах примеров не обнаружил…
0
  • avatar
  • Tron
  • 17 марта 2016, 19:20
Ну так же и программе прошивалки. Пусть она отправляет запрос и слушает ответ. В зависимости от ответа дальше работаем. Или не работаем.
0
на каком этапе проблема? Прочитать, передать, принять, записать данные?
0
на начальном этапе, я до этого не писал для МК...((
Изучаю www.123avr.com/z5.htm
думаю через пару дней что-то будет…
0
Помнится мне, паршивенький это курс.
0
Готов выслушать и другие предложения…
0
Я подобными курсами не пользовался, так что мне предложить нечего. Хотя народ хвалит курс DIHALT'а.
0
сравнивать с терминалом и пакетной передачей данных немного некорректно.
Например, самый простой протокол передачи данных tftp
Он конечно использует tcp-ip протокол, всякие там crc32 и прочие вкусности.

Поэтому как я понимаю, вам можно разработать протокол обмена, состоящий из трех полей: Шапка, тело и контрольная сумма. Если данные фрагментируются или имеют определенный тип, то добавляем еще по полю в зависимости от функциональности. Можно стандартные использовать, например, modbus, в принципе, он на все случаи жизни, но может быть не всегда оправдан, так как может иметь излишества, например, поле адреса и прочее…
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.