USB программатор параллельных Flash и EEPROM микросхем памяти. Продолжение

В первой части статьи я предоставил схему, прошивку программатора, софт и кратко описал принцип их работы. На тот момент программатор имел не очень впечатляющий функционал и перечень программируемых устройств, возможно поэтому, не вызвал особого интереса. Но проект ещё развивается и я стараюсь добавлять новый функционал, исправлять ошибки, вносить улучшения. Все изменения вносятся исключительно программным путём и добавлением новых съёмных переходников. В этой части статьи я опишу, поддержку каких новых микросхем я добавил, как с ними работать и как их подключать к программатору. В текущей версии софта добавлена поддержка SPI Flash 25-й серии и микроконтроллеров AVR в режиме высоковольтного программирования.

Начну, пожалуй, с более сложного — AVR. Все, кто работал с этими микроконтроллерами, наверняка знают, что такое Fuse биты, и что бывает, если их запрограммировать неверно — можно получить практически окирпиченную микросхему, которая в лучшем случае перестанет программироваться обычным ISP-программатором. Для исправления данной проблемы (и не только) у микроконтроллеров AVR существует ещё один режим программирования — высоковольтный (HVP — параллельный и последовательный). В одной из статей в сети автор называл HVP — режимом Бога. В этом режиме можно практически всё: читать/стирать любые Fuse биты, читать/писать калибровку RC-генератора, читать/писать/стирать Flash,EEPROM независимо от установленных Fuse битов.

Протокол параллельного программирования у AVR стандартизированн практически для всех моделей AVR8, но есть исключения. Например: основная масса микроконтроллёров имеет восьмибитную шину данных и девять управляющих сигналов. У микроконтроллеров Attiny2313 и подобным в 20-выводном корпусе несколько управляющих сигналов объединены (XA1 и BS2, BS1 и PAGEL). Микроконтроллер Atmega2560 и другие с 256Кб памяти имеют трёхбитную адресацию Flash, в отличие от двухбитной в остальных моделях. Микроконтроллеры Attiny в восьминогих, шестнадцатиногих корпусах вообще программируются по последовательному высоковольтному протоколу. Всё это разнообразие я попытался учесть при разработке ПО и микропрограммы программатора. И, естественно, опробовал на нескольких моделях микроконтроллеров.

Интерфейс ПО претерпел небольшие изменения. Для работы с новыми устройствами были добавлены новые вкладки:

В случае работы с AVR — одноимённая вкладка. Как видите, на этой вкладке есть своё окошко выбора модели AVR, кнопки работы с памятью, окна просмотра данных Flash и EEPROM, отдельные кнопки для загрузки прошивки и EEPROM. При этом все кнопки в правой боковой части окна также активны, и их нежелательно нажимать во время работы с AVR. Возможно, позже перенесу их на первую вкладку, чтобы не мозолили глаза.

Для начала работы необходимо нажать кнопку «Connect», если драйвера установлены правильно и программатор подключен, то кнопка станет зелёной и на ней появиться надпись «Disconnect». Затем необходимо один, два раза нажать на кнопку «Test H/W», пока в окошке «Console» не появится надпись «Программатор подключен». Теперь можно работать со всеми функциями. Для начала надо выбрать модель микроконтроллера в окошке «Device», иначе все кнопки, кроме загрузки файлов для записи, будут неактивны. После выбора модели МК окошки»Fuse bits» заполнятся дефолтными значениями для данной модели МК, а в окошке «Chip ID» появится сигнатура чипа. Далее можно читать/писать/стирать Flash, EEPROM и Fuse биты. Но для начала, можно проверить, правильно ли подключена микросхема и жива ли она вообще? Для этого можно считать его сигнатуру кнопкой «Chip ID», после чего вы получите соответствующее сообщение.

Хотя микроконтроллеры AVR работают при напряжении до 5 Вольт, я советую их программировать на 3,3 Вольтах, так как при высоковольтном программировании они могут нагреваться при операциях чтения/записи Flash (у меня грелась Atmega8 и Attiny в восьминогих корпусах). А на пониженном напряжении питания нагрев незначительный, а функциональность не изменяется. Для этого необходимо переставить джампер S1 («Switch V_Prog») на плате программатора в положение 3v3.

Все микроконтроллеры AVR подключаются к основному 32-пиновому разъёму программатора. Схемы подключения разных видов МК на представленном ниже изображении:

Все сигнальные линии микроконтроллеров можно найти в Datasheet на соответствующую модель в разделе «Memory programming». Как видно из схемы, микроконтроллеры Atmega/Attiny с полным набором сигналов управления подключены к питанию (VCC) напрямую, а остальные — через ключ на pnp транзисторе. Этот ключ используется для предотвращения нагрева МК во время простоя, а также для правильного алгоритма входа в режим программирования. Но, думаю, без него тоже должно работать (я не пробовал). Мои платы переходников для некоторых МК в DIP корпусах в формате SprintLayout будут в папке с программой. Там же будет и данная схема.

Список моделей AVR изначально в программе небольшой. Но его можно увеличивать самостоятельно. Для этого в корневом каталоге с программатором есть папка «Devices». В ней находятся xml файлы с соответствующими названиями. Открываем файл с названием «AVR.xml» с помощью обычного блокнота и видим там список однотипных структур:

 <name model="attiny85">     <page_size>32</page_size>     <page_count>128</page_count>     <ee_size>512</ee_size> 	<ee_psize>4</ee_psize> 	<dev_type>3</dev_type> 	<l_fuse>63</l_fuse> 	<h_fuse>DF</h_fuse> 	<e_fuse>FF</e_fuse> 	<l_bits>FF</l_bits> 	<id>1E930B</id>   </name>    <name model="atmega128">     <page_size>128</page_size>     <page_count>512</page_count>     <ee_size>4096</ee_size> 	<ee_psize>8</ee_psize> 	<dev_type>0</dev_type> 	<l_fuse>C1</l_fuse> 	<h_fuse>99</h_fuse> 	<e_fuse>FD</e_fuse> 	<l_bits>FF</l_bits> 	<id>1E9702</id>   </name>

Так вот, для добавления новой модели — копируете любую из структур от тега <name> до тега </name> включительно и вставляете в документ в любом месте между структурами либо в начале или конце. От этого будет зависеть только очерёдность отображения списка в программе. Далее редактируете структуру. Для этого необходимо скачать datasheet на соответствующую модель МК. В первом теге (name) просто вводите название модели AVR (произвольно). Теги «page_size», «page_count» соответственно размер страницы (в словах 2 байта) и количество страниц flash соответственно. Теги «ee_size» и «ee_psize» размер EEPROM в байтах и размер страницы EEPROM, тег «id’ это три байта сигнатуры модели МК — все эти данные можно узнать из datasheet в разделе «Memory programming». Тег «dev_type» — это тип устройства: 0 — МК с полным набором управляющих сигналов (это большинство моделей в корпусах от 28 pin), 1 — МК с объединёнными сигналами управления (такие как attiny2313), 2 — МК с Flash 256Кб (Atmega256X), 3 — МК с интерфейсом последовательного высоковольтного программирования (Attiny13/25/45/85/44/84 и др). Дефолтные Fuse биты в шестнадцатиричном формате («l_fuse»,»h_fuse»,»e_fuse») можно найти в любом онлайн калькуляторе фьюзов AVR (например, avr fuse calculator). Тег «l_bits» — это lock биты — всегда «FF», то есть не запрограммированы (кстати, чтобы сбросить lock биты, нужно стереть МК, простой записью они не сбрасываются — защита от копирования прошивки, всё-таки!). Всё, после добавления такой структуры, сохранения файла и перезагрузки программы, вы увидите в списке новую модель (модели) МК AVR. К сожалению протестировать все модели я не могу, так как их очень много, но большинство распространённых моделей должны работать.

Из имеющихся у меня камней я протестировал Atmega8, Atmega16, Atmega32, Attiny2313, Attiny13a, Attiny45. На них же есть схемы переходников. Позже проверю работу с Atmega128a и Atmega2560 (просто на них я не делал переходники, подключу на проводах и отпишусь в комментариях).

Об AVR — всё. Теперь опишу, как работать со SPI Flash 25-й серии. Для данных микросхем памяти также есть соответствующая отдельная вкладка в программе:

Работа со Spi Flash в данной вкладке аналогична таковой во вкладке AVR. Поясню лишь, что означают окошки Sreg1 и Sreg2. У Spi Flash 25-й серии есть два Status-регистра, в которых есть флаги состояний и биты защиты. В некоторых б/у микросхемах, особенно выпаянных из материнских плат, могут быть установлены биты защиты от записи верхних блоков памяти (например для предотвращения порчи bootloader). Такие флешки будут читаться правильно, а при записи или стирании верхние блоки памяти изменяться не будут. Чтобы снять такую защиту необходимо записать нули в регистры Sreg (чаще — в Sreg2). Для этого можно написать по два нуля в соответствующие окошки и нажать кнопку «Write SR». Биты будут сброшены. После этого для корректной работы надо отключить питание от флешки и снова включить. Если флешку планируется вернуть после записи, например, в материнскую плату, то надо будет установить биты защиты обратно. Для этого их надо предварительно прочитать и запомнить (или записать на листик), затем стереть биты защиты, стереть/записать флешку и записать биты защиты обратно кнопкой «Write SR».

Также следует пояснить логику работы кнопки «Compare». Эта кнопка сравнивает содержимое прочитанной памяти флешки и файл, загруженный для записи. Поэтому кнопка «Compare» будет активна при условии, что был загружен файл для записи и была прочитана память флешки. В любом случае, в окошке «Console» появиться соответствующее сообщение.

Spi Flash подключаются к восьми-контактному разъёму на плате программатора (XS4 на схеме). Схема подключения следующая: 

   SPI Flash   XS4
   CS   ->   CS
  DI   ->   MOSI
   DO   ->   MISO
   CLK   ->   SCK
  WP   ->   VCC
   HOLD  ->   VCC

Положение джамперов на плате программатора не имеет никакого значения, так как на этот разъём напрямую выведены сигналы SPI2 от STM32 и его питание в 3.3 Вольта.

В случае со Spi Flash также возможно добавление новых моделей. Аналогичный AVR xml-файл под названием «25XXX.xml» хранится также в папке «Devices» и имеет сходную структуру:

   <name model="W25Q80">     <page_size>256</page_size>      <page_count>4096</page_count>     <f_size>1048576</f_size>     <id>EF4014</id>   </name>

В данном случае, тег «page_size» это размер страницы памяти Spi Flash в байтах (чаще всего 256 байт), «f_size» — объём памяти всей флешки в байтах, «id» — три байта сигнатуры чипа (первый байт — код производителя, второй — модель, третий — объём памяти), «page_count» — количество страниц памяти (можно получить делением объёма флешки на размер страницы в байтах). Все данные можно найти в datasheet на соответствующую модель чипа. ID — можно прочитать программатором и затем вписать в xml файл, работоспособность от этого не изменится.

В случае со Spi Flash микросхемами скорость чтения/записи не слишком большая. Флешка на 1 Мегабайт (например W25Q80) читается приблизительно 1-1,5 минуты. А если флешка на 8Мегабайт — можете смело пойти попить чаю, это минут на десять. Но запись обычно проходит без сбоев. Проверял, когда записывал звуковые файлы и картинки. Кстати, программатор позволяет записать практически любой файл соответствующего размера в виде «сырых данных». Кроме hex-файлов, они предварительно конвертируются в массив байт. 

Кроме AVR и Spi Flash программатор также поддерживает работу с параллельными Flash и EEPROM, I2C EEPROM, восьмибитными SRAM (смотрите первую часть статьи).

Общие советы по использованию программатора:

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

— При длительных операциях чтения/записи нельзя нажимать никакие кнопки, иначе собьётся цикл чтения или записи и программатор («железная часть») просто зависнет в ожидании правильного USB пакета. Пока что я еще не реализовал «защиту от дурака». Но у меня уже есть идеи по этому поводу.

PS: проект пока ещё развивается. Память STM32 заполнена приблизительно только на 1/5, поэтому я буду стараться добавлять поддержку новых устройств. В ближайших планах добавить поддержку параллельной Flash с 16-битной шиной данных (mx29lv320), FWH (Pm49FL004) микросхемы bios материнских плат, microwire eeprom. И всё, что будет попадать мне в руки.

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