Наш магазин на eBay Наш магазин на AliExpress Наш канал в telegram

101 применение шлюза UART-to-I2C/SPI/1W (RH-0004). Часть 10. USB-программатор для последовательного программирования микроконтроллеров AVR на базе шлюза UART-to-I2C/SPI/1W

У большинства микроконтроллеров AVR имеется возможность заливать прошивку через последовательный интерфейс SPI. А раз так, — значит для этих целей вполне можно использовать шлюз RH-0004, нужно только написать соответствующее ПО. Именно этим я занимался весь последний месяц и сегодня, наконец, могу выложить на сайт программу, превращающую шлюз, помимо всего прочего, ещё и в USB-программатор микроконтроллеров AVR.

Параметры используемого для последовательного программирования SPI-интерфейса довольно подробно описаны в даташитах, я тезисно напомню только основные моменты:

  • используется SPI Mode0
  • размер пакетов SPI 4 байта (для некоторых AT89… — 3 байта)
  • данные передаются старшим битом вперёд
  • сигнал SS (slave select) передаётся через ногу RESET

Аппаратная часть программатора, как обычно, состоит из, собственно, UART-to-I2C/SPI/1W шлюза и USB-to-UART преобразователя:

USB-программатор микроконтроллеров AVR

Джампер выбора питания должен быть установлен в положение +5 Вольт.

Ниже показано главное окно программы:

Главное окно программы для программирования контроллеров AVR

В самом верху программы располагается строка меню. Через меню можно загрузить или сохранить в файл данные flash- или EEPROM-памяти (в форматах bin, hex или eep), сохранить в файл данные лога (в формате txt) или выбрать чип для работы. Кроме того, через пункт меню Edit->Lock & Fuses… открывается форма для чтения / записи Lock- и Fuse-битов микроконтроллера.

Под строкой меню, слева располагается выпадающий список для выбора com-порта и кнопки для подключения к выбранному порту или отключения от него (при подключении к ПК наш программатор будет определяться в системе как виртуальный com-порт).

Чуть правее располагается кнопка Autosearch Chip, при нажатии на которую программатор попытается автоматически определить подключенный к нему чип, прочитав байты сигнатуры. Стоит учесть, что процедура автоматического определения чипа не всегда возможна, поскольку некоторые контроллеры в залоченном состоянии байты сигнатуры не выдают. Для работы с такими контроллерами придётся выбрать их через верхнее меню.

Правее кнопки автоматического определения чипа расположены текстовые поля, содержащие название (Chip name) и байты сигнатуры (ID bytes) выбранного чипа.

Чуть ниже расположен трек-бар Delays value, предназначенный для выбора величины используемых в программе задержек. Дело в том, что нельзя передавать в шлюз новые команды, не дождавшись выполнения старых. Время, необходимое микроконтроллеру на выполнение различных команд и операций программирования (запись / чтение / стирание…), прописано в даташитах. Для обеспечения достаточного времени выполнения операций в программе используются задержки между передачами различных команд. Чаще всего менять значение по-умолчанию не требуется, но в случае возникновения сбоев можно попробовать увеличить величину задержек.

Ещё ниже располагаются основные функциональные кнопки для работы с контроллером, позволяющие читать (Read Program / Read Data), записывать (Write Program / Write Data) или проверять (Verify Program / Verify Data) данные программы или памяти EEPROM (при проверке данные в программе сравниваются с данными в чипе, при обнаружении различий адрес первого несоответствия выводится в лог). Кнопка Read Calibration позволяет прочитать записанные в чипе байты калибровки (результат выводится в лог), а кнопка Chip Erase стереть записанные во flash и EEPROM данные (при этом также происходит сброс Lock-битов).

Обратите внимание, что перед записью программы выполняется команда Chip Erase (так положено по даташиту), которая стирает данные не только во флеш, но и в EEPROM (если не запрограммирован специальный фьюз EESAVE). Так что если вы перезаписываете программу и у вас не запрограммирован фьюз EESAVE, то данные в EEPROM пропадут! Избежать этого можно либо предварительно считав данные EEPROM, а потом перезаписав их заново, либо запрограммировав фьюз-бит EESAVE перед программированием флеш.

В правом верхнем углу окна располагается схема подключения выбранного микроконтроллера к шлюзу. В левой части схемы указано какие выводы шлюза к каким ногам контроллера нужно подключать, а в правой части указаны номера и расположение соответствующих ног. Синим цветом на схеме показаны ноги, которые используются для подачи на микроконтролер тактового сигнала. Дело в том, что при программировании контроллер, помимо всего прочего, должен быть затактирован. Если в качестве тактового сигнала выбран внутренний генератор, то для программирования достаточно просто подключить сигналы шлюза к ножкам контроллера, обозначенным на схеме красным цветом. Если же в качестве тактового сигнала выбран внешний источник, скажем, кварцевый резонатор, то помимо сигналов от шлюза придётся к ножкам контроллера, отмеченным на схеме синим цветом, подключить этот самый кварцевый резонатор.

Переход в режим последовательного программирования осуществляется при низком уровне на ноге RESET. При высоком уровне на ноге RESET контроллер просто запускается в нормальном режиме работы, при этом используемые для программирования выводы могут оказаться запрограммированы как выходы с любым состоянием. Поскольку программатору при программировании приходится периодически переключать состояние ноги RESET, то возникает риск КЗ подключенных сигналов от шлюза. Чтобы избежать этого риска следует все сигналы шлюза (кроме питания и земли) подключать к микроконтроллеру через резисторы 1 кОм (это отражено на схемах подключения).

Работа с фьюзами и lock-битами происходит через отдельную форму, которую (как уже упоминалось выше) можно вызвать через пункт меню Edit->Lock & Fuses… При этом для всех чипов бит SPIEN будет защищён от изменения, поскольку переключив его в незапрограммированное состояние, мы потеряем возможность программировать чип через последовательный интерфейс.

Вот в общем-то и всё. Ниже выкладываю программу с исходниками, а также список поддерживаемых этой программой чипов:

Программа Исходники Описание (поддерживаемые чипы, изменения в коде и т.д.) Поддерживаемые ОС
AVR Serial SPI Programmer v.3.0b v.3.0b sources AT90S1200, AT90S2313, AT90S2323, AT90S2333, AT90S2343, AT90S4414, AT90S4433, AT90S4434, AT90S8515, AT90S8535, AT90CAN32, AT90CAN64, AT90CAN128

ATtiny12, ATtiny13, ATtiny15, ATtiny22, ATtiny2313, ATtiny25, ATtiny26, ATtiny261, ATtiny45, ATtiny461, ATtiny85, ATtiny861
Windows XP, Windows Vista, Windows 7, Windows 8
AVR Serial SPI Programmer v.3.1f v.3.1f sources Update 04.12.2021
+ ATmega103, ATmega128, ATmega1280, ATmega1281, ATmega16, ATmega161, ATmega162, ATmega163, ATmega164, ATmega168, ATmega169, ATmega2560, ATmega2561, ATmega32, ATmega323, ATmega324, ATmega48, ATmega603, ATmega64, ATmega640, ATmega644, ATmega8, ATmega8515, ATmega8535, ATmega88
-/-
AVR Serial SPI Programmer v.3.2 Duo v.3.2 Duo sources Update 03.06.2022
добавлена возможность работы со шлюзом RH-0010
-/-
AVR Serial SPI Programmer v.3.3 Duo v.3.3 Duo sources Update 03.01.2024
+ ATmega48PA, ATmega88PA, ATmega168PA, 1887ВЕ4У, 1887ВЕ7Т
-/-

P.S. Пока что это бета-версия программы. В неё добавлены только чипы серий AT90 и ATtiny, серию ATmega и, возможно, какие-нибудь другие чипы планируется добавить позже. Работоспособность программы пока проверена только для чипов ATtiny2313. Я конечно протестирую её со всеми чипами AVR, которые смогу найти, но было бы здорово, если бы и другие обладатели шлюзов подключились к этому процессу, протестировали работоспособность программы с другими чипами и отписались в комментариях о результатах. Все обнаруженные в процессе тестирования косяки и глюки можно выкладывать в комменты, на форум или на почту (желательно с логами).

  1. Часть 1. USB программатор микросхем EPROM с интерфейсом I2C
  2. Часть 2. USB программатор микросхем EPROM с интерфейсом SPI
  3. Часть 3. USB-термометр на DS18B20 с передачей данных по сети
  4. Часть 4. USB программатор микросхем EPROM DS2430
  5. Часть 5. USB-программатор микросхем EPROM DS24B33
  6. Часть 6. Подключение 3-осевого гироскопа/акселерометра MPU6050 к компьютеру
  7. Часть 7. USB-программатор микросхем EPROM DS2431
  8. Часть 8. USB-программатор микросхем 1-Wire
  9. Часть 9. USB программатор SPI-flash серии W25Qxx
  10. Часть 10. USB программатор для микроконтроллеров AVR (последовательное программирование через SPI)

Комментарии 4

  • Здравствуйте. Подскажите ка правильно подключить к программатору UART чип RW1990&

    • RW1990 — это записываемый 1-Wire ключ, соответственно, подключать нужно контакт GND ключа к контакту COM программатора, а контакт DATA ключа к контакту MOSI/1W/DATA программатора.
      В последней версии программы для работы с 1-Wire есть специальная кнопка, при нажатии на которую открывается схема подключения выбранного чипа (скачать можно здесь: https://radiohlam.ru/prog_usb_1-wire/)

  • Я подумал, что автору может быть интересно ознакомиться с реализацией аналогичной программы. https://habr.com/ru/articles/765970/
    Она хоть и про другие чипы, но например пользовательский интерфейс похожий…

    • Моим программатором и эти чипы тоже можно программировать. Не только AVR. Внизу статьи как раз список разных применений.
      Статья интересная. Я тоже, кстати, думаю под линух всё портировать. Сейчас вот как раз GTK под это дело изучаю. Линух шагает по стране, это факт. Тем более сейчас. Винды разные в виртуалке конечно есть, но это не очень удобно.

Добавить комментарий