Unified Program and Debug Interface (UPDI) — это однопроводной интерфейс для программирования/отладки новых 8-битных микроконтроллеров Atmel, пришедший на смену двухпроводному интерфейсу PDI, использовавшемуся для программирования микроконтроллеров AVR XMEGA.
Итак, полку атмеловских протоколов прибыло — ISP, JTAG, debugWIRE, TPI, aWire, PDI, теперь вот UPDI. При этом ситуация с экосистемой у AVR по-прежнему весьма нерадужная, так что мы собирались совсем уже отказываться от их использования, но последняя тенденция нас слегка порадовала, поэтому и была написана данная статья.
Использовать протокол UPDI могут только счастливые обладатели программатора Atmel ICE, который не очень удобен в эксплуатации из-за довольно странного выбора разъема, да и стоит не так уж дешево, чтобы позволить себе закупать его в промышленных масштабах. К тому же он требует установки Atmel Studio, которая периодически отказывается с ним работать, так как согласно политике нашей фирмы, большинство компьютеров не имеют доступа к Интернету, а студия периодически туда лезет то за драйвера, то за какими-то библиотеками, в итоге были моменты, когда программатор был виден в системе, то есть, драйвера установились верно, но в упор не замечался самой студией до тех пор, пока она не получила доступ к сети и не была обновлена принудительным образом.
Поэтому сразу же после того, как мы начали использовать в своих разработках новый и довольно удобный микроконтроллер ATTiny1616 (о его достоинствах позднее), возникла потребность в инструменте, который мы могли бы применять для записи в контроллер первичного загрузчика в продакшне. Разумеется, без смс и регистрации доступа к Интернету.
После небольших поисков я обнаружил на Гитхабе проект pyupdi (https://github.com/mraardvark/pyupdi) — реализацию протокола UPDI на Питоне, причем основана эта реализация на обычном протоколе UART, разве что без преобразователей уровня, что, на самом деле, еще удобнее, потому что позволяет использовать стандартные микросхемы преобразователей от FTDI или их китайские аналоги CH340/341.
Проект был скачан и опробован, дело пошло довольно бодро. Но через пару дней стало понятно, что он все-таки не совсем нам подходит. Причины:
- необходима инсталляция Питона и целой группы пакетов (напоминаю, речь идет о компьютерах без доступа к Инернету), пришлось скачать и вручную поставить почти десяток различных пакетов, которые зависимостями тянули друг друга. Да, в принципе, можно сделать из скрипта на Питоне исполняемый файл на другом компьютере, это как-то решало проблему, но на этом список проблем не заканчивался
- в скрипте почти отсутствует проверка на ошибки, любая ошибка заканчивается прерыванием с указанием кучи ссылающихся друг на друга файлов, что для рядового персонала выглядит не очень понятно
- невозможно прочитать содержимое памяти контроллера, что делает невозможным конечное тестирование процесса записи
- нет возможности прочитать фьюзы
- скорость работы скрипта оставляет желать лучшего, 16 кб пишутся почти минуту, связано это с отсутствием какой бы то ни было оптимизации в процессе передачи, все построено на жестких таймингах
- отсутствие индикации процесса записи
- проект не поддерживает целый ряд процессоров, которые мог бы поддерживать
- проект находится в полумертвом состоянии и не реагирует на запросы
Проблемы какое-то время решались в рамках Питона, но после любого фикса приходилось пересобирать проект, тестировать, так что появилось желание переписать скрипт на чем-то более привычном и быстром, то есть, на Си. Мы же эмбеддеры, в конце концов!
Теперь кратко о достоинствах нового семейства tinyAVR 1-Series:
- реальная унификация периферии и адресного пространства в рамках от 2 кб до 32 кб
- удобная конфигурация загрузчика (в начале памяти!)
- существенное упрощение алгоритма ISP (In-System-Programming)
- переход к фон-неймановской архитектуре
- до 32 кб флэш-памяти в мелком корпусе (3х3мм) с 24 выводами, из которых до 22(!) можно использовать как IO
- наличие внутреннего осциллятора на 16/20 МГц
- меньшая зависимость работоспособности от конфигурации фьюзов (вечная головная боль AVR)
- отличная для мелкого контроллера аналоговая часть (ADC/DAC/компараторы с возможностью как внутренней, так и внешней коммутации входов/выходов)
- однопроводные программирование и отладка
- крайне низкая цена в рознице (от 0.6€ за 16 кб)
В качестве железной части программатора мы взяли уже имеющийся в наличии преобразователь USB-UART TTL на базе китайского чипа CH340, вот такой:
Для программирования достаточно соединить два его вывода RX и TX, так как они уже оснащены выходным резистором на 1.5k, если резистор в Вашей модели преобразователя отсутствует, то его нужно добавить. Объединенный вывод соединяется с ножкой UPDI на программируемом чипе, земля преобразователя должна быть также соединена с землей контроллера. При наличии внешнего питания, нужно обратить внимание лишь на то, соответствует ли оно питанию, которое использует преобразователь (3.3В или 5В). Если есть необходимость, то можно запитать схему с контроллером и от самого преобразователя, что может быть очень удобным для первичного программирования.
Внимание! Резистор является опциональным, его нужно допаивать только в случае, если Ваш преобразователь не имеет никаких защитных резисторов на выходе.
Единственная проблема, которая связана с чипом CH340 — он не заработал в моей Линукс-версии программы, так как в протоколе программирования используется бит паритета, а драйвер CH340 в моей версии ядра работает с этим битом неправильно. Возможно, проблема будет устранена в ближайшее время, пока что заниматься этим у меня не хватило терпения.
В результате работы и экспериментов в IDE Code::Blocks была написана и отлажена программа updiprog, исходные коды которой выложены на Гитхабе.
Что было реализовано в данной версии программы:
- добавлена возможность считывания содержимого флэш-памяти контроллера в hex-файл
- добавлена возможность считывания состояния всех фьюзов контроллера
- по возможности добавлены обработки ошибок с соответствующими сообщениями
- добавлена индикация процесса записи/считывания
- значительно увеличена скорость работы (около 6 секунд для считывания 16 кб)
- добавлена поддержка всех микроконтроллеров семейства 1-Series
Исходный размер программы составляет около 25 кб в сравнении с 5 с копейками Мб для скомпилированного исходного скрипта на Питоне.
Надеюсь, что проделанная работа будет кому-то полезна. Буду рад отзывам и предложениям.
Автор: Polaris99