Написал очередную программу для шлюза RH-0010. На этот раз программа предназначена для программирования микроконтроллеров PIC в режиме последовательного высоковольтного программирования. Ниже рассказано и показано в картинках что для этого нужно и как с этой программой работать.
Аппаратная часть: USB-to-UART преобразователь + UART-to-I2C/SPI/1W шлюз RH-0010 (нам понадобится базовый модуль, модуль питания и модуль PIC). Собираем всё это вместе как на картинке ниже.
Для чипов с питанием +3,3 Вольта (серия LF) джампер JP1 на базовом модуле должен быть установлен в положение A, а для чипов с питанием +5 Вольт (серия F) — в положение B. Джампер JP2 можно установить как угодно.
Для генерирования напряжения программирования (Vpp) используется модуль питания. В качестве внешнего источника питания для этого модуля подойдёт любая телефонная зарядка на +5 Вольт с разъёмом Type-C. Обратите внимание, что помимо разного напряжения питания, контроллеры PIC так же отличаются разным напряжением программирования. Значения требуемых вашему контроллеру напряжений питания и программирования всегда можно посмотреть в документации (вообще любую работу с каким-либо микроконтроллером следует начинать с изучения документации на него). Нужное напряжение программирования настраивается переменным резистором на модуле питания. Эта настройка должна быть выполнена до начала работы с контроллером, поскольку слишком большое напряжение программирования способно его повредить!
Помимо аппаратной части нам понадобится программа. Ниже показано главное окно программы:
В самом верху программы располагается строка меню. Через меню можно загрузить из файла или сохранить в файл (bin или hex) память программы, конфигурации или данных (или сразу все области памяти в один файл), а также сохранить в файл данные лога (в формате txt). Также из меню можно выбрать чип для работы (пункт Chip Select) и получить помощь относительно подключения выбранного чипа к шлюзу (Help -> How to connect…). Кроме того, через пункт меню Edit->Configuration word(s)… открывается форма для побитного редактирования слова или слов конфигурации.
Касательно сохранения данных хотелось бы отметить вот что, — в памяти данных данные лежат по байтам (в отличии от памяти программ и конфигурации, где размер данных — слово), однако в hex-файлах они всё равно хранятся словами, просто у каждого слова старший байт равен нулю. Я сделал точно также (раз уж так положено), но вот в бинарнике я сделал сохранение памяти данных без лишних старших байтов (благо микрочип данные прошивок в бинарниках вообще не хранит, только в хексах, поэтому тут я никаких ограничений не испытывал, сделал так, как считаю рациональнее).
Ещё хотел бы отметить одну особенность работы с формой редактирования слова или слов конфигурации. Тут я не стал заморачиваться с расшифровкой значений тех или иных битов и их сочетаний, поскольку это всегда можно и нужно смотреть в документации (с этими расшифровками во многих программах полно ошибок). Вместо этого просто все биты перечислены по именам и если бит сброшен в 0 (запрограммирован), то напротив него взведён чекбокс (установлена галочка), если же бит установлен в 1 (не запрограммирован), то чекбокс напротив него сброшен (галочка отсутствует).
Далее. Под строкой меню, слева располагается выпадающий список для выбора com-порта и кнопки для подключения к выбранному порту или отключения от него (при подключении к ПК наш программатор будет определяться в системе как виртуальный com-порт).
Чуть правее располагается кнопка Autosearch Chip, при нажатии на которую программатор попытается автоматически определить подключенный к нему чип, прочитав байты сигнатуры. Стоит учесть, что процедура автоматического определения чипа не всегда возможна, она сработает только для чипов, поддерживающих алгоритм перевода в режим программирования Vpp-first. Справедливости ради отмечу, что пока все чипы, с которыми раюботает программа этот алгоритм поддерживают (но возможно после добавления в программу других чипов это будет уже не так).
Правее кнопки автоматического определения чипа расположены текстовые поля, содержащие название (Chip name) и байты сигнатуры (ID bytes) выбранного чипа.
Чуть ниже расположен трек-бар Delays value, предназначенный для выбора величины используемых в программе задержек. Дело в том, что нельзя передавать в шлюз новые команды, не дождавшись выполнения старых. Время, необходимое микроконтроллеру на выполнение различных команд и операций программирования (запись / чтение / стирание…), прописано в даташитах. Для обеспечения достаточного времени выполнения операций в программе используются задержки между передачами различных команд. Чаще всего менять значение по-умолчанию не требуется, но в случае возникновения сбоев можно попробовать увеличить величину задержек.
Ещё правее располагаются основные функциональные кнопки для работы с контроллером, позволяющие читать (Read Program & Configuration / Read Data), записывать (Write Program & Configuration / Write Data) или проверять (Verify Program & Configuration / Verify Data) память программы, конфигурации и данных (при проверке данные в программе сравниваются с данными в чипе, при обнаружении различий адрес первого несоответствия выводится в лог). Кнопка Read Calibration позволяет прочитать записанные в чипе байты калибровки (результат выводится в лог), а кнопка Chip Erase стереть все области памяти (при этом также происходит сброс Lock-битов).
Под кнопками расположены два чекбокса. Первый определяет нужно ли при записи или стирании чипа читать калибровочные значения. Если галочка установлена, то перед указанными операциями сначала из чипа будут считываться калибровочные значения (если они там есть), а после выполнения операций, при необходимости, эти значения будут записываться обратно в чип. Почему при необходимости? Потому что у микрочипа здесь полный бардак. В каких-то контроллерах эти значения могут лежать в последнем слове памяти программ, в каких-то — по определённым адресам в области конфигурации, в каких-то контроллерах они стираются при стирании чипа, а в каких-то — нет.
Вторая галочка определяет нужно ли программе записывать всю память конфигурации от начального адреса до слов конфигурации включительно (то есть вместе со словами UserID) или же записывать нужно только слово/слова конфигурации. В первом случае перед записью будет стёрта память конфигурации целиком, а в последнем — только память программ и слово/слова конфигурации.
Что касается чтения, то независимо от установленных галочек, программа будет пытаться прочитать всю реализованную в микроконтроллере память конфигурации, включая зарезервированные области (а не только от начала до слов конфигурации). В документации на чипы обычно указано, что физически в области конфигурации реализовано до полукилобайта слов, а реально используется всего несколько слов в начале области (UserID, ChipID, Config Words, Configuration words), а остальные — зарезервированы. Ну и интересно же, что там в этих зарезервированных словах. Кстати, как показали исследования, там вовсе не 0x3FFF как можно было бы ожидать, а какие-то разные значения. Что они означают — неизвестно, может просто набор случайных чисел, а может бэкдор какой, нужны более детальные исследования. Кстати, исходники моей программы можно немного поправить и тогда эти значения можно будет попытаться не только прочитать, но и записать. Если в итоге кто-то что-то нароет — не стесняйтесь поделиться 🙂
Вот в общем-то и всё. Ниже выкладываю программу с исходниками, а также список поддерживаемых этой программой чипов:
Программа | Исходники | Описание (поддерживаемые чипы, изменения в коде и т.д.) | Поддерживаемые ОС |
PIC Serial Programmer v3.1 | v.3.1 sources | PIC12(L)F1501, PIC12(L)F1822, PIC12(L)F1840, PIC12F609, PIC12F615, PIC12F617, PIC12F629, PIC12F635, PIC12F675, PIC12F683, PIC12F752 PIC16(L)F1503, PIC16(L)F1507, PIC16(L)F1508, PIC16(L)F1509, PIC16(L)F1823, PIC16(L)F1824, PIC16(L)F1825, PIC16(L)F1826, PIC16(L)F1827, PIC16(L)F1828, PIC16(L)F1829, PIC16(L)F1847, PIC16F610, PIC16F616, PIC16F627A, PIC16F628A, PIC16F630, PIC16F631, PIC16F636, PIC16F639, PIC16F648A, PIC16F676, PIC16F677, PIC16F684, PIC16F685, PIC16F687, PIC16F688, PIC16F689, PIC16F690, PIC16(L)F707, PIC16(L)F720, PIC16(L)F721, PIC16(L)F722, PIC16(L)F722A, PIC16(L)F723, PIC16(L)F723A, PIC16(L)F724, PIC16(L)F726, PIC16(L)F727, PIC16F753, PIC16F785, PIC16F882, PIC16F883, PIC16F884, PIC16F886, PIC16F887 |
Windows XP, Windows Vista, Windows 7, Windows 8 |
PIC Serial Programmer v3.2 | v.3.2 sources | Update 12.02.2023 Исправлено отображение карты памяти конфигурации (на Page2) |
-/- |