FT232H, MPSSE и SPI-программатор за 15 евро


    Странно, что про этот крайне популярный и полезный чип до сих пор не было статьи на Хабре. Считаю необходимым восполнить этот пробел. В статье будет описано несколько интересных способов применения чипа FTDI FT232H и его аналогов для различных прикладных целей.
    Пару слов о нем: относительно дешевый, простой в разводке и программировании, распространенный конвертер USB 2.0 <-> последовательные протоколы (USART, SPI, I2C, JTAG TAP и просто GPIO bit-bang), хорошо подходящий как для изготовления собственных устройств с подключением к ПК по USB, так и для тестирования и отладки других устройств.
    Из простой breakout-платы на этом чипе легко и непринужденно можно сделать UART-конвертер, SPI-программатор, JTAG-отладчик, I2C-master, конвертер GPIO bit-bang (а с ним и остальных протоколов, не требующих запредельных частот и стойких к возможным задержкам, вносимым USB-стеком, к примеру, Dallas 1-wire).
    Если вышеуказанные возможности сумели вас заинтересовать — прошу под кат.

    Немного истории
    Компания FTDI была основана в 1992 году в г. Глазго, что в Шотландии. Специализируется она на решениях, связанных с USB, и известна своими конвертерами USB-Serial серии FT232, которые уже не раз упоминались на Хабре в различных статьях о DIY-железе и прошивке микроконтроллеров. Серия эта к настоящему времени все еще успешно производится и продается, но прогресс не стоит на месте, и в конце 2009 года с выпуском микросхемы FT2232D началась «перезагрузка» серии, добавившая к уже имевшимся возможностям киллер-фичу — Multi-Protocol Synchronous Serial Engine (MPSSE), о которой в этой статье и пойдет речь.

    Технология MPSSE и поддерживающие её чипы
    Технология эта обеспечивает аппаратную поддержку последовательных протоколов SPI, I2C и JTAG, а также возможность «дрыгать ногами» GPIO после перевода чипа в специальный режим, называемый, как это ни странно, MPSSE Mode.
    Это режим поддерживается в настоящий момент 4 различными контролерами, производимыми FTDI:
    FT232H, FT2232D, FT2232H, FT4232H.
    Имеются также разные проекты по эмуляции этого режима на микроконтролерах различных архитектур и производителей, но в этой статье я буду рассматривать только FTDI, иначе она рискует вырасти еще вдвое.
    Хорошее введение в технологию, со схемами подключения для каждого протокола, списком поддерживаемых возможностей для каждого чипа и пояснениями можно найти в Application Note 135 с говорящим названием MPSSE Basics.
    Подробности о подключении и работе с соответствующими протоколами — в отдельных AN: SPI, I2C, JTAG.

    Теперь немного от технических характеристиках самого младшего из 4 поддерживаемых чипов — FT232H, т.к остальные отличаются от него, по большому счету, только количеством каналов и наличием или отсутствием определенных возможностей (встроенного LDO-регулятора, к примеру).
    Позволю себе процитировать некоторые ключевые ТХ из даташита:
    • Поддержка MPSSE
    • USB <-> USART на скорости до 12 МБод (скорость RS232 может быть лимитирована внешней микросхемой сдвига логических уровней)
    • Конфигурируемые выводы GPIO с регулировкой максимального тока (4, 8, 12 или 16 мА)
    • Хранение конфигурации выводов, режима работы после Reset, USB VID, DID и Description string во внешней EEPROM с возможностью её перезаписи по USB
    • Напряжение питания ядра 1.8 В (входящее — от 3.3 В до 5 В ), выводов — 3.3 В (все выводы толерантны к 5 В)
    • Температурный диапазон от -40°C до 85°C
    • Выпускается в корпусах LQFP48 и QFN
    • Имеются драйверы для Windows, MacOS X и Linux

    Про USART мне здесь добавить нечего — это основной режим работы всех чипов серии, и работает он прекрасно. Поддерживаются все необходимые настройки стоп-битов и аппаратный контроль четности, так что можно смело делать свой USB-модем, если нужно.
    Если от чипа необходим только интерфейс GPIO, то на каждый канал приходится по 16 выводов (в режиме MPSSE), если же планируется использовать GPIO параллельно с каким-либо из аппаратно-поддерживаемых протоколов, то выводов будет доступно всего 12.
    Запись конфигурации (при наличии внешнего EEPROM) производится программой FT_Prog, доступных опций немного, самые важные — Vendor ID, Device ID, Description и Serial Number.
    К питанию чип неприхотлив, кушает что дают (если дают в указанном выше диапазоне), но у его старших братьев встроенный LDO-регулятор отсутствует, поэтому для питания от USB необходимо использовать внешний.
    Корпус LQFP48 вполне паябельный в домашних условиях даже при отсутствии термовоздушной станции или паяльника с жалом-микроволной, но все, конечно, зависит от рук. Про пайку QFN говорить не буду, если вы умеете паять такие корпуса, то и про FT232, скорее всего, уже не раз слышали.
    Про драйверы стоит добавить, что FTDI предоставляет на условиях royalty-free два вида драйверов — Virtual Com. Port и D2XX Direct, но для работы с MPSSE необходим только последний. Существует также свободный драйвер на основе libusb — libftdi.

    Я не хочу ничего паять!
    Для тех, кто не хочет паять, на рынке имеется множество breakout-плат, оснащенных чипом FT2232H (двухканальный вариант FT232H, который для простоты можно считать двумя FT232H в одном корпусе), всей необходимой обвязкой и внешней EEPROM.
    Купленная мной плата стоила 15 евро, в СНГ можно купить похожую приблизительно за 600 рублей без доставки (у DiHalt'а, к примеру, только требуйте вариант на FT2232D, а лучше сразу на FT2232H, если есть).

    Моя плата выглядит так:

    Слева — питание, земля и 16 выводов канала А, справа — питание, земля, 16 выводов канала B, Reset и Wake-up. Диоды TX и RX работают правильно только в режиме USART (если специально их не зажигать программно при работе с MPSSE), поэтому на свою плату я их даже не стал запаивать. LDO-регулятор и чип EEPROM находятся на обратной стороне платы.

    Практическое применение
    Хватит теории и рассказов, пора перейти к практике. Представьте, что такая плата у вас уже есть, и теперь вы задумываетесь, а что с ней можно сделать. А вот что:
    0. Конвертер USB<->USART без всяких там новомодных MPSSE, как учили отцы. Применений ему масса, можно восстанавливать убитые неудачной прошивкой модемы и роутеры, восстанавливать (слегка) испортившиеся жесткие диски, подключаться к отладочным интерфейсам различного оборудования и так далее, применений масса, рассматривать я их тут не буду.
    1. SPI-программатор для прошивки и восстановления БИОСов для более или менее новых ПК (производства 2008 года и новее, массовый переход на SPI-чипы для хранения БИОСа произошел вместе с внедрением X58, насколько я помню). С внедрением технологии SecureBoot (и сопутствующих ей) прошивка модифицированного БИОСа превратилась из обыкновенной операции в прогулку по граблям, в результате которой «окирпичить» машину — как два байта переслать. Внешний SPI-программатор решает эти проблемы полностью.
    2. JTAG-отладчик для различных МК. В данный момент я прошиваю и отлаживаю этой платой следующие МК: STM32F1xx\L1xx\F4xx, Infineon XMC4500 (ARM Cortex-M) и Infineon XE167FM (C166), но список поддерживаемых МК значительно шире, ибо на FT232H основаны такие популярные отладчики как отрытый CooCox CoLink и закрытый но более мощный Amontec JTAGKey2, под которые можно успешно мимикрировать.
    3. I2C bus master, который можно использовать, к примеру, для контроля за VID процессора или видеокарты, и при нормальных условиях I2C совместим с SMBus и PCBus, на которых висит половина низкоскоростной периферии ПК. Пока я этот режим досконально не изучал, поэтому описывать работу с ним не буду.
    4. Конвертер USB<->GPIO, на базе которого можно реализовать как простые задачи из серии «выключить устройство нажатием кнопки в программе», так и задачи посложнее, вроде реализации собственных протоколов на программном уровне. Программа при этом пишется на ПК, что имеет как преимущества (намного больше свободы в выборе ЯП и обилие ресурсов), так и недостатки (задержки в работе USB-стека и его непредсказуемые тайминги не позволят реализовать очень скоростные протоколы), но сама возможность не использовать МК для взаимодействия с железом для тех, кто с ними малознаком — это хорошо.
    Остановлюсь подробнее на пунке 1, оставив пункт 2 для следующей статьи.

    Делаем SPI-программатор
    Для превращения платы на чипе FT232H в SPI-программатор нам понадобятся:
    0. Сама плата
    1. Чип EEPROM с интерфейсом SPI, например, популярный у производителей современных материнских плат Winbond W25Q64BV, который мы будем программировать. На десктопных платах они бывают в корпусах DIP8 (почти всегда) и SOIC8 (некоторые модели Gigabyte и EVGA), для упрощения замены в случае порчи БИОСа обычно чип не припаян, а установлен в кроватку или ZIF-сокет. На ноутбуках чип БИОСа чаще всего припаян на материнскую плату, и для программирования приходится использовать ISP-порт или специальный зажим, надеваемый на чип сверху
    2. Два необязательных резистора номиналом 4.7 КОм для подтяжки выводов #WP и #HOLD к питанию во время прошивки (можно обойтись и без них, если на плате достаточно свободных выводов 3.3 В)
    3. Необязательный сокет для чипа EEPROM (чтобы не паять провода к его выводам)
    4. ПК с Linux (меньше всего телодвижений), Windows (побольше) или OS X (не поддерживается официально, только энтузиастами).
    5. Установленная в систему утилита flashrom, собранная с поддержкой libftdi.

    Далее все просто, соединяем FT232H и EEPROM по схеме (взятой из схемы моего программатора RushSPI):

    Открываем командную строку и выполняем там команду:
    flashrom -p ft2232_spi:type=232H
    Для многоканальных чипов FTDI нужно будет дополнительно указать, на каком именно канале находится подключенная микросхема EEPROM, к примеру, для FT2232H и канала А команда будет такой:
    flashrom -p ft2232_spi:type=2232H,port=A
    Результат выполнения этой команды должен быть примерно таким:
    Found chip "Winbond W25Q64.V" (8192 KB, SPI)
    Если чип не нашелся, то либо вы что-то напутали с подключением, либо ваш flashrom собран без libftdi, либо у вас Windows и вам нужно ставить вместо найденного системой драйвера от производителя другой драйвер на основе libusb, как описано здесь.
    Если же чип нашелся, то теперь читать содержимое той же командой с дополнительным ключом -r dumpname.rom, либо записать свой файл командой с ключем -w newbios.rom
    Список доступных ключей, поддерживаемых программаторов и все остальное можно найти в официальной Wiki проекта. Там же находится статья, посвященная программаторам на базе FT232H, вот она.

    Заключение
    Получившийся программатор прошивает восьмимегабайтную микросхему SPI за ~150 секунд, что не быстро, но и не слишком долго, а за 15 евро — просто отлично.
    С его помощью я уже не раз восстанавливал себе БИОС, не вынесший экспериментов.
    С его же помощью (правда, в режиме USART-конвертера) удалось починить сломавшийся было жесткий диск.
    Про прошивку и отладку различных МК по JTAG с его помощью я расскажу в следующей статье.

    О возможных ошибках, очепятках и недоработках прошу сообщать в Л\С.
    Спасибо за внимание и за то, что прочитали эту портянку.

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 31

      +1
      Он еще может шить пики, где то схему видел.
        +6
        А если пошариться на сайте марсохода, то можно найти и программатор для ПЛИС Altera на этом же модуле.
          +1
          Решил рассказать об этом в следующей статье, а то получается слишком много все за раз.
            +4
            Много текста не бывает.
              0
              Я сел писать эту статью в 12 ночи и планировал написать обо всех опробованных мной способах применения FT232H, но написание затянулось до 2 и я сдался, оставив JTAG на следующий раз.
              Много получилось в первую очередь для меня — давно не писал больших текстов на русском.
              Прошу меня простить, в следующий подумаю еще разок, прежде чем садиться писать на Хабр перед сном.
                +5
                Нельзя написать хорошую техническую статью меньше чем за 5-10 часов.
                  +2
                  Согласен. Но бывает появляется вдохновение, садишься писать, пару часов пописал — выдохся, и дальше тащить тяжело, и бросить уже жалко. А тут просто победил сон. Постараюсь написать про JTAG-отладку более вдумчиво и начать не так поздно.
                    +1
                    Курица по зёрнышку клюёт. Я пишу по нескольку часов каждый день. За неделю набегает статья.
                    +2


                    Лично у меня на хорошую статью уходит минимум 3 дня, максимум недели три.
                      +1
                      Минусуют видимо те, кто не пишут технических статей о пайке на хабр… Только девайс будет паять пару дней.
                        +2
                        Я конечно не могу отвечать за всех, но минусуют скорее те, кому лень в ответ постить картинку с аккордеоном или подобным музыкальным инструментом.
                          0
                          Ну буду умнее, я тут не петросяна изображал, а просто подкрепил своё мнение картинкой.
                            +3
                            Пусть эти минусующие теперь сходят вот сюда и почитают, что имел в виду этой картинкой автор мунусуемого комментария.
                +2
                FPGA Xilinx тоже можно программировать. Проверено на семействе Spartan 6 — камень забитый на половину прошивается за 6-7 сек. Подробнее можно почитать здесь
                0
                PIC'и и сами шить умеются, взять какой-нибудь PIC18F25K50. Плюс не требуют кварца внешнего, а стоят — $2-3.
                  0
                  Ну это не интересно. Я про ISP полноценный для всего семейства.
                +1
                По работе имею дело с этим чипом. Никак не могу понять, возможно ли реализовать получение прерываний от подчинённого устройства SPI? Хочется чтобы поток чтения с устройства приостонавливался до тех пор, пока не придёт прерывание от устройства (так оно сообщает о появлении новых данных). В документации о прерываниях говорится мало и в других режимах. Как получить прерывания по GPIO — не понятно.
                Кто-нибудь знает?
                  0
                  А как именно физически реализован сигнал о прерывании? Если выставлением высокого\низкого уровня на ноге, то достаточно соединить её с любым свободным входом GPIO (ACBUS7 вполне подойдет), и периодически читать состояние этой ноги опкодом GPIOReadLB (0x81). Варианта с полной остановкой потока чтения я не знаю. В документации есть режимы Wait On I/O High/Low (опкоды 0х88 и 0х89), но их не использовал ни разу, поэтому ничего об их работе сказать не могу.
                    0
                    Путём подачи импульса прерывания, он не такой уж и длинный, постоянным чтением ноги его не поймать.
                    Я тоже надеюсь на этот режим ожидания I/O, проблема в том, что в документации сказано про «GPIOL1 (JTAG) or I/O1 (CPU)», но ничего не сказано про SPI. Похоже что для SPI такая команда недоступна, тогда всё печально.
                      0
                      Надо тестировать, возможно, команда работает во всех режимах, но в документации это не описано (она вообще не очень, честно говоря).
                      Опять же, можно написать напрямую в FTDI, есть ненулевая вероятность, что помогут.
                      Есть еще вариант использовать другой канал специально для ловли этого прерывания, но тут уже слишком большой оверхед получается.
                        +1
                        Кстати, прерывания действильно успешно работают для MPSSE-режима (то есть и SPI), хотя об этом явно в документации не сказано. Работает на ножке GPIOL1.
                        Работат чётко, как указано в документации. То есть приостанавливает выполнение посланной ему последовательности команд до тех пор, пока не придёт прерывание на ножку.
                        Наверняка кому-нибудь это тоже интересно.
                  +3
                  На мой взгляд, обзор характеристик устройств стоит дополнить, сказав, что буковка H в конце названия неспроста — эти чипы поддерживают USB Hi speed.
                  Ну и вообще, говоря, чипы весьма сильно между собой отличаются поддержкой различных режимов кроме MPPSE.
                  4-х портовый чип самый старый из тройки *H и особо не интересен, кроме самого факта наличия 4х портов.
                  А вот FT232H и FT2232H поддерживают режим синхронной передачи данных (FIFO synchronous mode), обеспечивающий скорость передачи порядка 30-35 мбайт/с — мы его используем для подключения разрабатываемых железяк к PC.
                  FT232H, кстати, самой новый из всех — у него получше временные характеристики и добавлен какой-то еще режим по сравнению с 2232H.
                    0
                    Согласен со всем, но для DIY-железа, на мой взгляд, скоростные характеристики не очень важны, а даташит на конкретный чип все равно потом читать придется. Но замечание резонное, спасибо.
                    +1
                    Давно вот собираюсь такую дощечку прикупить, а то всяких JTAGов тучи разных и дорогих, а вот такой универсальный девайс был бы полезен.
                      0
                      Как то давно делал spi адаптер из сторой ftdi'ки, но в ней не хватало скорости, чтобы слать (почти)непрерывный поток на высоком битрейте. В 232H такой проблемы уже нет?
                        +2
                        Процитирую соответствующий AN:
                        Full duplex data transfers can be made up to 30 Mbits/sec with the FT2232H
                          +1
                          Ограничение неожиданное может быть со стороны USB-шины, которая может стать причиной разрывов в непрерывном потоке данных.
                          +1
                          Буквально сегодня выяснил что чудо-устройство не поддерживает 1й и 3й режимы работы SPI. Это очень печально, ведь мне как раз 3й режим крайне необходим для работы. И как теперь быть?
                          В Интернете есть какие-то мутные упоминания о том, как это «частично» можно реализовать, но конкретных примеров я не нашёл.
                            0
                            Скажите, а вас можно нанять на то, что бы сделать готовую плату + подобрать софт для прошивки Winbond W25Q64?

                            SPI флешка впаяна на плату, программатор EZP2010 её то прошивает, то нет. Хочется что бы прошивал и не из под виндовс, а из под линукса/макоси.
                              0
                              Нанять меня сейчас нельзя, а вот посоветовать пару хороших ISP-программаторов с поддержкой Linux/OSX я могу:
                              1. MiniPro TL866A, если не пугает его китайское происхождение. А еще для него есть качественный открытый софт.
                              2. Dediprog SF-100, если не пугает его цена. В Linux/OSX он поддерживается утилитой flashrom.
                              Я тестировал оба, и ни разу ни один из них не отказался шить чип, находящийся на плате, что нередко бывает на более дешевых программаторах.
                                0
                                спасибо большое за наводку.

                            Only users with full accounts can post comments. Log in, please.