AVR-USB162MU: макетирование и изготовление программатора AVRISP-MKII в домашних условиях |
Написал microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
14.06.2011 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Программатор AVRISP-MKII от компании Atmel - весьма серьезное устройство, которое может прошивать (только прошивать, внутрисхемную отладку он делать не умеет) большой список микроконтроллеров по протоколам ISP, PDI и TPI. Вот этот список, взятый с сайта Atmel:
Atmel AVR 8- and 32-bit Automotive
Atmel AVR 8- and 32-bit - AVR XMEGA
Atmel AVR 8- and 32-bit - megaAVR
Atmel AVR 8- and 32-bit - tinyAVR
MCU Wireless - Bundles Сделано довольно много попыток клонировать устройство, самый уважаемый из клонов пожалуй USBTiny Mkii (см. [2]).
Исходники USBTiny Mkii доступны свободно в составе проектов библиотеки LUFA (см. [3], папка Projects\AVRISP-MKII\), но толковой схемы к сожалению нет. В Интернете есть довольно много схем по данной тематике и много разных кустарных прошивок, но разобраться во всей этой мешанине довольно сложно. [AVRISP-MKII, интерфейс ISP] Сначала попытался смакетировать и опробовать работу программатора в режиме ISP. Из комплектующих применил макетку AVR-USB162MU (см. [4]) и плату для макетирования без пайки ProsKit. В качестве подопытного микроконтроллера выступал ATtiny2313A. Для упрощения схемы буфер между программируемым микроконтроллером ATtiny2313A и макеткой AVR-USB162MU решил не ставить, чип ATtiny2313A запитал прямо от макетки через интерфейс USB. На ножке C6 макетки присутствует выходной сигнал частоты 4 МГц, который можно использовать как такты для "брикнутых" чипов, у которых ошибочно установлены перемычки fuses (в моем макете этот сигнал не используется и никуда не подключен). Вот вид собранного простого макета: Исходники взял из библиотеки LUFA (см. [3], папка Projects\AVRISP-MKII\), опции даже менять почти не пришлось, нужно было только добавить программные драйверы для платы (в LUFA\Drivers\Board\ создал папку MICROSIN162MU как копию уже имеющейся папки MICROSIN162, поправил файл LEDs.h в этой папке, и отредактировал файл LUFA\Common\BoardTypes.h - добавил туда по аналогии описание для новой платы). Make clean, make all в папке Projects\AVRISP-MKII\, и готовый файл прошивки AVRISP-MKII.hex у меня на руках. Прошил его с помощью утилиты Flip в память чипа AT90USB162MU макетки AVR-USB162MU. Таблица соединений с чипом ATtiny2313A, корпус PDIP20
Назначение сигналов в таблице (центральная колонка):
MOSI - Master Output Slave Input. Выход программирующего
микроконтроллера, мастера шины SPI (в нашем случае это чип
AT90USB162MU), вход программируемого чипа (в нашем случае
это ATtiny2313A). Шина для последовательной передачи данных в
программируемый чип (через протокол ISP передача команд, данных для
записи в память или во фьюзы). В левой колонке перечислены наименование ножек и номера выводов чипа ATtiny2313A (корпус PDIP20), а в правой колонке - наименование ножек макетной платы AVR-USB162MU (см. [4]). Если делать программатор AVRISP-MKII в режиме ISP на макетке AVR-USB162MU, то схема получается безумно простой (полная схема программатора AVRISP-MKII с интерфейсом ISP, если её собирать не на макетной плате AVR-USB162MU, будет посложнее). Попробовал подключить новоиспеченный программатор AVRISP-MKII к компьютеру. Операционная система Windows XP радостно нашла новое устройство LUFA AVRISP MkII Clone и автоматически установила драйвер к нему. Драйвер будет присутствовать в системе и установится сам, если ранее Вы установили на компьютер AVRStudio. Среда AVRStudio радушно приняла программатор как родной. По кнопке с иконкой микросхемы AVR можно запустить утилиту программатора. В диалоге настройки подключения (появляется при первом запуске, или при отсутсвии подключения к последнему настроенному программатору) нужно указать тип программатора IAVRISP mkII, и тип подключения USB. Далее запустится окно всем известной оболочки управления программатором. При тестировании нашел и исправил неприятный баг, связанный с зависанием программатора, после чего он "отваливался" от системы и становился недоступным (до нового переподключения USB). Зависание устройства происходило из-за зацикливания в процедуре SPI.h -> SPI_TransferByte (цикл while (!(SPSR & (1 << SPIF)));). Причина зависания была в том, что сигнал ~SS порта SPI (порт PB0 чипа AT90USB162, вывод 14) был в процедуре SPI.h -> SPI_Init ошибочно настроен как ВХОД С НАГРУЗОЧНЫМ РЕЗИСТОРОМ (pull-up). Этот порт PB0 (сигнал ~SS порта SPI, который может использоваться для выборки аппаратуры, работающей по шине SPI) не был никуда подключен и не использовался ни в аппаратуре, ни в программе AVRISP-MKII. Из-за того, что сигнал ~SS не успевал нарасти до уровня лог. 1 (из-за емкости монтажа?) в момент начала передачи функцией SPI_TransferByte, узел SPI ошибочно детектировал "захват" шины SPI другим мастером (которого конечно же нет). Баг носит случайный характер, и иногда не проявляется (из-за шума на цепях питания и в линии ~SS). Чтобы полностью устранить баг, нужно либо повесить ножку ~SS (порт PB0 микроконтроллера AT90USB162MU для нашего случая), либо настроить сигнал ~SS порта SPI как ВЫХОД (с любым логическим состоянием, 0 или 1). Вот что я рекомендую исправить в подпрограммах SPI_Init и SPI_ShutDown: [SPI_Init оригинальная версия, с ошибкой]
--> [SPI_Init исправленный]
[SPI_ShutDown оригинальная версия]
--> [SPI_ShutDown исправленный]
Подробнее о работе сигнала ~SS порта SPI можно прочитать в даташите AT90USB162, раздел 16.1 SS Pin Functionality ("If SS is configured as an input, it must be held high to ensure Master SPI operation." - можно перевести как "Если порт SS скофигурирован как вход (тут идет речь о режиме Master SPI), то для обеспечения функционирования мастера шины (SPI) его уровень должен удерживаться в состоянии логической 1"). [AVRISP-MKII, интерфейс PDI] Интерфейс PDI используется для программирования микроконтроллеров серии XMEGA. PDI (Program and Debug Interface) - проприетарный интерфейс Atmel для программирования и отладки устройств на микроконтроллерах (подробнее см. AVR1612 и AVR1005 [5]). Программирование микроконтроллеров серий XMEGA поддерживается в AVRStudio начиная с версии 4.18, сейчас уже доступна для закачки AVRStuduo версии 5 (см. [7]). В качестве испытуемого чипа XMEGA для программирования был выбран ATxmega128A1, установленный на макетной плате Olimex AVR-PX128A1 (см. [9]). Схема подключения к программируемому чипу еще проще, используются только 3 провода (плюс четвертый питание). Если собирать программатор не на макетке AVR-USB162MU, то полная схема программатора AVRISP-MKII с интерфейсом PDI получится сложнее. Внимание! Почти все чипы XMEGA питаются от 3.3 вольт, поэтому перемычка SJ1 макетной платы AVR-USB162MU должна стоять в положении 2-3 на 3.3 вольта. Таблица соединений с чипом ATxmega128A1, корпус TQFP100
В AVRStudio 4.18 работа с микроконтроллерами XMEGA ничем не отличается от работы с микроконтроллерами других серий. Нужно только выбрать нужный чип и интерфейс программирования PDI. На закладке HW Settings напряжение питания VTarget показывается неправильно - всегда 5 вольт, хотя это недопустимое напряжение для выбранного чипа ATxmega128A1 (максимально допустимое напряжение питания 3.6 вольт). Это происходит потому, что в аппаратуре нашего клона AVRISP-MKII отсутствует возможность измерения напряжения питания программируемого микроконтроллера, и в firmware программатора отдаваемое значение VTarget программно зафиксировано на величине 5.0 вольт. Клон AVRISP-MKII в режиме PDI я также попробовал в среде Atmel AVR Studio 5 (Version: 5.0.1163). После установки AVR Studio 5, если у Вас раньше была установлена AVR Studio 4, на компьютере будут мирно существовать обе версии, и можно пользоваться каждой версией. В AVRStudio 5 внешний вид оболочки программатора сильно отличается, но принцип работы не поменялся. Все так же нужно выбрать тип чипа, тип интерфейса программирования (PDI для серии AVR XMEGA), разные функции так же разбросаны по разным разделам (раньше разделы соответствовали закладкам, теперь сгруппированы в левом наборе кнопок). Я попробовал считать сигнатуру чипа, дамп памяти flash, куда была записана тест-программа Olimex, поигрался с фьюзами, все работало отлично. Новая оболочка теперь предупреждает о том, что напряжение питания чипа не сооветствует допустимому, но работе это не мешает. [AVRISP-MKII, интерфейс TPI] Интерфейс TPI (Tiny Programming Interface) используется для программирования low-end микроконтроллеров Atmel серий ATtiny4, ATtiny5, ATtiny9, ATtiny10, ATtiny20, ATtiny40. TPI по сути обычный USART с двунаправленным сигналом данных и дополненный тактовым сигналом. Подробнее можно почитать в документе AVR918 [6]. Для даташита AVR918 доступны исходные коды прошивки для программатора TPI на основе микроконтроллера ATmega324P. Схема программатора в режиме TPI очень похожа на режим PDI, отличается только цоколевой 6-пинового разъема и наличием дополнительного сигнала RST. Если собирать программатор режима TPI не на макетной плате AVR-USB162MU, то полная схема программатора AVRISP-MKII с интерфейсом TPI получится сложнее. Таблица соединений с чипом ATtiny20, корпус TSSOP14
Микроконтроллеры с интерфейсом программирования TPI непопулярны, и в России на рынке практически отсутствуют. [Ссылки]
1. Страничка программатора AVRISP mkII на сайте Atmel. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее обновление ( 02.09.2011 ) |