AVR-USB162MU: макетирование и изготовление программатора AVRISP-MKII в домашних условиях
Написал microsin   
14.06.2011

Программатор AVRISP-MKII от компании Atmel - весьма серьезное устройство, которое может прошивать (только прошивать, внутрисхемную отладку он делать не умеет) большой список микроконтроллеров по протоколам ISP, PDI и TPI.

Вот этот список, взятый с сайта Atmel:

Atmel AVR 8- and 32-bit Automotive
ATmega164P, ATmega169P, ATmega324P, ATmega328P, ATmega644P, ATtiny24, ATtiny25, ATtiny44, ATtiny45, ATtiny84, ATtiny85

Atmel AVR 8- and 32-bit - AVR XMEGA
ATxmega128A1, ATxmega128A3, ATxmega128A4, ATxmega128D3, ATxmega128D4, ATxmega16A4, ATxmega16D4, ATxmega192A1, ATxmega192A3, ATxmega192D3, ATxmega256A1, ATxmega256A3, ATxmega256A3B, ATxmega256D3, ATxmega32A4, ATxmega32D4, ATxmega384A1, ATxmega64A1, ATxmega64A3, ATxmega64A4, ATxmega64D3, ATxmega64D4

Atmel AVR 8- and 32-bit - megaAVR
AT90PWM1, AT90PWM2, AT90PWM216, AT90PWM2B, AT90PWM3, AT90PWM316, AT90PWM3B, AT90PWM81, ATmega128, ATmega1280, ATmega1281, ATmega128A, ATmega16, ATmega162, ATmega164A, ATmega164P, ATmega164PA, ATmega165, ATmega165P, ATmega165PA, ATmega168, ATmega168A, ATmega168P, ATmega168PA, ATmega169, ATmega169A, ATmega169P, ATmega169PA, ATmega16A, ATmega2560, ATmega2561, ATmega32, ATmega324A, ATmega324P, ATmega324PA, ATmega325, ATmega3250, ATmega3250A, ATmega3250P, ATmega325A, ATmega325P, ATmega325PA, ATmega328, ATmega328P, ATmega329, ATmega3290, ATmega3290A, ATmega3290P, ATmega329A,  ATmega329P, ATmega329PA, ATmega32A, ATmega48, ATmega48A, ATmega48P, ATmega48PA, ATmega64, ATmega640, ATmega644, ATmega644A, ATmega644P, ATmega644PA, ATmega645, ATmega6450, ATmega6450A, ATmega6450P, ATmega645A, ATmega645P, ATmega649, ATmega6490, ATmega6490A, ATmega6490P, ATmega649A, ATmega649P, ATmega64A, ATmega8, ATmega8515, ATmega8535, ATmega88, ATmega88A, ATmega88P, ATmega88PA, ATmega8A

Atmel AVR 8- and 32-bit - tinyAVR
ATtiny12, ATtiny13, ATtiny13A, ATtiny15L, ATtiny20, ATtiny2313, ATtiny2313A, ATtiny24, ATtiny24A, ATtiny25, ATtiny26, ATtiny40, ATtiny4313, ATtiny43U, ATtiny44, ATtiny44A, ATtiny45, ATtiny48, ATtiny84, ATtiny84A, ATtiny85

MCU Wireless - Bundles
ATmega1280R212, ATmega1280R231, ATmega1281R212, ATmega1281R231, ATmega1284PR231, ATmega1284RZAP, ATmega128RZAV, ATmega128RZBV, ATmega2560R212, ATmega2560R231, ATmega2561R212, ATmega2561R231, ATmega256RZAV, ATmega256RZBV, ATmega644PR231, ATmega644R212, ATmega64RZAPV, ATmega64RZAV

Сделано довольно много попыток клонировать устройство, самый уважаемый из клонов пожалуй USBTiny Mkii (см. [2]).

USBTiny_MKii_Rev1-1_top.jpg USBTiny_MKii_Rev1-1_bottom.jpg USBTiny_MkII_Rev1-1_overview_brd_txt.jpg
USBTiny_MKii_connectors.png USBTinyMkII_Blue.jpg USBTiny_MkII_Rev2_overview_brd_txt.jpg

Исходники USBTiny Mkii доступны свободно в составе проектов библиотеки LUFA (см. [3], папка Projects\AVRISP-MKII\), но толковой схемы к сожалению нет. В Интернете есть довольно много схем по данной тематике и много разных кустарных прошивок, но разобраться во всей этой мешанине довольно сложно.

[AVRISP-MKII, интерфейс ISP]

Сначала попытался смакетировать и опробовать работу программатора в режиме ISP. Из комплектующих применил макетку AVR-USB162MU (см. [4]) и плату для макетирования без пайки ProsKit. В качестве подопытного микроконтроллера выступал ATtiny2313A. Для упрощения схемы буфер между программируемым микроконтроллером ATtiny2313A и макеткой AVR-USB162MU решил не ставить, чип ATtiny2313A запитал прямо от макетки через интерфейс USB. На ножке C6 макетки присутствует выходной сигнал частоты 4 МГц, который можно использовать как такты для "брикнутых" чипов, у которых ошибочно установлены перемычки fuses (в моем макете этот сигнал не используется и никуда не подключен). Вот вид собранного простого макета:

AVRISP-MkII-maket-IMG_1244.JPG

Исходники взял из библиотеки 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

ATtiny2313A сигнал AVR-USB162MU
PB5, выв. 17 MOSI B2
PB6, выв. 18 MISO B3
PB7, выв. 19 SCK B1
PA2, выв. 1 RST B4
GND, выв. 10 GND GND
VCC, выв. 20 VCC VCC
не используется 4MHz C6

Назначение сигналов в таблице (центральная колонка):

MOSI - Master Output Slave Input. Выход программирующего микроконтроллера, мастера шины SPI (в нашем случае это чип AT90USB162MU), вход программируемого чипа (в нашем случае это ATtiny2313A). Шина для последовательной передачи данных в программируемый чип (через протокол ISP передача команд, данных для записи в память или во фьюзы). 
MISO - Master Input Slave Output. Вход программирующего микроконтроллера, мастера шины SPI (в нашем случае это чип AT90USB162MU), выход программируемого чипа (в нашем случае это ATtiny2313A). Шина для последовательной передачи данных из программируемого чипа (через протокол ISP получение его состояния, содержимого памяти и фьюзов). 
SCK - Synchro ClocK. Выход программирующего микроконтроллера, мастера шины SPI (в нашем случае это чип AT90USB162MU), вход программируемого чипа (в нашем случае это ATtiny2313A). Шина для тактирования даннных на сигналах MOSI и MISO.
RST - ReSeT. Выход программирующего микроконтроллера (в нашем случае это чип AT90USB162MU), вход программируемого чипа (в нашем случае это ATtiny2313A). Шина для перевода программируемого чипа в состояние, когда он будет отвечать на комапнды протокола ISP.
GND - GrouND. Земля, общий провод, он же минус питания.
VCC - напряжение питания для программируемого чипа. В нашем примере как программатор (чип AT90USB162MU), так и программируемый чип (ATtiny2313A) питаются от шины USB напряжением +5 вольт. Это допустимо в том случае, если программируемое устройство не потребляет ток более 450 мА (так как ограничение одного порта USB на отдаваемый ток 500 мА). Перемычкой SJ1 можно переключить питание программируемого чипа с 5 вольт на 3.3 вольта, но в этом случае допустимый ток потребления программируемым чипом уменьшится до 100 мА, так как это ограничение внутреннего стабилизатора напряжения AT90USB162MU. Перемычка JP1 подает питание на программируемое устройство, её необходимо установить, когда программируемое устройство запитывается от программатора, и снять, если программируемое устройство питается от собственного источника питания.
4MHz - тактовая частота для подачи на программируемый микроконтроллер, если такая частота вдруг нужна. В нашем случае это не используется, так как в программируемом микроконтроллере ATtiny2313A в настоящий момент фьюзы настроены на использование внутреннего тактового генератора.

В левой колонке перечислены наименование ножек и номера выводов чипа ATtiny2313A (корпус PDIP20), а в правой колонке - наименование ножек макетной платы AVR-USB162MU (см. [4]). 

Если делать программатор AVRISP-MKII в режиме ISP на макетке AVR-USB162MU, то схема получается безумно простой (полная схема программатора AVRISP-MKII с интерфейсом ISP, если её собирать не на макетной плате AVR-USB162MU, будет посложнее).

AVRISP-MKII-isp-mode-AVR-USB162MU.PNG

Попробовал подключить новоиспеченный программатор AVRISP-MKII к компьютеру. Операционная система Windows XP радостно нашла новое устройство LUFA AVRISP MkII Clone и автоматически установила драйвер к нему. Драйвер будет присутствовать в системе и установится сам, если ранее Вы установили на компьютер AVRStudio.

AVRISP-MkII-setup01.PNG AVRISP-MkII-setup02.PNG AVRISP-MkII-setup03.PNG
AVRISP-MkII-setup04.PNG AVRISP-MkII-setup05.PNG AVRISP-MkII-setup06.PNG

Среда AVRStudio радушно приняла программатор как родной. По кнопке с иконкой микросхемы AVR можно запустить утилиту программатора. В диалоге настройки подключения (появляется при первом запуске, или при отсутсвии подключения к последнему настроенному программатору) нужно указать тип программатора IAVRISP mkII, и тип подключения USB. Далее запустится окно всем известной оболочки управления программатором.

AVRISP-MkII-AVRStudio01.PNG AVRISP-MkII-AVRStudio02.PNG AVRISP-MkII-AVRStudio03.PNG

При тестировании нашел и исправил неприятный баг, связанный с зависанием программатора, после чего он "отваливался" от системы и становился недоступным (до нового переподключения 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 оригинальная версия, с ошибкой]

DDRB  |=  ((1 << 1) | (1 << 2));
DDRB  &= ~((1 << 0) | (1 << 3));
PORTB |=  ((1 << 0) | (1 << 3));

  -->

[SPI_Init исправленный]

//DDRB |=  (           (1 << 1) | (1 << 2));
DDRB    |= ((1 << 0) | (1 << 1) | (1 << 2));
//DDRB &= ~((1 << 0) |                     (1 << 3));
DDRB   &= ~(                               (1 << 3));
PORTB  |=  ((1 << 0) |                     (1 << 3));

[SPI_ShutDown оригинальная версия]

DDRB &= ~((1 << 1) | (1 << 2));

  -->

[SPI_ShutDown исправленный]

//DDRB &= ~(          (1 << 1) | (1 << 2));
DDRB    &= ~((1 << 0) | (1 << 1) | (1 << 2));

Подробнее о работе сигнала ~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]).

AVRISP-MkII-PDI-mode-AVR-PX128A1-prog-IMAG0184.jpg

Схема подключения к программируемому чипу еще проще, используются только 3 провода (плюс четвертый питание). Если собирать программатор не на макетке AVR-USB162MU, то полная схема программатора AVRISP-MKII с интерфейсом PDI получится сложнее. Внимание! Почти все чипы XMEGA питаются от 3.3 вольт, поэтому перемычка SJ1 макетной платы AVR-USB162MU должна стоять в положении 2-3 на 3.3 вольта.

AVRISP-MKII-pdi-mode-AVR-USB162MU.PNG

Таблица соединений с чипом ATxmega128A1, корпус TQFP100

ATxmega128A1 сигнал AVR-USB162MU
PDI_DATA, выв.  89 PDI_IN D2
PDI_DATA, выв.  89 PDI_OUT D3
PDI_CLOCK, выв. 90 PDI_CLK D5
GND, выв. 13 (и другие)
GND GND

В AVRStudio 4.18 работа с микроконтроллерами XMEGA ничем не отличается от работы с микроконтроллерами других серий. Нужно только выбрать нужный чип и интерфейс программирования PDI. На закладке HW Settings напряжение питания VTarget показывается неправильно - всегда 5 вольт, хотя это недопустимое напряжение для выбранного чипа ATxmega128A1 (максимально допустимое напряжение питания 3.6 вольт). Это происходит потому, что в аппаратуре нашего клона AVRISP-MKII отсутствует возможность измерения напряжения питания программируемого микроконтроллера, и в firmware программатора отдаваемое значение VTarget программно зафиксировано на величине 5.0 вольт.

AVRISP-MkII-AVRStudio04.PNG AVRISP-MkII-AVRStudio05.PNG AVRISP-MkII-AVRStudio06.PNG AVRISP-MkII-AVRStudio07.PNG

Клон 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-AVRStudio08.PNG AVRISP-MkII-AVRStudio09.PNG AVRISP-MkII-AVRStudio10.PNG AVRISP-MkII-AVRStudio11.PNG AVRISP-MkII-AVRStudio12.PNG

[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 получится сложнее.

AVRISP-MKII-tpi-mode-AVR-USB162MU.PNG

Таблица соединений с чипом ATtiny20, корпус TSSOP14

ATtiny20 сигнал AVR-USB162MU
PB1, выв. 3 TPI_IN D2
PB1, выв. 3 TPI_OUT D3
PB0, выв. 2 TPI_CLK D5
GND, выв. 14
GND GND
VCC, выв. 1
VCC VCC

Микроконтроллеры с интерфейсом программирования TPI непопулярны, и в России на рынке практически отсутствуют.

[Ссылки]

1. Страничка программатора AVRISP mkII на сайте Atmel.
2. AVRISP-MKII Clone (2010).
3. Библиотека LUFA для микроконтроллеров AVR с аппаратным USB. Русское описание LUFA, документация на русском языке по API LUFA.
4. Макетная плата AVR-USB162MU.
5. AVR1612: PDI programming driver. AVR1005: Getting started with XMEGA - краткое описание XMEGA, как его программировать и отлаживать.
6. AVR918: Using the Atmel Tiny Programming Interface (TPI).
7. Прямая ссылка для закачки AVRStudio 5.0.1163 (без регистрации). 
8. Исходные коды программатора AVRISP-MKII (с исправленными багами), описанного в статье. Исходный код лежит в папке LUFA101122\Projects\AVRISP-MKII\, скомпилированная прошивка в подпапке hex, документация в подпапке doc.
9. Макетная плата Olimex AVR-PX128A1 с установленным чипом ATxmega128A1.

Последнее обновление ( 02.09.2011 )