Универсальный программатор на FT232RL

Описанный в статье программатор является развитием ранее рассмотренного.

Добавлена работа с HV Serial для чипов Atmel, добавлена поддержка некоторых чипов Microchp, реализована работа с SPI Flash, SPI Eeeprom.
Микросхема FT232RL позволяет напрямую управлять своими выходными пинами, переводить их в различные состояния и запитывать внешним напряжением. Всё это используется в данном проекте.

Рис. 1. Внешний вид готового программатора.

Схемное решение программатора простое и гибкое: позволяет использовать детали с довольно большим разбросом параметров. Схема программатора приведена на рисунке 2.

Рис. 2. Схема программатора.

Программатор не имеет выходного буфера, так как FT232RL позволяет питать выходные пины внешним напряжением и переводить их в состояние Z, поэтому программатор не мешается при внутрисхемном программировании.
По деталям:

Конденсаторы
чип 1206 C6

470p (можно ставить до 1нФ, влияет на частоту ШИМа, а это не критично в данном случае)

чип 1206 C1,2,7,8 0.1 можно ставить до 1мкф. не критично.
Чип тантал B-SMD C3,4,5

4.7u 16V можно ставить и больше. Ставил как-то керамику  1206 на 4.7мкф.

Резисторы
чип 1206 R8 200R можно ставить от 0 до 500 ом.
чип 1206 R7

390 подбирается на напряжения 3В
если нужно, обычно подходит сразу

чип 1206 R1-4,11, 15,17-19, 21-24  300 ом (можно ставить от 100 до 560 ом. я ставил и 100 и 560 всё чётко)
чип 1206 R10,12,25
чип 1206 R5 1.2K
чип 1206 R6 1.3K. Подбирается таким, чтоб на выходе стабилизатор было 1.8В
чип 1206 R9 4.7 Ом (можно ставить от 3 до 6.8 Ом)
чип 1206 R20,26,31 10K
Индуктивности
чип дроссель 1210 L2 10uH (можно ставить от 5мкг до 20)
чип дроссель 1210 L1

рекомендую 220uH но ставил и 180мкг и 470мкг. Нормально работает.

Транзисторы
Чип SOT23 VT1,2,4 BC847, также подойдёт BC817 или любой другой n-p-n, в принципе
Чип SOT23 VT5

IRLML9301 также подойдут IRLML6401(6402,9302) . Любой P-канальный с малым напряжение затвора

Диоды
  VD1-VD3

диод шоттки любой, например, я ставил MBR0520. Вместо диодов VD2,VD3 можно пристроить диодную сборочку BAV70

Микросхемы
  DD1 FT232RL
  DA1 MC34063 или MC34064
  DA2 IR2102S
Разъёмы
  XT2 PLD-10 AVR-ISP
  XT3 PLD-10 PIC-PLUG
  J1 PLD-6  Jumper VCC    
  XT1 USB M-1J
  XT4 панелька DIP-8
Светодиоды
  HL1 зелёный чип 1206
  HL2 красный чип 1206

Программатор имеет 2 разъёма для внутрисхемного программирования: AVR-ISP и PIC-ISP. Из названия понятно назначение разъёмов. Разъём AVR-ISP имеет распиновку STK200/300. Также программатор имеет панельку для программирования SPI Flash и I2C Eeprom. С одной стороны платы - под микросхемы в DIP-8, с другой - SO-8 (на прищепку или на пайку). Также имеется джампер для изменения режимов питания программатора и программируемой микросхемы, на выбор 1.8В, 3В и 5В.

Начало работы.
После того как программатор спаян и подключён, драйвера поставлены, необходимо выполнить настройку. Настройка делается через программу программатора, закладка «настройка». Там прописаны все необходимые настройки.

На данный момент программатор поддерживает следующие чипы:
Контроллеры фирмы Atmel в режиме LV Serial Programming
ATmega8(A), ATmega8HVA, ATmega8U2, ATmega16U2, ATmega32U2, ATmega16HVA, ATmega16HVA2, ATmega16HVB, ATmega16M1, ATmega32M1, ATmega64M1, ATmega32HVB, ATmega48P, ATmega48, ATmega88(A), ATmega88P(A), ATmega168, ATmega168P, ATmega16(A), ATmega161, ATmega162, ATmega164, ATmega164P, ATmega324P, ATmega644P, ATmega163, ATtyny43u, ATtiny85, ATtiny45, ATtiny25, ATmega103, ATmega128(A), ATmega128RFA1, ATmega32, ATmega8535, ATtiny13, ATtiny15, ATmega64, ATtiny2313
Контроллеры Atmel в режиме HV Serial Programming
Tiny13,Tiny25,Tiny45,Tiny85
Контроллеры фирмы Microchip в режиме HV Serial Programming
P16F84, P16F84A, P16F648*, P16F54, P16F57*, P16F59*, P16F873A*, P16F874A, P16F876A*, P16F877A*, P16F877*, P12F683*, P12F629, P16F88/87, P16F628, P16F627*, P16F77/76, P16F74/73 (чипы, отмеченные звёздочкой, подключены только по документации, то есть не проверены на железе)
Serial EEPROM
24C01, 24C04, 24C08, 24C16, 24C32, 24C64, 24C128, 24C256, 93LC06, 93LC46, 93C76, 93C86, M95640, M95160, M95080
Serial Flash
PM25LD010, AT25FS010, PM25LD020, EN25F40, EN25F16, EN25F32, W25Q64

Любой чип, который не отличается протоколом программирования от поддерживаемых сейчас (то есть если отличие идёт только по объёму, названию, сигнатуре, фъюзам  и т.п.), то можно подключить его самостоятельно путем изменения соответствующего файла программы программатора.
А теперь распишу, как правильно вносить чипы.
Добавление контроллеров Atmel
Например, добавление чипа Tiny2313. Самое главное: качаем с официального сайта Atmel.com именно свежий даташит на контроллер, так как не раз уже натыкался на ошибки в их старых даташитах.
В общем, первым делом открываем его и ищем слово Signature. На рисунке 3, ниже показан кусок типового даташита и данные, которые нужны для начала.

Рис.3. Скриншот из даташита.

Забиваем signature в поиск (показано на рисунке циферкой 1).
Находим числовое значение сигнатуры (3 байта) ‛0x1E 0x91 0x0A‛ (показано на рис.3 под циферкой 2)
Это идентификатор, по которому программатор будет определять контроллер, который ему подсунули.
Теперь открываем файл Chips.ini для редактирования любым редактором. Например, блокнотом (я предпочитаю Programmer`sNotepad). Файл расположен в папке программы программатора.
Ниже на рисунке4 изображено содержимое файла chips.ini. Слева это данные по уже имеющемуся чипу Тини25, справа – результат, получившийся после добавления Тини2313 – то, что должно в итоге получиться.
Для начала взял за основу данные по Tiny25, выделил и скопировал на свободное место в файле - так удобнее, меньше вероятности ошибиться в названии параметров. Обычно добавляю в конце файла перед комментариями и указываю, когда и что добавил - на всякий случай.
Тело описания контроллера состоит из заголовка - на рисунке оно синее. Туда прописывается сигнатура контроллера, которую взяли из даташита (рисунок 3, цифра 2). Дальше берём данные по объёму флеши в даташите (рисунок 3, цифра 3). Колонка Page Size,  значение 16words заносим в соответствующую строчку FlashPageSize (смотреть надо внимательно, так как указывается именно число слов, а не байт. В некоторых даташитах на старые чипы указаны байты. Их надо делить на 2, если что).  Ну, тут совпало, ничего менять не пришлось. У тини25 и тини2313 флеш и еепром одинаковая, тут вопросов, думаю, не должно быть.

Рис. 4. Пример содержимого файла Chips.ini

Дальше ищем в уже открытом даташите данные по фьюзам. Можно найти также поиском, забив ‛Fuse Bit‛, а можно просто пролистать вверх, обычно они находятся на страницу выше сигнатуры. На рисунке 5 изображен пример с фьюзами из даташита тини2313.

Рис. 5. Скриншот с фьюзами.

Описание в chip.ini довольно условное и позволяет менять строчки местами.
Для большей наглядности и соответствию даташиту расставляю фъюзы в соответствии с таблицами даташита.
Extended Fuse содержит только один бит, поэтому у нас только одна строчка
FusesNames[16] = SELFPRGEN
Если бы были остальные биты, они шли бы по порядку (бит1 - FusesNames[17] ….соответственно,  бит 7 - FusesNames[23])

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

Добавляем соответственно Fuse High и  Fuse Low. Fuse Low совпал с фьюзами tiny25, а Fuse High отличается.

В результате получается как на рисунке 3 (правая часть)

С Atmel вроде всё.

Добавление чипов SerialEeprom.
Сейчас программатор поддерживает 4 типа еепромок.
1 – 24сХХ – у которых адрес страницы прописывается в адрес устройства (как правило, это чипы с объёмом  до 2кб)
2 – 24сХХ – у которых адрес прописывается полностью в протоколе. Адрес устройства задаётся или пинами, или жестко прошит. (как правило, это чипы с объёмом свыше 2кб)
3- 93ххх - у этих протокол полностью отличается от 24сХХ.
4- М95ххх – эти еепромки по протоколу походят на SPI Flash
Для добавления нового чипа необходимо открыть для редактирования каким-нибудь текстовым редактором файл SerialEeprom.ini, расположенный в папке программы программатора.
Пример формата SerialEeprom.ini файла показан на рисунке 6.

Рис.6. Формат SerialEeprom.ini

На рисунке 6 показаны описания всех 4-х типов поддерживаемых чипов.
Синим цветом в квадратных скобках прописывается название чипа. Оно будет отображаться при выборе чипа в программе.
Далее идут 2 обязательных параметра, без которых программатор не сможет работать с чипом. Это Size (размер в байтах) и, собственно, Protocol (тип добавляемого чипа).
Следом идут дополнительные параметры, связанные с особенностями конкретного чипа.
Для чипов 93xxx это параметр bits, обозначающий количество бит, передаваемых при передаче адреса. Берётся из даташита. Пример показан на рисунке 7. Посчитать количество бит не трудно - их там 10; так и надо записывать: bits=10.

Рис. 7. Пример из даташита для SerialEeprom 93C76

Для чипов М95ххх дополнительный параметр - это описание названий битов «статус регистра». На рисунке 8 показан пример статус регистра для М95640 из даташита, а на рисунке 6 внизу видно, как они описаны.

Рис. 8. Формат статус регистра для М95640.

У еепромок 24ххх дополнительных параметров нет. Поэтому у них прописывается только объём и тип протокола.

Хочу обратить внимание на то, что программа программатора не сортирует список чипов. По этому при добавлении нового чипа следует добавлять его таким образом, чтобы не нарушать порядок. Ну, или как удобно будет для пользования потом J

Добавление чипов SPI Flash.

Открываем для редактирования файл SpiFlash.ini любым удобным редактором. Файл находится в папке программы программатора. Пример открытого файла показан на рисунке 9.

Рис. 9. Файл SpiFlah.ini.

Формат файла думаю понятен. В квадратных скобках указано название чипа (на рисунке обозначено синим цветом), дальше идут параметры.

Берём даташит на нужный чип. Первым делом смотрим команды. На рисунке 10 показан набор команд для чипа SST25VF512.

Рис.10. Список команд SpiFlash SST25VF512.

Для определения чипов используется команда Read-ID. По умолчанию чип определяется командой 9Fh - по этой команде чип возвращает идентификатор, состоящий из 3х байт. Но некоторые чипы как SST25VF512 не имеют в списке данной команды - вместо неё используется команда 90h, когда чип возвращает идентификатор, состоящий из двух байт. Поэтому в описании чипа дописывается строчка IDrd = 90 и идентификатор указан 16-битный, а не 24, как у W25Q64, например (см. рисунок 9).
В этой же таблице ищем команду FastRead (0B), так как программатор использует именно эту команду по умолчанию. В этом чипе её тоже не оказалось. Поэтому дописывается строчка Read = 03 - это означает, что для чтения программатор должен использовать команду 03.
Дальше ищем формат статус регистра и подписываем названия битов статус регистра.

Добавление контроллеров Microchip.
Pic контроллеры, на мой взгляд, - самые запутанные в плане программирования. Почти у каждого свой протокол. Доходит до того, что, например контроллер P16F84 и P16F84A программируются по-разному. Поэтому сложно описать, как добавлять эти Picи. Но попробую.
Для начала надо найти документацию на программирование. Обычно на конкретный контроллер она своя. Называется это дело Memory Programming Specification.
Потом открываем для редактирования файл Pic.ini, расположенный в папке с программой.
Далее ищем в даташите картинку Programming Mode Entry, то есть способ входа в режим программирования. Надо найти что-то, похожее на рисунок 11.

Рис. 11. Вход в программирование для пиков.

Сейчас программатор знает только эти 3 режима входа в программирование.
Верхний слева – тип 0, верхний справа – тип 1, нижний – тип 2.
По умолчанию, то есть если вход в программирование не указан, берётся тип.0.
На рисунке 12. показан формат данных в pic.ini файле.

Рис. 12. Формат pic.ini.

Способ входа в программирование пишется в параметр EnterType.
Объём флеши указывается в словах, а объём ЕЕПРОМ указывается в байтах. Размер страницы не учитывается, так как пишется и проверяется побайтно, а стирание происходит полностью всей памяти.
Способ стирания (параметр EraseType).
На данный момент реализовано 7 способов стирания.

Они отличаются последовательностью команд и самими командами.

Тип.1 Этот тип используется по умолчанию, если не выбран другой.
command (2);                   //загрузка данных
write data  ($3FFF);         //пишем все 1
command (8);                   //Begin programming
command (9);                   //команда очистки Bulk Erase Programm
command (8);                    //Begin programming
command (2);                   //загрузка данных
write data  ($3FFF);         //пишем все 1
command (8);                   //Begin programming
command (11);                 //команда очистки Bulk Erase Data
command (8);                   //Begin programming

Тип.2
command (2);                   //загрузка данных
write data  ($3FFF);         //пишем все 1
command (9);                   //команда очистки Bulk Erase Programm
command (8);                   //Begin programming
command (2);                   //загрузка данных
write data ($3FFF);          //пишем все 1
command (11);                 //команда очистки Bulk Erase Data
command (8);                  //Begin programming

Тип.3
command (2);                   //загрузка данных
write data  ($3FFF);         //пишем все 1
command (9);                   //команда очистки Bulk Erase Programm
command (8);                  //Begin programming
command (2);                  //загрузка данных
write data  ($3FFF);         //пишем все 1
command (11);                 //команда очистки Bulk Erase Data
command (8);                  //Begin programming

Тип.4
command (2);                   //загрузка данных
write data  ($3FFF);         //пишем все 1
command(31);                 //команда ChipErase

Тип.5
command(9);                    //команда очистки Bulk Erase Programm
command(11);                  //команда очистки Bulk Erase Data

Тип.6
Тот же тип 5 НО! Сохраняется дополнительный байт, расположенный в последней ячейке памяти.

Тип 7
command (2);                       //загрузка данных
write data ($3FFF);              //пишем все 1
command (9);                       //команда очистки Bulk Erase Programm
command (8);                       //Begin prog
command (2);                       //загрузка данных
write data ($3FFF);              //пишем все 1
command (11);                     //команда очистки Bulk Erase Programm
command (8);                       //Begin prog

Как Вы можете заметить, типов стирания почти столько же, сколько поддерживаемых чипов :D
Для определения, какой тип программирования нужен, поможет MemoryProgrammingSpecification на конкретный подключаемый чип, но надо хотя бы мало-мальски разбираться в даташитах, потому что редко где бывает описание, как на рисунке 13. Чаще всего алгоритм расписан словесно и очень непонятно.

Рис. 13. Пример алгоритма стирания, взятый из даташита.

Тип программирования (параметр ProgrammType)
На данный момент реализовано 7 типов программирования. Они различаются алгоритмом программирования и командами.

Тип.1
command(2);                      //команда загрузка даты
write (14bit);                     //данные
command (8);                     // Begin Programming
command (6);                     //команда увеличение адреса
Тип. 2
command (2);                     //команда загрузка даты
write_16b (14бит);             //данные
command (8);                     // Begin Programming
command (14);                   //конец программирования
command (6);                     //команда увеличение адреса
Тип. 3
command (2);                     //команда загрузка даты
write (14bit);                     //данные
command (24);                   //Begin Programming Only
command (23);                   //конец программирования
command (6);                     //команда увеличение адреса
Тип. 4
command (2);                     //команда загрузка даты
write (14bit);                     //данные
command (24);                   //Begin Programming Only
command (10);                   //конец программирования
command (6);                     //команда увеличение адреса
Тип. 5 Такой же, как тип 1, но отличается записью конфигурации.
command (0);                       // команда загрузка конфигурационного слова
write (Source);                     //16bit данных конфигурации
command (8);                       //команда начало программирования
Тип. 6 Такой же, как тип 2, но отличается записью конфигурации.
command (0);                       // команда загрузка конфигурационного слова
write (Source);                     //16bit данных конфигурации
command (24);                     // команда начало программирования
command (23);                     //конец программирования
command (4);                       //команда чтение
Тип. 7 Такой же, как тип 2, но отличается записью конфигурации.
command (0);                       //команда загрузка конфигурационного слова
write (Source);                     //16bit данных конфигурации
command (8);                       //команда начало программирования
command ($E);                    // конец программирования

Сейчас точно не скажу, но несколько пиков  я подключил просто подбором параметров :) Нашел в даташите вход в программирование (уж это-то всегда понятно :-)), потом подобрал Тип протокола. Потом стирания. В отличие от AVR, у PIC не получится запороть фьюзы, так что подбирать протокол можно смело :).

Дальше рассмотрим различные варианты изменения схемы программатора.

Lite версия. Если программатор требуется исключительно для работы с чипами AVR, то можно собрать очень простую схему. Схема показана на рисунке 14.

Рис. 14. Lite версия программатора.

По деталям. Резисторы. Все можно ставить номиналом от 100 до 560 ом. Конденсаторы от 0.1 до 10мкф. Дроссель нужен исключительно для фильтрации помех, так-то и без него отлично работает :) .
Джампер J1 нужен для питания схемы от УСБ в те моменты, когда это надо.
Программатор получится довольно простой. Дополнительных настроек оборудование не требует. Подключил - всё работает. Из плюсов имеется возможность тактирования программируемого чипа от внутреннего тактового герератора FT232RL частотами 6,12 мгц

Mini версия. Схема отличается от полной только отсутствием преобразователя 12в и коммутатора соответственно. Схема будет поддерживать контроллеры Atmel, SerialEeprom и SPI Flash.

Рис. 15. Схема версии Mini.

Данная версия отличается от Lite дополнительным транзистором VT2, на котором реализован протокол I2C для программирования I2C Eeprom. Также добавлена панелька для программирования I2C Eeprom и SPI Flash и джампер RJ1, который позволяет запитывать чипы от внутреннего стабилизатора 3В, USB или внешнего напряжения.

Замена IR2102.
В полной схеме программатора применена микросхема IR2102. Её можно заменить двумя транзисторами. Пример показан на рисунке 16.

Рис. 16. Инвертирующий коммутатор на транзисторах.

Вместо биполярного транзистора VT6 можно поставить P-канальный полевой транзистор, например, IRLML6401 или что-то подобное с малым напряжением открывания затвора.
При применении такого коммутатора можно убрать из схемы диод VD2.

Эксперимент с внутренним генератором и внешним кварцем

Изучая работу FT232R, я столкнулся с тем, что FT не выдерживает временные характеристики выдаваемых сигналов. Вот, например, на рисунке 17 показана работа с внутренним генератором при битрейте 19200, то есть данные должны вылетать из FT с интервалами примерно 52мкс. А в результате, что мы видим?

Рис. 17. Форма выдаваемых сигналов.

На рисунке изображены осциллограммы одной и той же команды. Это чтение статуса с M95640. Первый канал (желтый) - это тактовый сигнал CLK, второй(синий) - это данные. Видно, что сигналы на пинах меняются с непонятным интервалом от 5мкс до 70мкс - так-то не хилый разброс :) . FT как будто зависает, и состояние портов перестаёт меняться. Я пробовал несколько FT, результат у всех примерно одинаковый.
Была гипотеза, что проблема решается переходом на внешний кварц. На рисунке 18. показана работа FT с той же командой с тем же битрейтом, но от внешнего кварца.

Рис.18. Форма импульсов с тактированием от внешнего кварца.

Судя по осциллограммам, картина поменялась, но не сильно :) разброс уменьшился, но участился. Хотя в целом появилась какая-то стабильность.
Хорошо, что все протоколы для программирования чипов, по крайней мере, которые мне попадались, синхронные, и на временные задержки эти можно не обращать внимание. Решить проблему с этими подвисаниями, к сожалению, так и не удалось.

Дополнительная настройка для ускорения работы программатора в винде

Винда делает паузы между обращениями к FT. Время паузы можно уменьшить с помощью нехитрых настроек.

 

Рис. 19. Включение драйвера виртуального порта.

Если на компьютере FT не использовалась как виртуальный порт, надо включить поддержку виртуального порта, как показано на рис. 19. Для этого заходим в диспетчер устройств, находим там USB Serial Converter, и в свойствах устанавливаем галочку «Загрузить VCP». После этого появится дополнительный СОМ-порт, у меня он стал под номером 14. Дальше делаем следующее:

 

Рис. 20. Установка минимальной задержки.

Заходим в свойства появившегося СОМ-порта, как показано на рис. 20 слева, и устанавливаем минимальное значение в пункте «Время ожидания», как показано на рис. 20 справа.
После этого можно выключить виртуальный СОМ-порт, проделав обратную операцию как на рис. 19 (настройка останется) - причём это настройка именно винды, потому что в настройках FT я такого параметра не нашел. Выполнив такую небольшую настройку, винда будет делать минимальные паузы между передачей посылок в FT. Эта задержка не решает проблему с времянкой, показанной на рисунках 17, 18, но увеличивает скорость работы программатора, особенно это заметно на больших скоростях, например, при работе с Serial Flash. Когда прошиваются большие объёмы памяти на большой скорости и большими пакетами, там эффект прилично увеличивает скорость. При работе с контроллерами эта пауза практически не заметна.
Разница до и после показана на рис. 21.

 

Рис. 21. Время ожидания до и после настройки.

Осциллограммы сняты при работе с SPI Flash SST25VF512 с битрейтом 921600. Убрались лишние 250 мс между пачками (при длине пачки 130 мс :D это круто). Величину пачки увеличить уже не получается, это ограничение драйвера FT, а паузы между пачками обусловлены подготовкой пачки к передаче. Думаю, это уже максимальная скорость работы, по крайней мере, на делфи. Как-то бы распараллелить задачу и готовить пачку во время передачи - сэкономили бы ещё по 30-40 мс за посылку.

 

Материалы

  1. Программа программатора
  2. Логический анализатор на основе программатора
  3. Драйвер для FT232RL, можно также взять с официального сайта
  4. Схема и исходники

 

 

Автор: Сергей Меньшиков, e-mail для связи -  

Обсуждение на форуме