Программатор SPI и I2C микросхем памяти CH341A Mini Programmer

  Микросхемы памяти серий 24хх (EEPROM), 25хх (Serial Flash) широко используются в электронике. Такие чипы присутствуют в составе практически любой конструкции современной бытовой и промышленной аппаратуры, где есть процессоры и/или микроконтроллеры. Данный программатор имеет возможность работы с обоими типами памяти.





  В комплект поставки входят сам программатор и переходная плата с двумя посадочными местами под микросхемы памяти в SOIC корпусе.



  Они дублируют имеющиеся на нижней стороне платы программатора, и если на плату программатора микросхемы памяти нужно обязательно припаивать, на переходнике можно попробовать прижать микросхему прищепкой или держателем для бумаг.



  Так-же на переходнике есть посадочное место для разьема PLD-8 (в комплект не входит, я впаял 2хPLS-4), предназначенного для подключения прищепки или шлейфа программирования.



Аппаратная часть (Hardware).

  Программатор выполнен на базе микроконтроллера «USB Bus Convert Chip» серии CH341A. Он рассчитан на физическое подключение к порту USB 2.0 компьютера, при подключении через хаб-удлиннитель программатор у меня работал с ошибками (может у меня хаб такой). Модуль программирования памяти собран на плате размерами 63х27мм (без учета USB разьема, с разьемом 84х27мм) из черного стеклотекстолита.

Схема программатора:



  В распоряжении автора есть два экземпляра этого программатора, приобретенные в разное время, визуально их можно отличить по названию, один (более ранний) называется "CH341A Mini Programmer", второй "CH341A MinProgramment". Схемы одинаковые, различаются только цветом светодиода "RUN". На первом зеленый, на втором желтый.
  Некоторые схемные обозначения на конкретном программаторе могут немного отличаться, например самовосстанавливающийся предохранитель F1 (fuse) может обозначаться как R1. В инете встречались упоминания, что в эту позицию иногда ставят резистор нулевого сопротивления т.е. перемычку. У меня как и положено на обоих стоят предохранители ~400mA, сопротивление 0,92Ом, маркировка на корпусе «5». Также на плате часто отсутствует схемное обозначение резисторной сборки PR1. Более грамотное обозначение схемных элементов программатора можно посмотреть на изображении верхней стороны платы от магазина WAVGAT (на AliExpress):



  Особых отличий от даташита схема не имеет, разве что на блокировочных конденсаторах по питанию сильно экономили. Питание 5V от USB подается на вывод 28, на выходе 9 внутреннего стабилизатора блокировочный конденсатор.



  Т.к. на выводах ввода/вывода напряжение соответствует 5V уровням, в основном это устройство на 5V, правда в инете много упоминаний и о программировании им микросхем на 3.3V без каких либо ошибок и отрицательных последствий. Выход отдельного стабилизатора AMS1117-3.3 в схеме не задействован и просто выведен на выходной ZIF разьем и на контакт боковой гребенки SPI.
  В даташите указан способ сделать уровни на выходах совместимыми с 3.3V. Для этого необходимо соединить выводы 28 и 9 и подать на них 3.3V, при этом внутренний стабилизатор просто не используется. Но при этом 3.3V уровни также будут на на переходнике USB <-> RS232, что иногда не приемлемо. Также на Ali сушествует другая версия этого программатора, скомпонованная немного по другому и выполненая на зеленом текстолите. Читал, что там на вывод 28 подается 3.3V от внешнего стабилизатора, но выводы 28 и 9 не соединены, и это нормально работает. В любом случае, уровни на переходнике USB <-> RS232 и здесь будут 3.3V.
  Если планируется программирование флешек 1.8V через основной разьем необходимо дополнительно приобрести модуль 1.8V-adapter. Бонусом является то, что переделать его для поддержки и уровней 3.3V несложно, надо лишь закоротить вход/выход стабилизатора 1.8V дополнительным джампером.



  Теперь при наличии джампера адаптер работает с логическими уровнями 3.3V, при отсутствии — 1.8V.
Минус тут в том, что стоимость адаптера не намного меньше, чем самого программатора. Но если он уже есть, почему бы его не использовать по полной?

  Если для программирования будет использована боковая гребенка SPI, можно поступить проще. На Ali много предложений 4-канального двунаправленного преобразователя уровней на МОП транзисторах за очень небольшие деньги.



  Работа этого преобразователя подробно описана в статье "Согласование логических уровней 5В и 3.3В устройств". Схема отличается от рассмотренной в статье только номиналами резисторов (сопротивление меньше — увеличено быстродействие и энергопотребление). За счет добавления дополнительных джампера J1 и двух кремниевых диодов, можно будет программировать как 3.3V, так и 1.8V флешки.



  Резисторы 2,2 кОм отделяют выводы #WP и #HOLD флешки от шины питания. Светодиод — индикатор наличия напряжения.

Программная часть (Software), драйвер.

  Перед применением программатора необходимо инсталировать в Windows его драйвер(а), легко находятся в инете, я брал из архива программы AsProgrammer. Программатор поддерживает два режима, они переключаются аппаратно джампером J1. Применен интересный прием, при переключении джампера у чипа меняется Device ID на шине USB. Это вынуждает Windows найти подходящий по VID/PID драйвер и подключить его.
  При джампере в положении «1-2» по VID_1A86&PID_5512 подгружается драйвер "USB-EPP/I2C… CH341A". Он создает в диспетчере устройств раздел "Interface" в который и устанавливается.



  В этом случае чтение, верификация, запись чипов памяти должны осуществляться непосредственно через ZIF-панель программатора CH341A или через боковой разьем Р2 с интерфейсом SPI.

  При джампере в положении «2-3» по VID_1A86&PID_5523 подгружается драйвер "USB-SERIAL CH341A". В диспетчере устройств найти его можно в разделе "Порты (COM и LPT)". Там же можно посмотреть и номер присвоенного СОМ порта.



  При этом программирование может производиться только через интерфейс RS232 TTL на разьеме Р1 (там же где и джампер), если целевое устройство поддерживает такой способ (встроенный загрузчик или монитор).

Программная часть (Software), программа прошивальщик.

  С программатором CH341A на программном уровне обычно рекомендуется китайский (есть русификация) родственный софт «CH341A — USB Programmer». Но в то-же время в инете достаточно много жалоб на его глючность и нестабильность, особенно версий выше 1.18. CH341A — USB Programmer версий 1.30, 1.29 не может нормально работать (читать и записывать) с чипами памяти объемом более 8MByte/64MBit. Примерно после адреса 0800000 начинают сыпаться хаотичные ошибки.
  Поэтому я не стал наступать на эти грабли повторно, и с самого начала использовал программу "AsProgrammer" от участника сообщества Tifa, последняя версия 1.4.0. Скачать можно на форуме, топик форума показывается в лог-окне программы при запуске. Если кто-то захочет полазить в исходниках, проект есть на GitHub (если правильно понял, проект на Object Pascal, Lazarus).
  Кроме поддержки 24 и 25 серий микросхем памяти, программа работает и c 45 серией, поддерживает серию ST M95 и память microwire (только для данного программатора). Все схемы подключения есть в архиве программы. Полный список поддерживаемых микросхем памяти можно посмотреть в каталоге программы в файле chiplist.xml.



  Программа не требует установки, включает в архив драйверы для обоих режимов программирования СН341А.
Log-файл работы программы с флешкой W25Q128FW, 16Мб, 1.8V через "1.8V-adapter":


Используется программатор: CH341
Sreg: 00000000(0x00), 00000010(0x02), 01100000(0x60)


Используется программатор: CH341
Читаю флэшку…
Готово
Время выполнения: 0:02:49


Используется программатор: CH341
Стираю флэшку…
Готово
Время выполнения: 0:01:03


Используется программатор: CH341
Записываю флэшку с проверкой…
Готово
Время выполнения: 0:24:45


За все время работы с данной программой (прошивал ~5 вариантов BIOS) ни одного сбоя или ошибки.

  Линуксоидам использовать стороннюю программу нет необходимости, стандартный прошивальщик Flashrom полностью поддерживает данный программатор (должен быть собран с поддержкой ключа "-ch341a").

Доработка 1. Подтяжка сигналов #WP и #HOLD.

  В программаторе линии сигналов #WP и #HOLD посажены непосредственно на шину питания. Это мешает сбросить/установить бит QE во втором регистре статуса (25хх). В даташитах на микросхемы памяти есть предупреждения по этому поводу, вот из даташита на W25Q128FW:

WARNING: If the /WP or /HOLD pins are tied directly to the power supply or ground during standard SPI or Dual SPI operation, the QE bit should never be set to a 1.

  Для исправления этого недостатка надо отсоединить ноги #WP (pin 3) и #HOLD (pin7) от VCC и подключить их к VCC через резисторы 2.2-4.7 кОм.
  На «чёрном программаторе» советуют это делать так (привязка к схеме, нумерация контактов относительно ZIF разьема), дорожка между контактами 11-12 перерезается (#HOLD), между контактами впаивается резистор, дорожка от 11 контакта ведущая к 7 (#WP) перерезается у 11 контакта, проводок напаивается с 12 контакта к отрезанной дорожке, та же дорожка перерезается перед 7 контактом, поверх разреза напаивается резистор:



  Как по мне, проще сделать это на переходнике 1.8V-adapter, если задействовать его вторую незанятую половину разьема. Тем более при применении адаптера переделка на плате программатора становится бесполезной, порты у трансмиттера используются как однонаправленные.

Доработка 2. Увеличение кол-ва блокировочных конденсаторов по питанию.

  Участник сообщества «AlexX1810» предложил добавить на плату программатора три блокировочных конденсатора 0.1 мкФ. По его словам улучшается стабильность работы программатора.
Если ориентироваться по схеме, первый конденсатор между 6-7 контактами разьема Р1 (5V), второй между 5-6 контактами разьема Р2 (3.3V), третий между 15-16 контактами ZIF панельки (7-8 контакты разьема I2C, 3.3V). Все впаяны со стороны контактов.



У меня во время использования программатора сбоев не было, но хуже во всяком случае не будет.
  • +6
  • 06 марта 2019, 19:50
  • anakost

Комментарии (33)

RSS свернуть / развернуть
Шикарная статья. Конденсаторы, нарисованы там же где у меня стоят. Я так понимаю, бит QE в AsProgrammer не используются и дорабатывать необязятельно. К сожалению, современная техника изобилует флешками, в которых портятся прошивки и их надо перепрошивать. Авторегистраторы, ноутбуки, мониторы, стиральные машины и многое другое. Как мне кажется, микросхемы, которые программируются напряжением 12В гораздо менее подвержены риску потерять прошивку.
0
>> бит QE в AsProgrammer не используются и дорабатывать необязятельно
Здесь главное, иметь возможность его сбросить, если он мешает программированию.
Если вы посмотрите на мой лог файл прошивки, увидите:
Sreg: 00000000(0x00), 00000010(0x02), 01100000(0x60)
Второй бит в регистре SREG установлен, это и есть бит QE. Вроде бы я не должен иметь возможность работы с флешкой в режиме QuadSPI, но AsProgrammer прекрасно с ней работает. Возможно я просто где то ошибся, просто особо глубоко не копал, убедился что работает и на этом успокоился. Вот если б не заработало, прошлось бы копать дальше.
0
Недоговорил:
>> Второй бит в регистре SREG установлен, это и есть бит QE.
Второй бит в регистре SREG2, девятый бит если считать SREG 24-разрядным регистром.
0
К сожалению, современная техника изобилует флешками, в которых портятся прошивки и их надо перепрошивать.
Ладно бы просто прошивать. А то ведь оно превращается в квест «а теперь найди прошивку».
Как мне кажется, микросхемы, которые программируются напряжением 12В гораздо менее подвержены риску потерять прошивку.
Вроде ж низковольтные флешки прошиваются не непосредственно напряжением питания, а напругой с встроенного чаржпампа. Причина скорее в том, что современные флешки сделаны по более тонким техпроцессам.
0
Сейчас эти микросхемы памяти ставят даже в блоки батарей от АРС
0
Знаю пару способов поднятия напряжения. На переключаемых конденсаторах и с использованием индуктивности. Каким способом поднимается напряжение во флешках?
0
Charge-pump — преобразователь на переключаемых конденсаторах.
0
Тогда должны быть внешние цепи для подключения этих конденсаторов. Вряд ли внутренних емкостей в кремнии достаточно.
0
Хватает. Преобразователь — самый заметный на чипе блок, после собственно матрицы.
0
Шикарная статья. Пару раз сталкивался с такой проблемой в технике. взять прошивку было неоткуда и аппараты утилизировались.
0
Как обращаться к I²C, который есть на борту у этого чипа. Какой софт это поддерживает?
0
  • avatar
  • Aneg
  • 08 марта 2019, 21:53
AsProgrammer, что вам неясно?
0
Мне это нужно не для прошивки микросхем памяти, а для прямой работы с шиной I²C. Чтение информации с часов реального времени (кварцевых генераторов), регулировка контрастности, насыщенности и цветового баланса мониторов, чтение информации с датчиков и диагностики оборудования.
0
О как, тогда вам нужен сниффер I2C. К этому программатору это никаким боком.
0
Вот нашел на скорую руку — сниффер I2C
0
Есть и поближе. И даже, кажется, более прямыми руками сделанный.
0
При джампере в положении «1-2» по VID_1A86&PID_5512 подгружается драйвер «USB-EPP/I2C… CH341A». Он создает в диспетчере устройств раздел «Interface» в который и устанавливается.
Как к нему обращаться?

При джампере в положении «2-3» по VID_1A86&PID_5523 подгружается драйвер «USB-SERIAL CH341A». В диспетчере устройств найти его можно в разделе «Порты (COM и LPT)»
Тут все понятно, нужно просто обращаться к виртуальному СОМ-порту.
0
У китайцев в документах ищи, очевидно же (ну или хотя бы поковыряй сырки флэшрома).
0
AsProgrammer обращается же, сырцы на GitHub я привел.
0
Подсказка, из комплекта драйверов в каталог AsProgrammer перетащена CH341DLL.DLL. В сырцах на GitNub есть заголовочный файл к ней…
0
Тут кое-что есть:
Реализация интерфейса I2C с помощью библиотеки CH341DLL на VB.NET
Но софт на русском языке не запускается, на китайском запускается но выглядит это ужасно ((
0
Пробежал статью по диагонали, очень хорошая плата для ваших целей. Ведь сам чип поддерживает не два режима, как в данном программаторе, а три, и DeviceID у него тоже три.
Наверное заголовочник CH341DLL при желании можно адаптировать к любому обьектно-ориентированному языку, Tifa вот подключил к Object Pascal.
0
Вы софт запускать не пробовали? Возможно у вас пойдет и русифицированный.
У меня русский софт не пошел, возможно из-за того, что пока нет в наличии какой либо платы с чипом CH341A и драйвера под него не установлены.
0
Честно говоря не только не пробовал, но и не собираюсь этого делать. Все актуальные для меня вопросы я решил этим программатором.
0
Не требуется там никакой объектности. Обычный «API в стиле С»
0
Также как и к реальном COM порту.
0
В последней версии AsProgrammer есть возможность создавать скрипты для шины I2C и SPI. Т.е. отправлять и получать любые данные независимо от устройства на шине.
0
Это я видел, не нужно было, не разбирался. Но ведь скрипты заточены на запуск какой-либо из операций работы с памятью. Просто так запустить скрипт нельзя, или я ошибаюсь?
0
Можно. Там скрипт пишется на интерпретаторе PASCALC. Пишешь откуда взять данные, в каком количестве и куда отправить (или наоборот сколько прочитать и куда положить). Оболочка даже не догадывается что подключено к шине.
P.S. Похоже я погорячился на счет I2C. Сейчас прочитал список функций — там только SPI присутствует.
0
Для С# есть такая библиотека https://github.com/iillii/ch341-Sharp
0
www.onetransistor.eu/2017/09/ch341a-usb-i2c-programming.html
Но придется немного попрограммировать
0
Вот уж действительно полезная ссылка, WinAPI в чистом виде.
0
CH341A программатор работает и под Android с ПО ComboTool.
Для подключения к телефону потребуется OTG переходник ru.aliexpress.com/item/POWSTRO-OTG-USB-OTG-Micro-USB-USB/32836321218.html?spm=a2g0v.search0104.3.17.6e9127bfhtPggu&ws_ab_test=searchweb0_0%2Csearchweb201602_8_10065_10068_319_317_10696_453_10084_454_10083_10618_10307_10301_537_536_10902_10059_10884_10889_10887_321_322_10915_10103_10914_10911_10910%2Csearchweb201603_51%2CppcSwitch_0&algo_pvid=d5a32098-15c7-4e85-a433-fd98f9dceb8b&algo_expid=d5a32098-15c7-4e85-a433-fd98f9dceb8b-2

ComboTool сыровата, по i2c работает только с микросхемами, у которых адресные выводы подключены к земле. SPI не проверял.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.