FTDI: командный процессор MPSSE и режимы эмуляции шины хоста Печать
Добавил(а) microsin   

В чипах FT2232D, FT232H, FT2232H и FT4232H компании FTDI встроен процессор команд (Command Processor), который называется Multi-Protocol Synchronous Serial Engine (MPSSE). Назначение командного процессора MPSSE - эффективным образом (с аппаратной поддержкой) реализовать настраиваемый обмен с внешними устройствами с использованием синхронных протоколов (таких как JTAG или SPI). Режим эмуляции шины хоста чипов FT2232x (FT2232x MCU Host Bus Emulation mode) также использует технологию MPSSE для того, чтобы чип эмулировал стандартные шины хоста 8048/8051 MCU.

Примечание: в этой статье приведен перевод апноута AN_108 [1].

Блок процессора MPSSE управляется командой SETUP. Разные команды используются для того, чтобы выдвигать данные из чипа и вдвигать данные в чип, а также управления другими выводами I/O. Если запрещенный MPSSE удерживается в состоянии сброса, то он не будет оказывать никакого влияния на остальную часть чипа. Когда MPSSE, он принимает команды и данные из канала данных OUT, когда они записаны хостом USB в конечную точку OUT чипа. Это просто осуществляется нормальной командой WRITE, как если бы данные записывались в COM-порт. Любые прочитанные данные отправляются обратно через нормальный канал IN. Это делается нормальной командой READ, как если бы данные считывались из COM-порта.

Примечание: чтобы гарантировать, что драйвер устройства не будет выдавать IN-запросы, если буфер не может принять данные, добавьте вызов FT_SetFlowControl перед входом в MPSSE или режимы MCU Host Bus.

[Определение данных и тактов]

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

Таблица 2.1. Назначение выводов MPSSE.

Бит Сигнал
FT232H
FT2232H
FT4232H
FT2232D Тип
Описание
Channel A Channel B Channel A Channel B Channel A
Bit0 TCK/SK ADBUS0 ADBUS0 BDBUS0 ADBUS0 BDBUS0 ADBUS0 O Такты данных
Bit1 TDI/DO ADBUS1 ADBUS1 BDBUS1 ADBUS1 BDBUS1 ADBUS1 O Выход данных
Bit2 TDO/DI ADBUS2 ADBUS2 BDBUS2 ADBUS2 BDBUS2 ADBUS2 I Вход данных
Bit3 TMS/CS ADBUS3 ADBUS3 BDBUS3 ADBUS3 BDBUS3 ADBUS3 O Сигнал выборки
Bit4 GPIOL0 ADBUS4 ADBUS4 BDBUS4 ADBUS4 BDBUS4 ADBUS4 I/O GPIO
Bit5 GPIOL1 ADBUS5 ADBUS5 BDBUS5 ADBUS5 BDBUS5 ADBUS5 I/O GPIO
Bit6 GPIOL2 ADBUS6 ADBUS6 BDBUS6 ADBUS6 BDBUS6 ADBUS6 I/O GPIO
Bit7 GPIOL3 ADBUS7 ADBUS7 BDBUS7 ADBUS7 BDBUS7 ADBUS7 I/O GPIO
Bit8 GPIOH0 ACBUS0 ACBUS0 BCBUS0 - - ACBUS0 I/O GPIO
Bit9 GPIOH1 ACBUS1 ACBUS1 BCBUS1 - - ACBUS1 I/O GPIO
Bit10 GPIOH2 ACBUS2 ACBUS2 BCBUS2 - - ACBUS2 I/O GPIO
Bit11 GPIOH3 ACBUS3 ACBUS3 BCBUS3 - - ACBUS3 I/O GPIO
Bit12 GPIOH4 ACBUS4 ACBUS4 BCBUS4 - - - I/O GPIO
Bit13 GPIOH5 ACBUS5 ACBUS5 BCBUS5 - - - I/O GPIO
Bit14 GPIOH6 ACBUS6 ACBUS6 BCBUS6 - - - I/O GPIO
Bit15 GPIOH7 ACBUS7 ACBUS7 BCBUS7 - - - I/O GPIO

Работа тактирования. Вывод выхода TCK/CK дважды делает операцию XOR текущего состояния вывода CLK. Это значит, что если тактовый вывод находится в лог. 0, то такты перейдут в лог. 1 за 1 тактовый перепад. Если тактовый вывод находится в лог. 1, то переход его в лог. 0 также за 1 тактовый перепад.

Из этого следует: если такты начинают работать с состояния ожидания (idle state) в лог. 0, то данные могут выдвигаться наружу по отрицательному перепаду тактов (1 -> 0), и вдвигаться по положительному перепаду (0 -> 1). Если такты начинают работать с состояния ожидания (idle state) в лог. 1, то данные могут выдвигаться наружу по положительному перепаду тактов (0 -> 1), и вдвигаться по отрицательному перепаду (1 -> 0).

[Определения команд]

BadCommands. Если устройство определит неправильную команду (bad command), то оно отправит обратно в в компьютер PC два байта. Первый будет байтом 0xFA, за ним будет идти байт, равный значению неправильной команды.

Если команды и ответы, которые читаются/записываются вышли из правильной последовательности, то это даст Вам информацию о первом шаблоне команды, которая привела к ошибке. Ошибка может произойти до этого (например, было отправлено неправильное количество данных после команды записи) и сработает только когда перейдет в лог. 1 бит 7 неправильной команды.

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

Bit 0: отрицательный перепад CLK при записи.
Bit 1: если битовый режим (bit mode), то здесь лог. 1, иначе байтовый режим (byte mode).
Bit 2: отрицательный перепад CLK при чтении.
Bit 3: если первым идет LSB, то здесь лог. 1, иначе идет первым MSB.
Bit 4: записать TDI.
Bit 5: прочитать TDO.
Bit 6: записать TMS.
Bit 7: 0.

Команды записи в TDI работают, когда оба бита 7 и 6 в состоянии лог. 0. Чтение TDO будет работать с выводом данных через TMS, или с выводом данных через TDI, или самостоятельно.

Первым идет MSB. Используются следующие команды, когда данные передаются старшим битом (Most Significant Bit, MSB) вперед.

opcode Data IN Data OUT Тип данных Перепад IN CLK Перепад OUT CLK
0x10 - ДА БАЙТЫ - 0 → 1
0x11 - ДА БАЙТЫ - 1 → 0
0x12 - ДА биты - 0 → 1
0x13 - ДА биты - 1 → 0
0x20 ДА - БАЙТЫ 0 → 1 -
0x24 ДА - БАЙТЫ 1 → 0 -
0x22 ДА - биты 0 → 1 -
0x26 ДА - биты 1 → 0 -
0x31 ДА ДА БАЙТЫ 0 → 1 1 → 0
0x34 ДА ДА БАЙТЫ 1 → 0 0 → 1
0x34 ДА ДА биты 0 → 1 1 → 0
0x36 ДА ДА биты 1 → 0 0 → 1

Этот режим используется, если такты CLK начинаются с уровня лог. 1. Последовательность вывода байт:

0x10, LengthL, LengthH, Byte1, .., Byte65536 (max)

Эта последовательность выдвинет байты через сигнал TDI/DO, количество выдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 выдвинет 1 байт, и значение длины 0xffff выдвинет 65536 байт. Данные будут отправляться наружу старшим битом (MSB) вперед. Бит 7 первого байта будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDO/DI никакие данные вдвигаться не будут.

Этот режим используется, если такты CLK начинаются с уровня лог. 0. Последовательность вывода байт:

0x11, LengthL, LengthH, Byte1, .., Byte65536 (max)

Эта последовательность выдвинет байты через сигнал TDI/DO, количество выдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 выдвинет 1 байт, и значение длины 0xffff выдвинет 65536 байт. Данные будут отправляться наружу старшим битом (MSB) вперед. Бит 7 первого байта будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDO/DI никакие данные вдвигаться не будут.

Этот режим используется, если такты CLK начинаются с уровня лог. 1. Последовательность вывода бит:

0x12, Length, Byte1

Эта последовательность выдвинет биты через сигнал TDI/DO, количество выдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 выдвинет 1 бит, и значение длины 0x07 выдвинет 8 бит. Данные будут отправляться наружу старшим битом (MSB) вперед. Бит 7 байта Byte1 будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDO/DI никакие данные вдвигаться не будут.

Этот режим используется, если такты CLK начинаются с уровня лог. 0. Последовательность вывода бит:

0x13, Length, Byte1

Эта последовательность выдвинет биты через сигнал TDI/DO, количество выдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 выдвинет 1 бит, и значение длины 0x07 выдвинет 8 бит. Данные будут отправляться наружу старшим битом (MSB) вперед. Бит 7 байта Byte1 будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDO/DI никакие данные вдвигаться не будут.

Последовательность байт команды:

0x20, LengthL, LengthH

Эта последовательность вдвинет байты через сигнал TDO/DI, количество вдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 вдвинет 1 байт, и значение длины 0xffff вдвинет 65536 байт. Данные вводятся снаружи старшим битом (MSB) вперед, начиная с первого байта, и так далее. Данные будут считываться по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDI/DO никакие данные выдвигаться не будут.

Последовательность байт команды:

0x24, LengthL, LengthH

Эта последовательность вдвинет байты через сигнал TDO/DI, количество вдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 вдвинет 1 байт, и значение длины 0xffff вдвинет 65536 байт. Данные вводятся снаружи старшим битом (MSB) вперед, начиная с первого байта, и так далее. Данные будут считываться по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDI/DO никакие данные выдвигаться не будут.

Уровень TDO/DI анализируется непосредственно перед фронтом нарастания уровня тактов. Последовательность байт команды:

0x22, Length

Эта последовательность вдвинет биты через сигнал TDO/DI, количество вдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 вдвинет 1 бит, и значение длины 0x07 вдвинет 8 бит. Данные вводятся снаружи таким образом, что первый вводимый бит может не быть в бите 7, однако начиная с бита 6 и вниз, в зависимости от количества вводимых бит (например, длина в 1 бит получит бит данных, вводимый в бите 0 байта, отправляемого обратно в компьютер PC). Данные будут считываться по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDI/DO никакие данные выдвигаться не будут.

Уровень TDO/DI анализируется непосредственно перед спадом уровня тактов. Последовательность байт команды:

0x26, Length

Эта последовательность вдвинет биты через сигнал TDO/DI, количество вдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 вдвинет 1 бит, и значение длины 0x07 вдвинет 8 бит. Данные вводятся снаружи таким образом, что первый вводимый бит может не быть в бите 7, однако начиная с бита 6 и вниз, в зависимости от количества вводимых бит (например, длина в 1 бит получит бит данных, вводимый в бите 0 байта, отправляемого обратно в компьютер PC). Данные будут считываться по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDI/DO никакие данные выдвигаться не будут.

Следующие команды позволяют одновременно вводить и выводить данные, самым старшим битом вперед. Байт может быть от 1 до 65536, в зависимости от значения Length. Значение 0x0000 обрабатывает 1 байт, значение 0xFFFF обрабатывает 65536 байт.

Вывод данных по отрицательному перепаду тактов, ввод по положительному:

0x31, LengthL, LengthH, Byte1, .., Byte65536 (max)

Вывод данных по положительному перепаду тактов, ввод по отрицательному:

0x34, LengthL, LengthH, Byte1, .., Byte65536 (max)

Следующие команды позволяют одновременно вводить и выводить данные, самым старшим битом вперед. Выводить можно до 8 бит максимум, в зависимости от значения Length. Значение 0 обрабатывает 1 бит, значение 7 обрабатывает 8 бит. Выводимые данные содержатся в байте Byte.

Вывод данных по отрицательному перепаду тактов, ввод по положительному:

0x33, Length, Byte

Вывод данных по положительному перепаду тактов, ввод по отрицательному:

0x36, Length, Byte

Первым идет LSB. Используются следующие команды, когда данные передаются младшим битом (Least Significant Bit, LSB) вперед.

opcode Data IN Data OUT Тип данных Перепад IN CLK Перепад OUT CLK
0x18 - ДА БАЙТЫ - 0 → 1
0x19 - ДА БАЙТЫ - 1 → 0
0x1A - ДА биты - 0 → 1
0x1B - ДА биты - 1 → 0
0x28 ДА - БАЙТЫ 0 → 1 -
0x2C ДА - БАЙТЫ 1 → 0 -
0x2A ДА - биты 0 → 1 -
0x2E ДА - биты 1 → 0 -
0x39 ДА ДА БАЙТЫ 0 → 1 1 → 0
0x3C ДА ДА БАЙТЫ 1 → 0 0 → 1
0x3B ДА ДА биты 0 → 1 1 → 0
0x3E ДА ДА биты 1 → 0 0 → 1

Этот режим используется, если такты CLK начинаются с уровня лог. 1. Последовательность вывода байт:

0x18, LengthL, LengthH, Byte1, .., Byte65536 (max)

Эта последовательность выдвинет байты через сигнал TDI/DO, количество выдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 выдвинет 1 байт, и значение длины 0xffff выдвинет 65536 байт. Данные будут отправляться наружу младшим битом (LSB) вперед. Бит 0 первого байта будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDO/DI никакие данные вдвигаться не будут.

Этот режим используется, если такты CLK начинаются с уровня лог. 0. Последовательность вывода байт:

0x19, LengthL, LengthH, Byte1, .., Byte65536 (max)

Эта последовательность выдвинет байты через сигнал TDI/DO, количество выдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 выдвинет 1 байт, и значение длины 0xffff выдвинет 65536 байт. Данные будут отправляться наружу младшим битом (LSB) вперед. Бит 0 первого байта будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDO/DI никакие данные вдвигаться не будут.

Этот режим используется, если такты CLK начинаются с уровня лог. 1. Последовательность вывода бит:

0x1A, Length, Byte1

Эта последовательность выдвинет биты через сигнал TDI/DO, количество выдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 выдвинет 1 бит, и значение длины 0x07 выдвинет 8 бит. Данные будут отправляться наружу младшим битом (LSB) вперед. Бит 0 байта Byte1 будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDO/DI никакие данные вдвигаться не будут.

Этот режим используется, если такты CLK начинаются с уровня лог. 0. Последовательность вывода бит:

0x1B, Length, Byte1

Эта последовательность выдвинет биты через сигнал TDI/DO, количество выдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 выдвинет 1 бит, и значение длины 0x07 выдвинет 8 бит. Данные будут отправляться наружу младшим битом (LSB) вперед. Бит 0 байта Byte1 будет помещен на сигнал TDI/D0, затем будет формироваться сигнал тактов на выводе CLK. Значение уровня данных поменяется для следующего бита по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDO/DI никакие данные вдвигаться не будут.

Последовательность байт команды:

0x28, LengthL, LengthH

Эта последовательность вдвинет байты через сигнал TDO/DI, количество вдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 вдвинет 1 байт, и значение длины 0xffff вдвинет 65536 байт. Данные вводятся снаружи младшим битом (LSB) вперед, начиная с первого байта, и так далее. Данные будут считываться по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDI/DO никакие данные выдвигаться не будут.

Последовательность байт команды:

0x2C, LengthL, LengthH

Эта последовательность вдвинет байты через сигнал TDO/DI, количество вдвигаемых байт данных от 1 до 65536, в зависимости от значения длины Length. Значение длины 0x0000 вдвинет 1 байт, и значение длины 0xffff вдвинет 65536 байт. Данные вводятся снаружи младшим битом (LSB) вперед, начиная с первого байта, и так далее. Данные будут считываться по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDI/DO никакие данные выдвигаться не будут.

Уровень TDO/DI анализируется непосредственно перед фронтом нарастания уровня тактов. Последовательность байт команды:

0x2A, Length

Эта последовательность вдвинет биты через сигнал TDO/DI, количество вдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 вдвинет 1 бит, и значение длины 0x07 вдвинет 8 бит. Данные вводятся снаружи таким образом, что первый вводимый бит может не быть в бите 0, однако начиная с бита 1 и вверх, в зависимости от количества вводимых бит (например, длина в 1 бит получит бит данных, вводимый в бите 7 байта, отправляемого обратно в компьютер PC). Данные будут считываться по фронту нарастания уровня на выводе CLK (переход лог. 0 -> лог. 1). Через ножку TDI/DO никакие данные выдвигаться не будут.

Уровень TDO/DI анализируется непосредственно перед спадом уровня тактов. Последовательность байт команды:

0x2E, Length

Эта последовательность вдвинет биты через сигнал TDO/DI, количество вдвигаемых бит данных от 1 до 8, в зависимости от значения длины Length. Значение длины 0x00 вдвинет 1 бит, и значение длины 0x07 вдвинет 8 бит. Данные вводятся снаружи таким образом, что первый вводимый бит может не быть в бите 0, однако начиная с бита 1 и вверх, в зависимости от количества вводимых бит (например, длина в 1 бит получит бит данных, вводимый в бите 7 байта, отправляемого обратно в компьютер PC). Данные будут считываться по спаду уровня на выводе CLK (переход лог. 1 -> лог. 0). Через ножку TDI/DO никакие данные выдвигаться не будут.

Следующие команды позволяют одновременно вводить и выводить данные, младшим битом вперед. Байт может быть от 1 до 65536, в зависимости от значения Length. Значение 0x0000 обрабатывает 1 байт, значение 0xFFFF обрабатывает 65536 байт.

Вывод данных по отрицательному перепаду тактов, ввод по положительному:

0x39, LengthL, LengthH, Byte1, .., Byte65536 (max)

Вывод данных по положительному перепаду тактов, ввод по отрицательному:

0x3С, LengthL, LengthH, Byte1, .., Byte65536 (max)

Следующие команды позволяют одновременно вводить и выводить данные, младшим битом вперед. Выводить можно до 8 бит максимум, в зависимости от значения Length. Значение 0 обрабатывает 1 бит, значение 7 обрабатывает 8 бит. Выводимые данные содержатся в байте Byte.

Вывод данных по отрицательному перепаду тактов, ввод по положительному:

0x3B, Length, Byte

Вывод данных по положительному перепаду тактов, ввод по отрицательному:

0x3E, Length, Byte

Команды TMS. Следующие команды предназначены главным образом на использование в интерфейсах JTAG, где сигнал TMS должен управляться для навигации по машине состояний JTAG.

opcode Data IN Data OUT Перепад IN CLK Перепад OUT CLK
0x4A - ДА - 0 → 1
0x4B - ДА - 1 → 0
0x6A ДА ДА 0 → 1 0 → 1
0x6B ДА ДА 1 → 0 0 → 1
0x6E ДА ДА 0 → 1 1 → 0
0x6F ДА ДА 1 → 0 1 → 0

0x4A или 0x4B, Length, Byte1

Эта команда отправит от 6 до 0 бит на вывод TMS, используя LSB или MSB, и спад или фронт CLK, в зависимости от того, какие младшие биты установлены.

0x4A: TMS, когда первым идет LSB по фронту нарастания уровня CLK - используется, если CLK установлен в лог. 1.
0x4B: TMS, когда первым идет LSB по спаду уровня CLK - используется, если CLK установлен в лог. 0.

Бит 7 байта Byte1 передается на TDI/DO перед первым импульсом CLK у TMS, и держится статическим на длительность тактирования TMS. Операция записи не осуществляется.

0x6A или 0x6B или 0x6E или 0x6F, Length, Byte1

Эта команда отправит от 6 до 0 бит на вывод TMS, используя LSB или MSB, и спад или фронт CLK, в зависимости от того, какие младшие биты установлены.

0x6A: TMS, когда первым идет LSB по фронту нарастания уровня CLK, чтение по фронту нарастания уровня CLK - используется, если CLK установлен в лог. 1.
0x6B: TMS, когда первым идет LSB по спаду уровня CLK, чтение по фронту нарастания уровня CLK - используется, если CLK установлен в лог. 0.
0x6E: TMS, когда первым идет LSB по фронту нарастания уровня CLK, чтение по спаду уровня - используется, если CLK установлен в лог. 1.
0x6F: TMS, когда первым идет LSB по спаду уровня CLK, чтение по спаду уровня - используется, если CLK установлен в лог. 0.

Бит 7 байта Byte1 передается на TDI/DO перед первым импульсом CLK у TMS, и держится статическим на длительность тактирования TMS. Уровень ножки TDO/DI оцифровывается во время длительности TMS, и байт, содержащий данные, передается обратно по окончанию тактирования TMS.

Установка, чтение бит данных старших и младших байт. Следующие команды используются для установки начального направления и логического состояния выводов, когда происходит первый вход в режим MPSSE. Они также используются для установки или чтения ножек GPIO. Младший байт был бы ADBUS7 .. ADBUS0, и старший байт ACBUS7 .. ACBUS0.

opcode Set O/P Read I/P Старший байт Младший байт
0x80 ДА - - ДА
0x82 ДА - ДА -
0x81 - ДА - ДА
0x83 - ДА ДА -

0x80, 0xValue, 0xDirection

Настроит направление (Direction) первых 8 сигналов и установит уровень в соответствие Value у тех сигналов, которые настроены как выход. Бит 1 в байте Direction настроит соответствующий сигнал на выход.

0x82, 0xValue, 0xDirection

Настроит направление (Direction) старших 8 сигналов и установит уровень в соответствие Value у тех сигналов, которые настроены как выход. Бит 1 в байте Direction настроит соответствующий сигнал на выход.

0x81

Прочитает текущее состояние первых 8 сигналов и отправит обратно 1 байт.

0x83

Прочитает текущее состояние старших 8 сигналов и отправит обратно 1 байт.

Команды Loopback. Если разрешена функция логического закольцовывания данных со выхода на вход (loopback), то выводы TDI/DO и TDO/DI логически замкнуты друг на друга внутри микросхемы FTDI. Это позволяет тестировать прохождение данных без необходимости подключения внешних устройств и цепей.

opcode Loopback разрешен
0x84 ДА
0x85 нет

0x84

Команда соединит выход TDI/DO со входом TDO/DI для тестирования петли прямого замыкания данных loopback.

0x85

Команда разъединит выход TDI/DO со входом TDO/DI для тестирования петли прямого замыкания данных loopback.

Clock Divisor. В следующих врезках описано, как установить скорость, на которой данные вдвигаются в микросхему FTDI и выдвигаются из неё.

0x86, 0xValueL, 0xValueH

Эта команда установит делитель тактов (clock divisor). У тактов TCK/SK всегда скважность 50%, кроме команд, где уровень тактов устанавливается в начальное состояние. Начальное состояние устанавливается с использованием команды Set Data Bits Low Byte (0x80). Например, для настройки режима JTAG были бы выданы команды:

0x80 установка бит младшего байта
0x08 TCK/SK, TDI/D0 в лог. 0, TMS/CS в лог. 1
0x0B TCK/SK, TDI/D0, TMS/CS настроены на выход, TDO/DI и ножки GPIOL0 .. GPIOL3 как вход.

Такты начнут работу с лог. 0. Когда MPSSE отправлена команда для тактирования бит (или байт), она переводит такты в лог. 1 и затем обратно в лог. 0 на время 1 периода тактов. Для команд TMS/CS команда 0x4B использовалась бы без чтения, и команда 0x6B для TMS/CS использовалась бы с чтением. Для тактирования данных с выводом через TDI/DO без чтения TDO/DI команда 0x19 использовалась бы для байт, и 0x1B для бит. Для чтения из TDO/DI без отправляемых данных через TDI/DO использовалась бы команда 0x28 ля байт, и 0x2A для бит. Для одновременного сканирования данных в микросхему и из неё использовалась бы команда 0x39 для байт и 0x3B для бит.

Частота TCK/SK может работать в соответствии со следующей формулой:

Частота TCK/SK = 12 МГц / (( 1 +[(0xValueH * 256) OR 0xValueL] ) * 2)

Для примера:

Значение TCK/SK Max
0x0000   6 МГц
0x0001   3 МГц
0x0002   2 МГц
0x0003   1.5 МГц
0x0004   1.2 МГц
...      ...
0xFFFF   91.553 Гц

По умолчанию после сброса, когда активирован дополнительный делитель частоты на 5, частота тактов у высокоскоростных чипов FT232H, FT2232H, FT4232H устанавливается точно так же, как у полноскоростных чипов FT2232D, см. предыдующую врезку.

0x86, 0xValueL, 0xValueH

Это сделано специально, для сохранения аппаратно-программной совместимости между чипами. Таким образом, формула для частоты  останется прежней. Если же дополнительный делитель на 5 деактивирован специальной командой (см. далее команду 0x8A в разделе "Команды, относящиеся только к FT232H, FT2232H и FT4232H"), то частота тактов вырастет в 5 раз, и формула получится следующая:

Частота TCK/SK = 60 МГц / (( 1 +[(0xValueH * 256) OR 0xValueL] ) * 2)

Примеры значений и соответствующих частот TCK/SK для отключенного дополнительного делителя.

Значение TCK/SK Max
0x0000   30 МГц
0x0001   15 МГц
0x0002   10 МГц
0x0003   7.5 МГц
0x0004   6 МГц
...      ...
0xFFFF   457.763 Гц

[Инструкции для режима CPU]

В этом режиме чип FTDI эмулирует шину процессора (CPU interface) со следующими сигналами:

a) Шина с мультиплексированием 8 бит адреса и данных.
b) Расширенная 8-битная шина адреса.
c) Сигналы CS#, ALE, WR#, RD# и OSC.
d) 2 линии I/O, которые могут использоваться для дополнительного ввода/вывода, или для ожидания прерываний (IRQ).

opcode Запись Чтение Короткий адрес Расширенный адрес
0x90 - ДА ДА -
0x91 - ДА - ДА
0x92 ДА - ДА -
0x93 ДА - - ДА

0x90, 0xAddrLow

Эта команда прочитает 1 байт из целевого устройства.

0x91, 0xAddrHigh, 0xAddrLow

Эта команда прочитает 1 байт из целевого устройства.

0x92, 0xAddrLow, 0xData

Эта команда запишет 1 байт Data в целевое устройство.

0x93, 0xAddrHigh, 0xAddrLow, 0xData

Эта команда запишет 1 байт Data в целевое устройство.

[Инструкции для одновременного использования MPSSE и режимов эмуляции хоста MCU]

0x87

Эта команда выполнит сброс буфера микросхемы с передачей его содержимого в компьютер PC.

0x88

Эта команда заставляет контроллер MPSSE ждать, пока GPIOL1 (режим JTAG) или I/O1 (режим CPU) не перейдет в лог. 1. Как только был определен уровень лог. 1, это приведет к переходу процесса к следующей инструкции. Если линия I/O не переходит в лог. 1, то единственный способ выйти из состояния ожидания - запрет контроллера.

0x89

Эта команда заставляет контроллер MPSSE ждать, пока GPIOL1 (режим JTAG) или I/O1 (режим CPU) не перейдет в лог. 0. Как только был определен уровень лог. 0, это приведет к переходу процесса к следующей инструкции. Если линия I/O не переходит в лог. 0, то единственный способ выйти из состояния ожидания - запрет контроллера.

[Команды, относящиеся только к FT232H, FT2232H и FT4232H]

Команды в таблице ниже применимы только к микросхемам FT232H, FT2232H и FT4232H.

opcode Функция
0x8A Запрещает дополнительный делитель на 5, чтобы можно было использовать 60 МГц в качестве опорной тактовой частоты.
0x8B Разрешат дополнительный делитель на 5 для достижения обратной совместимости с FT2232D.
0x8C Разрешает трехфазное тактирование данных. Используется интерфейсами I2C/TWI, чтобы можно было считывать данные по обоим перепадам тактов.
0x8D Запрещает трехфазное тактирование данных.
0x8E Позволяет генерировать такты без передачи данных. Обычно используется для управления машиной состояний JTAG. Количество тактов учитывается по количеству бит.
0x8F Позволяет генерировать такты без передачи данных. Обычно используется для управления машиной состояний JTAG. Количество тактов учитывается по количеству байт.
0x94 Позволяет генерировать такты без передачи данных, пока это не остановит лог. 1 на входе GPIOL1.
0x95 Позволяет генерировать такты без передачи данных, пока это не остановит лог. 0 на входе GPIOL1.
0x96 Разрешает адаптивное тактирование.
0x97 Запрещает адаптивное тактирование.
0x9C Позволяет генерировать такты без передачи данных, пока это не остановит лог. 1 на входе GPIOL1, или пока не будет отправлено определенное количество импульсов тактов. Количество тактов учитывается по количеству байт.
0x9D Позволяет генерировать такты без передачи данных, пока это не остановит лог. 0 на входе GPIOL1, или пока не будет отправлено определенное количество импульсов тактов. Количество тактов учитывается по количеству байт.

0x8A

Команда выключит делитель на 5, чтобы на основной делитель подавалась частота 60 МГц..

0x8B

Команда включит делитель на 5, чтобы на основной делитель подавалась частота 60/5 = 12 МГц (режим по умолчанию, для совместимости с FT2232D).

0x8C

Команда дает сдвиг данных на 3 стадиях, что используется для поддержи таких интерфейсов, как I2C которым нужны достоверные данные на обоих перепадах тактов clk. Это выглядит следующим образом:

Установка данных за 1/2 периода тактов ->
импульс тактов на 1/2 периода тактов ->
удержание уровня данных на 1/2 периода тактов.

0x8D

Команда переводит сдвиг данных в состояние по умолчанию, на 2 стадиях. Это выглядит следующим образом:

Установка данных за 1/2 периода тактов ->
импульс тактов на 1/2 периода тактов.

0x8E, Length

Команда сгенерирует от 1 до 8 импульсов тактов. Значение Length равное 0x00 приведет к формированию 1 периода тактов, и значение 0x07 приведет к формированию 8 периодов тактов.

0x8F LengthL, LengthH

Команда сгенерирует от 8 до 0x80000 импульсов тактов, количество определяется значением Length. Значение Length 0x0000 приведет к формированию 8 периодов тактов, и Length 0xFFFF приведет к формированию 524288 периодов тактов.

0x94

Эта команда приведет к тому, что контроллер будет формировать импульсы тактов до тех пор, пока GPIOL1 или I/O1 (CPU mode микросхемы FT2232H) находится в состоянии лог. 0. Как только был определен уровень лог. 1, это приведет к переходу процесса к следующей инструкции. Если уровень I/O никогда не становится равным лог. 1, то единственный способ выйти из этого состояния - запрет контроллера.

0x95

Эта команда приведет к тому, что контроллер будет формировать импульсы тактов до тех пор, пока GPIOL1 или I/O1 (CPU mode микросхемы FT2232H) находится в состоянии лог. 1. Как только был определен уровень лог. 0, это приведет к переходу процесса к следующей инструкции. Если уровень I/O никогда не становится равным лог. 0, то единственный способ выйти из этого состояния - запрет контроллера.

0x96

Адаптивное тактирование требуется для интерфейса JTAG процессора ARM.

Команда приведет к тому, что контроллер ждет сигнала RTCK от процессора ARM который должен поступать на ножку GPIOL3 (находящемуся в режиме входа). После того, как уровень на выходе тактов TCK поменялся, контроллер ждет, пока RTCK не получит такой же уровень перед тем, как снова поменять уровень TCK. Такое поведение можно рассматривать как подтверждение, что был принят сигнал тактов необходимой частоты.

0x97

Команда выключает адаптивное тактирование.

0x9C, LengthL, LengthH

Команда приведет к выдаче от 8 до $80000 импульсов тактов, в зависимости от значения Length. Значение Length 0x0000 приведет к формированию 8 тактов, и Length 0xFFFF приведет к формированию 524288 тактов, или пока GPIOL1 не перейдет в лог. 1.

0x9D, LengthL, LengthH

Команда приведет к выдаче от 8 до $80000 импульсов тактов, в зависимости от значения Length. Значение Length 0x0000 приведет к формированию 8 тактов, и Length 0xFFFF приведет к формированию 524288 тактов, или пока GPIOL1 не перейдет в лог. 0.

[Команда только для FT232H]

Установка работы выходов I/O только при лог. 0, с переходом в отключенное состояние при лог. 1:

0x9E, LowByteEnablesForOnlyDrive0, HighByteEnablesForOnlyDrive0 

Команда приведет к тому, что выходы буферов I/O будут активны только когда данные находятся в лог. 0, и будут в третьем состоянии, когда данные станут лог. 1, и установлен соответствующий бит. Этот op-code используется, когда MPSSE конфигурируется для I2C.

[Ссылки]

1. AN_108 Command Processor for MPSSE and MCU Host Bus Emulation Modes site:ftdichip.com.
2. Базовое описание MPSSE чипов FTDI.