Pull to refresh

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

Reading time7 min
Views131K

Странно, что про этот крайне популярный и полезный чип до сих пор не было статьи на Хабре. Считаю необходимым восполнить этот пробел. В статье будет описано несколько интересных способов применения чипа 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 с его помощью я расскажу в следующей статье.

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

Articles

Change theme settings