Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Универсальный USB программатор для МК AVR, I2C EEPROM и SPI Flash 25ХХ

Решил на досуге чем-то себя развлечь, а заодно поупражняться в программировании, но немного увлёкся, и вот родился этот проект. Не как обычно какая-нибудь ненужная безеделушка, коих у меня насобиралось в закромах целая куча, а вполне полезная вещь - USB программатор для микроконтроллеров AVR, SPI Flash 25 серии и I2C EEPROM 24ХХ.

Изначально была идея потренироваться в пакетном обмене между микроконтроллером (STM32 в данном случае) и компьютером по COM порту. Сперва, как водится, я поуправлял светодиодами с компьютера через простой терминал, затем добавилась программа на C#. Потом первые пакеты получения ID микроконтроллера atmega328 и реализуя функцию за функцией, одновременно отлаживая прошивку "железной" части и софт на ПК, получился полноценный проект.

"Сердцем" программатора является stm32f103c8t6, многим известный по китайской платке blue pill. Подключен он к компьютеру через USB-UART конвертер (мой любимый CH340G). Кто-то сразу справедливо заметит, что в данном микроконтроллере есть аппаратный USB и можно спокойно реализовать виртуальный COM порт на нём (HID CDC устройство). Но! в "железном" конвертере есть один немаловажный плюс, там есть все линии COM порта, которые (в моём случае DTR) можно использовать для управления микроконтроллером. В соей схеме линия DTR управляет сбросом (NRST) микроконтроллера. Также большой плюс в том, что не возникает проблемы "яйца и курицы" при создании программатора (то есть, чем прошить сам программатор?). Добрые инженеры ST-microelectronics позаботились о нас и добавили USART bootloader в свои контроллеры. А так как на моей плате уже есть подключенный к USART1 STM-ки usb-usart конвертер, то остаётся только скачать STM-овскую программку STMFlashLoadDemonstratot, поставить перемычку "boot" (на моей плате ещё нужно закоротить вывод "reset" ISP разъёма AVR на плюс или минус того же разъёма просто, boot1 - PB0 у меня подключен на данный разъём, а при программировании через встроенный bootloder он не должен болтаться в воздухе) и прошить микроконтроллер готовой прошивкой.

Забежав вперёд, скажу, попутно я начал переделывать программатор на аппаратный USB, который я заблаговременно развёл на плате. USB у меня настроен как Custom HID. Скорость, конечно в 2-3 раза выше, но получить стабильной работы пока не удалось. Одиночные пакеты передаются туда-обратно без проблем, а вот при сплошном потоке во время операций чтения-записи прошивок пакеты иногда теряются. Но я над этим работаю.

Принцип работы моего программатора следующий: хост отправляет микроконтроллеру пакет с запросом, микроконтроллер отправляет пакет с ответом. Сам микроконтроллер без спроса ничего хосту не шлёт, кроме единственного случая - аппаратного сброса (отправляет пакет присутствия программатора). Также в обмене нет отправки пакетов через временные задержки, что могло бы вызвать зависание софта. Только запрос-ответ. Далее пакеты как со стороны хоста, так и со стороны "железа" обрабатываются в конструкции "switch-case" в зависимости от маркерного байта. 

Длину пакета я сделал фиксированную (23 байта). Это компромисс между количеством полезной информации в пакете и скоростью его передачи в случае служебных пакетов, несущих всего один полезный байт. Подробно пакет разбирать не буду, скажу только, что полезных байт в нем 16 (то есть тех, которые передают данные прошивок), остальные байты служебные (старт и стоп байты для проверки целостности пакета, маркер пакета, адрес). Конечно, было бы более эффективно сделать пакет не фиксированной длины, но это сильно усложнило бы софт и прошивку "железа".

Скорость обмена выбрал максимальную для CH340G - 2 мегабода. STM-ка на данной скорости работает без проблем. В итоге скорость обмена получилась приемлемая. Читать-писать AVR и I2C EEPROM очень комфортно, а вот SPI Flash - не очень. Уж сильно они ёмкие. Флешка на один мегабайт (не путать с мегабитом) пишется или читается примерно минуты четыре-пять. Соответственно 8 мегабайт будет читаться или писаться порядка 16-20 минут. Благо, что пакеты обмениваются стабильно и ошибок или обрывов при записи/чтении не возникает. В принципе, можно сходить попить чаю, пока пишется (шучу).

Теперь познакомимся по ближе с минимальной схемой программатора:

Минимальная схема представляет из себя микроконтроллер с минимальной обвязкой, USB-USART конвертером также в минимальной обвязке и разъёмами для программирования. В принципе, можно использовать туже плату Blue pill, подключая на проводах программируемое устройство, единственное что нужны подтяжки к плюсу 3v3 линий SCL и SDA I2C1 для программирования EEPROM.

Почему схема минимальная? Потому что изначально устройство разрабатывалось на самодельной оценочной плате с выведенными портами микроконтроллера. И этого было достаточно для программирования "на проводах" перечисленные микросхемы памяти и МК. А вообще, я ещё планировал поддержку микроконтроллеров PIC. Для этого в окончательной плате у меня ещё присутствует преобразователь напряжения на 12 вольт, схема управления питающими напряжениями, и преобразователь уровней 3v3 - 5v для ножек PGC, PGD и PGM PIC контроллеров.

Скажу сразу, с пиками у меня пока не срослось. На поверку они оказались редкостными уб... детьми без отца. Как оказалось в каждой линейке PIC есть куча подсемейств, которые отличаются не только набором команд, но и алгоритмами программирования и ещё кучей параметров. А ещё HEX файлы для PIC разных семейств также отличаются кардинально. В них содержаться и программа, и EEPROM, и биты конфигурации. И всё это по разным адресам и в разных количествах у разных моделей. Например PIC16F84 и PIC16F84A имеют разные алгоритмы записи и стирания, а также у них отличаются несколько команд. В общем, ни о какой стандартизации даже и речи быть не может, такое чувство, что инженеры PIC соревновались, кто сделает сложнее и хуже. Максимум, что я смог выжать из имеющегося у меня PIC16F73 это получить ячейку с  ID. И то не совсем корректное, хотя читается стабильно (если кто-то имеет опыт программирования PIC, не написания программ, а именно алгоритмов прошивки, можете поделиться опытом, попробую реализовать хотя бы пару линеек 16-х).

Для полноты картины приведу также схему преобразователя напряжения на 12 вольт:

Это MCP34063 в типовом включении.

А также схему преобразователей уровней и управления напряжениями 5 вольт и 12 вольт:

Преобразователи уровней двунаправленные, сделаны на полевых n-mosfet. Работают в оба направления, так как ножки микроконтроллера, на которых они висят сконфигурированы как Open Drain. А в данном режиме у STM32 даже если пин сконфигурирован как выход, всегда можно прочитать его текущий логический уровень. Получается такой своеобразный псевдо-двунаправленный порт. Очень удобная штука. Полезная для реализации двунаправленных шин (например, 1-Wire). 

Ключи для управления напряжениями 5в и 12в я скопировал из схемы программатора К-150. Они сделаны через два элемента "НЕ" микросхемы 74ls06 (у меня работает на 74als05) и транзисторах BC856.

На разъём программирования ICSP для PIC я планирую в ближайшее время ещё повесить Microwire EEPROM. У них с пиками очень похожие протоколы программирования и как раз многие модели требуют именно 5 вольт. Так что, если с пиками не получится, то разъём будет полезен для этих EEPROM.

Пришло время познакомиться с управляющей программой. Приложение написано в Visual Studio на языке C#. Для его работы понадобится пакет .NET.Framework 4.7 или выше. Интерфейс программы интуитивно понятный. Никаких деревьев настроек и всплывающих меню. Только кнопки, комбо боксы и поля ввода. Все кнопки и поля подробно подписаны, трудностей возникнуть не должно.

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

Основная "фишка" программы - возможность добавления моделей программируемых устройств. Для этого в каталоге с программой есть три xml файла, в которые очень легко добавить новую модель. Для AVR достаточно скачать datasheet на нужную модель. Найти раздел Memory Programming. Найти там количество страниц памяти, объём страницы памяти (16 битных слов), объём EEPROM в байтах и три байта ID микроконтроллера. Также нужны начальные настройки Fuse bits, их можно найти в online калькуляторах, например, AVR fuse calculator. Затем, в соответствующем xml файле (avr.xml) копируем один однотипный блок, вставляем его выше или ниже и подправляем данные. Сделать это можно в простом блокноте "notepad". Пример блока для AVR:

  <name model="at90usb162">
    <page_size>64</page_size> 
    <page_count>128</page_count>
    <ee_size>512</ee_size>
	<l_fuse>62</l_fuse>
	<h_fuse>D9</h_fuse>
	<e_fuse>F7</e_fuse>
	<l_bits>FF</l_bits>
	<id>1E9482</id>
  </name>

Добавлять модели I2C EEPROM нет необходимости, так как микросхемы разных производителей программируются однотипно. А основные модели до 24х256 уже внесены. А вот новые модели SPI Flash вносятся аналогично AVR. Из datashet необходимо узнать объём флешки в байтах, объём одной страницы данных и количество страниц. Также можно узнать ID, но его можно просто прочитать программатором, а затем внести в xml файл.

Есть некоторые особенности программирования AVR и SPI Flash. Если AVR новый или его fuse bits настроены на внутренний генератор и низкую частоту тактирования, то он не будет реагировать на комманды программатора. Для этого во вкладке настроек необходимо выставить скорость SPI на "6" или ниже - это низкоскоростной Soft SPI, затем прошить фузы и можно лить прошивку на более высокой скорости. Но не рекомендую для AVR ставить скорость больше "8", он просто не справится с ней. Также не напортачьте с Fuse битами, выставляйте внимательно их значения. Если в соответствующих окнах будут установлены неправильные символы (кирилица или символы, кроме 0-9 и A-F), то биту будут программироваться как 0xFF. Значение битов вносится в шестнадцатиричном виде два символа без приставки "0x" или постфикса "h", регистр не важен. Будьте внимательны, неправильные Fuse биты могут окирпичить ваш микроконтроллер. При установленных Lock Bits их сброс производится стиранием чипа. Не забывайте, что в AVR биты инверсные: 0 - запрограммирован, 1 - не запрограммирован.

Во вкладке "SPI Flash" функция чтения/записи Sreg1 и Sreg2 регистров. Это регистры настроек и флагов. Если в них установлены биты защиты, то некоторые или все блоки памяти будут доступны только для чтения и вы не сможете их стереть или записать. Для этого читаем значения Sreg, запоминаем или записываем на бумажку, вводим в оба поля по два нуля, записываем. После этого можно стирать и записывать флешку. После того как записали, возвращаем обратно значения Sreg, если нужно.

При работе с I2C EEPROM - никаких особенностей, только правильно выбирайте модель, иначе при чтении можно повесить шину I2C и она выдаст ошибку. Это связано с разной адресацией байт в EEPROM разного объёма.

Есть общая особенность функции сравнения записанной прошивки для всех устройств: перед проверкой сначала нужно прочитать микросхему. Потому что при нажатии на кнопку "Сравнить" автоматически чтения не происходит. Об этом, если что, напомнят всплывающие MessageBox-ы.

Программа принимает для записи файлы формата intel-HEX или любые другие файлы в сыром виде. Сохраняет только в формате BIN. То есть вы можете записать обычный HEX, при этом он предварительно конвертируется в массив байт или открыть любой другой файл в виде набора байт, например записать на флешку картинку или текстовый файл.

Кстати , в процессе разработки программы родился побочный проект - HEX-to-BIN конвертер. Он конвертирует 16 битные hex в BIN файлы. Его я также выложу вместе с софтом программатора в конце статьи (особых коммерческих надежд на проект я не возлагаю, пользуйтесь на здоровье).

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

Качество платы, конечно не заводское, плата односторонняя с кучей перемычек, но для домашних поделок - пойдёт.

P.S: Софт довольно сырой. Могут возникать не обрабатываемые исключения и программа может завершаться с ошибкой. Всё протестировать я не успел. Из имевшихся у меня AVR а пробовал работать с ATMEGA8, ATMEGA328, ATMEGA128, ATTINY2313. Также подключал AT90USB162, но я не уверен в корректности работы с его Flash памятью из-за bootloader-а. Фузы программируются правильно.

Из флешек я пробовал WINBOND W25Q80, W25Q64, также менее ёмкие AC25512 и мегабитную от MXIC (не помню маркировку).

EEPROM были проверены со всеми вариантами адресации (у меня были в наличии AT24C01, AT24C02, 24C08, 24C16, 24C32 и 24C256).

Разводку платы я также выложу в конце статьи в формате Sprint Layout. Я постарался подписать все элементы на плате, там где не поместилось - подписал в свойствах деталей. У меня есть такая фишка на платах, я рисую и резисторы и конденсаторы макросами конденсаторов, потому что макросы резисторов в спринте очень крупные по сравнению с конденсаторами того же типоразмера, так что не удивляйтесь. Плата сделана под SMD компоненты, самые маленькие - размером 0603, да и у STM-ки ножки очень мелкие. Я делаю платы фоторезистом, поэтому это не проблема. Но если делать ЛУТ, то надо очень постараться. Не каждый возьмётся за такие мелкие детали.

P.P.S: В будущем попробую перевести программатор на шину USB, а также добавить поддержку других типов устройств. В первую очередь Microwire. Также были попытки переделать программатор на Cortex M0 (STM32F030K6T6) как более дешёвый. Но я лишний раз убедился, что это то ещё г. Вроде бы один производитель, схожие архитектуры ядер. Но оказалось столько отличий и косяков в модулях этого семейства, что после дня экспериментов я так и не смог настроить адекватное чтение по SPI в 8-битном режиме и передумал. Возможно попытаюсь позже. Так как развёл и спаял под него аналогичную плату.

P.P.P.S: Как и обещал, дополняю статью новыми версиями софта, прошивок и плат. Выкладываю версию софта и прошивки под чистый USB на той же плате с stm32f103c8t6. Так же выкладываю новую версию софта под программаторы COM (в первую очередь для варианта на stm32f030k6t6, так как для F103 уже не актуален COM порт). И сама плата и прошивка для F030 (схема аналогичная F103, только без второго USB, все элементы в Lay файле подписаны в их свойствах). И да, новые прошивки с первой версией софта будут работать не совсем корректно (в частности, чтение AVR). В новых версиях также исправлена одна серьёзная ошибка, точнее недочёт с отображением данных HEX.

Собирайте, пользуйтесь, пишите комментарии.

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Основная схема
ic3 МК STM32
STM32F103C8
1 Поиск в магазине ОтронВ блокнот
ic2 Линейный регулятор
AMS1117-3.3
1 Поиск в магазине ОтронВ блокнот
ic1 МикросхемаCH340G1 Поиск в магазине ОтронВ блокнот
XT1 Кварцевый резонатор12 MHz1 Поиск в магазине ОтронВ блокнот
XT2 Кварцевый резонатор8 MHz1 Поиск в магазине ОтронВ блокнот
c2, c3, c9, c10 Конденсатор12p4 Поиск в магазине ОтронВ блокнот
c1, c5-c7 Конденсатор100n4 Поиск в магазине ОтронВ блокнот
R1, R2 Резистор
10 кОм
2 Поиск в магазине ОтронВ блокнот
R3, R4 Резистор
4.7 кОм
2 Поиск в магазине ОтронВ блокнот
D1 Выпрямительный диод
1N4148
1 Поиск в магазине ОтронВ блокнот
Дополнительная схема с преобразователями уровней
DD1 ИС буфера, драйвера
SN74LS06
1 74LS05Поиск в магазине ОтронВ блокнот
T1, T2 Биполярный транзистор
BC856
2 Поиск в магазине ОтронВ блокнот
T3-T5 MOSFET-транзистор
2N7002
3 SMD маркировка G28Поиск в магазине ОтронВ блокнот
R1, R2 Резистор
3 кОм
2 Поиск в магазине ОтронВ блокнот
R4-R6 Резистор
1 кОм
3 Поиск в магазине ОтронВ блокнот
R3, R9-R14, Резистор
4.7 кОм
7 Поиск в магазине ОтронВ блокнот
R7-R8 Резистор
10 кОм
2 Поиск в магазине ОтронВ блокнот
Схема преобразователя напряжения
IC1 МикросхемаMCP340631 Поиск в магазине ОтронВ блокнот
R1 Резистор0.22R1 Поиск в магазине ОтронВ блокнот
R2 Резистор180R1 Поиск в магазине ОтронВ блокнот
R3 Резистор
1.5 кОм
1 Поиск в магазине ОтронВ блокнот
R4 Резистор
13 кОм
1 Поиск в магазине ОтронВ блокнот
C1, C3 Конденсатор100uFx16v2 Поиск в магазине ОтронВ блокнот
C2 Конденсатор510p1 Поиск в магазине ОтронВ блокнот
D1 Диод Шоттки1N59171 Поиск в магазине ОтронВ блокнот
L1 Катушка индуктивности100мкГн1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 15.08.2020 0 1
Я собрал 0 4
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 4 чел.

Комментарии (17) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
+1

[Автор]
AndrejChoo #
Пока статья была на модерации, почти готова к релизу версия программатора USB HID (скорость гораздо выше), а также готова lite версия программатора на stm32f030k6t6 (более дешёвый и в паябельном корпусе, как у восьмой атмеги tqfp32), а также новая версия софта под COM порт для обоих вариантов плат. И во всех вариантах добавлена поддержка MicroWire eeprom (пока только 8bit режим, но это не важно, как его шить).
Опубликую чуть позже, если будет интересно.
Отредактирован 25.07.2020 21:38
Ответить
0
andro #
Да интересно, опубликуйте пожалуйста, заранее благодарю!
Ответить
0
Артём #
Интересно, даже очень!
HID сложно понять и примеров не так много. 030 камень становится популярнее.
Ответить
0
Андрей #
Все здорово. Но по мне гораздо эфективнее за основу взять STM link V2.0 - 150р. на али.
Готовая плата с STM32F103C8 и usb, остается добавить свои шнурки/переходники на AVR, Ееprom и залить в него свою прошивку?
Ответить
0

[Автор]
AndrejChoo #
Можно. Только там в развязке стабилитроны на выходе висят. И microwire не все пойдут, так как некоторые модели только от 5 вольт работают. А так - можно и st-link. А если уж покупать готовое, то ch341.
В моём случае интереснее собрать самому.
Ответить
0
andro #
Как по мне, то автор описал очень полезное и нужное устройство, лично Я по возможности желаю собрать такое. Нужно ещё подобный программатор, работающий автономно - типа записал в него прошивку, а потом прошивай им микроконтроллеры без компа, если знаете простой вариант, подскажите.
Ответить
+1

[Автор]
AndrejChoo #
Постараюсь дополнить статью в ближайшее время.
Что по поводу автономного программатора, была такая идея. Но, для начала, решил изобрести такой велосипед. В принципе, ничего сложного в автономном проггере нет. Большая часть программы легко адаптировать под работу с sd картой. Нужно только время и желание. И новая плата.
А пока работаю над другим проектом - параллельным программатором usb для параллельных flash и eeprom.
Ответить
0
andro #
Искренне благодарю!
Ответить
0
RioDeJaneiro #
Очень полезная вещь получилась. Была мысль такое же сделать, но купил готовый программатор для spi flash, не терпелось прошить её.
И недавно попробовал с помощью ЛУТ сделать плату с такой же stm. Контакты посадочного места микросхемы закоротили где-то, короче брак. Буду уже фоторезистом пробовать.
Ответить
0

[Автор]
AndrejChoo #
Берите жидкий, плёнка - фуфло полное. А для шаблонов обязательно полёнку для печати. Потому что калька или бумага - это всё ерунда. Удачи.
Ответить
0
Зухель #
Вы просто не умеете пленочным работать, или попадался вам очень китайский.
На самом деле, пленочный ФР гораздо технологичнее.
Ответить
0
Зухель #
Блин, чувак, у STM32F103C8 есть собственный USB, а ты ставишь CH340, преобразовывая в UART. Отсюда и падение скорости.
Ответить
0

[Автор]
AndrejChoo #
Читайте внимательно конец статьи.
Ответить
0
Geĉjo #
1. Есть такая м/с SN74LVC1T45 -- согласователь уровней. Может полезна будет... Хотя... Вы скорее всего про такие знаете.
2. Насколько я понял, софт "заточен" под винду. Эх, а я плотно на линухах сижу...
Ответить
0

[Автор]
AndrejChoo #
Преобразователь уровней, конечно, можно было поставить, но в таком случае их надо минимум два или один с двумя шинами, потому что сигнальные линии разнонаправленные, а это намного дороже, чем три транзистора. Тем более на транзисторах преобразователь уровней работает одновременно в двух направлениях без дополнительных манипуляций (в случае с lvc45 это переключение уровня на Пине dir).
А софт должен работать из-под wine. Правда, я не знаю как на Линуксе с libusbdotnet.
Ответить
0
Андрей #
Я такой же вариант допиливаю, делал его для программирования EC контроллеров типа KB90xx,ITE85XX, MEC. За одно и 24 и 25 серию прицепил. Изначально использовал связку на stm8 и ch340, затем отказался от stm8, использую stm32f030. Далее окажусь от ch340 из-за малой скорости.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
Бокс для хранения компонентов Автомобильный GPS-трекер с GSM/GPRS и дистанционным управлением
вверх