Использование и установка D2xx-драйверов фирмы FTDI
Использование D2xx -драйверов
D2xx-драйверы фирмы FTDI являются альтернативой VCP-драйверам. Они включают драйвер WDM, который осуществляет связь с устройством через Windows USB Stack, и библиотеку DLL, которая связывает прикладное программное обеспечение (написанное на VC++, Borland C++ Builder, Delphi, VB и т.п.) с WDM драйвером.
D2XX-драйверы позволяют получать максимальные заявленные скорости обмена данными (8 Мбит/с для каналов, образующих параллельный интерфейс с микропроцессорной системой, и 3 Мбит/c при использовании последовательной связи с микроконтроллером).
Установка D2XX-драйверов
Драйверы многих фирм-производителей USB-устройств сертифицированы и интегрированы в опeрационную систему Windows. При подключении к компьютеру нового USB-устройства операционная система опрашивает его идентификаторы: VID (Vendor Identifier) и PID (Product Identifier). Если драйвер, соответствующий этим идентификаторам, имеется в составе операционной системы, то начинается его установка. Если система не находит самостоятельно соответствующего драйвера, то она предоставляет возможность пользователю указать путь к каталогу, в котором находится необходимый дистрибутив.
Oперационные системы Windows 98/ME/2000 не содержат в своем составе сертифицированных драйверов FTDI. Поэтому при подключении USB-устройств со стандартными для FTDI идентификаторами (VID=0403 и PID=6001) пользователь имеет возможность выбрать тип необходимого драйвера, VCP или D2XX, указав соответствующую директорию для установки.
Немного сложнее обстоит дело в случае использования операционной системы Windows XP, которая уже имеет в своем составе сертифицированные VCP-драйверы FTDI. При попытках присоединить к компьютеру новое USB-устройство со стандартными идентификаторами FTDI (например, любой DLP-модуль) система по умолчанию, не спрашивая пользователя, самостоятельно установит VCP-драйверы. Пользователю, желающему работать с D2XX-драйверами, необходимо в этот момент вспомнить, что очень полезно воспитывать в себе терпение и воспользоваться утилитой ftxprcvr.exe, входящей в состав дистрибутива D2XX-драйверов для Windows XP. Утилита ftxprcvr.exe, используя установившиеся по умолчанию VCP-драйверы, перепрограммирует внешнюю EEPROM, используемую в присоединенном устройстве, и задаст новые значения идентификаторов (VID=0403 и PID=6006). После этого необходимо повторить процедуру установки D2XX-драйверов сначала, т.е отключить и снова присоединить устройство. Теперь система даст возможность пользователю указать директорию для установки D2XX-драйверов.
Подключение D2XX-библиотеки к рабочему приложению
Для того, чтобы иметь возможность использовать функции библиотеки D2XX-драйверов необходимо ее подключить к проекту. Например, при работе в среде Borland С++ Builder необходимо в текст всех программных модулей, которые будут использовать D2XX-функции включить файл заголовка FTD2XX.h, который содержит прототипы функций и описания используемых структур.
Кроме того, в головном файле необходимо вставить макрос USELIB ("Ftd2xx.lib"), указывающий на использование внешней динамической библиотеки.
Возможно, библиотека ftd2xx.lib, входящая в состав дистрибутива, не будет совместима с версией пакета Borland C++Builder, установленной на Вашем компьютере. Тогда необходимо сгенерировать новую библиотеку, используя предлагаемый FTDI файл ftd2xx.dll и утилиту implib.exe, которую необходимо скопировать из каталога Borland\CBuilder\Bin в ту же директорию, где хранится файл ftd2xx.dll. Утилита запускается из текущего каталога с помощью командной строки ( "implib.exe Ftd2xx.dll -f"). После этого в текущем каталоге появится новая версия библиотеки ftd2xx.lib.
Функции D2XX-библиотеки
Подробное описание функций D2XX-библиотеки с примерами использования каждой функции приводится в документе "D2XX Programmer's Guide".
Все функции библиотеки разбиты на четыре группы:
- Классические функции,
- Функции работы с EEPROM,
- Функции поддержки новых режимов,
- Функции "FT-Win32 API".
Классические функции предназначены для организации основных операций обмена данными по USB. Их перечень представлен в таблице 1.
Таблица 1
Название функции |
Назначение функции |
FT_ListDevices(...) |
Чтение списка присоединённых устройств FTDI |
FT_Open(...) и FT_OpenEx(...) |
Открывает порт и возвращает указатель на него |
FT_Read(...) |
Чтение данных из порта |
FT_Write(...) |
Запись данных в порт |
FT_Close(...) |
Закрытие порта |
FT_ResetDevice(...) |
Сброс устройства |
FT_Purge(...) |
Очистка входного и выходного буферов |
FT_SetTimeouts(...) |
Установка таймаутов |
FT_GetQueueStatus(...) |
Чтение статуса очереди приёмника |
FT_GetStatus(...) |
Чтение статуса устройства |
FT_SetBreakOn(...) FT_SetBreakOff(...) |
Установка и сброс состояния "разрыв линии" |
FT_SetEventNotification(...) |
Установка условий для генерации уведомления |
FT_SetBaudRate(...) |
Установка скорости порта |
FT_SetDivisor(...) |
Установка нестандартной скорости порта |
FT_SetDataCharacteristics(...) |
Установка параметров порта, таких как длина байта, количество стоповых бит и т.д. |
FT_SetFlowControl(...) |
Установка режима аппаратного и программного управления потоком |
FT_SetDTR(...) FT_ClrDTR(...) FT_SetRTS(...) FT_ClrRTS(...) |
Установка сигналов квитирования |
FT_GetModemStatus(...) |
Чтение состояния сигналов квитирования |
FT_SetChars(...) |
Установка кодов специальных переменных, таких как событие и ошибка. |
Для каждого устройства, с которым необходимо организовать обмен данными по USB, прикладное программное обеспечение должно предварительно "открыть канал" при помощи функций "FT_Open" или "FT_OpenEX". Обе эти функции возвращают идентификатор канала, который затем используется при выполнении любой операции с каналом. При работе с одним единственным устройством для открытия канала удобно пользоваться функцией "FT_Open". Если же на шине одновременно могут присутствовать более одного устройства FTDI, то полезно предварительно при помощи функции "FT_ListDevices" получить информацию о всех присутствующих на шине FTDI-устройствах и затем применить функцию "FT_OpenEX", которая позволяет открыть канал только для одного из присоединенных USB-устройств с заданным строковым идентификатором.
После того, как канал успешно открыт, чтение и запись данных выполняются при помощи функций "FT_Read" и "FT_Write". Перед завершением приложения необходимо закрыть все открытые каналы функцией "FT_Close".
Кроме функций чтения и записи программист имеет возможность выполнять целый ряд полезных вспомогательных операций. Функция "FT_ResetDevice" позволяет осуществлять дистанционный сброс микросхемы FTDI. Очистка входного и выходного буферов выполняются при помощи функции "FT_Purge". Опрос состояния микросхемы FTDI, приемного и передающего буферов можно выполнить при помощи "FT_GetStatus" и "FT_GetQueueStatus". Для включения и выключения режима "обрыв линии" имеются функции "FT_BreakOn" и "FT_BReakOff". Возможно программировать интервалы ожидания при приеме и передаче при помощи функции "FT_SetTimeouts". Кроме того, при помощи функции "FT_SetEventNotification" можно задавать различные условия, по которым будут формироваться специальные события Windows.
Для микросхем FT8u232AM и FT232BМ, которые имеют с микропроцессорной системой асинхронную последовательную связь, при помощи функций "FT_SetBaudRate" и "FT_SetDivisor" возможно программировать скорость обмена последовательными данными с микроконтроллером, а функция "FT_SetDataCharacteristics" позволяет задавать такие параметры асинхронной последовательной передачи, как количество бит данных в кадре, количество стоп-бит, режим использования бита четности.
Обмен данными по асинхронному последовательному каналу, например, при работе с модемом, может выполняться с использованием дополнительных линий квитирования ("handshaking"). Для настройки этой возможности используется функция "FT_SetFlowControl", установка линий квитирования выполняется при помощи "FT_SetDTR", "FT_ClrDTR", "FT_SetRTS", "FT_ClrRTS". Наоборот для опроса состояния управляющих сигналов предназначена функция "FT_GetModemStatus". При помощи функции "FT_SetChars" возможно запрограммировать кодовые комбинации для специальных символов, например ошибка или событие.
Функции, предназначенные для инициализации параметров передачи асинхронных последовательных данных, в случае использования микросхемы FT245 игнорируются микросхемой.
Функции работы с EEPROM (таблица 2) дают возможность приложению считывать и записывать различные поля внешней микросхемы EEPROM, которая разделена на две области: область для задания настроек USB и пользовательская область (EEUA - EEPROM user area), в которой можно сохранять произвольные данные.
Таблица 2
Название функции для работы с EEPROM |
Назначение функции |
FT_EE_Program(...) |
Программирование области настроек USB |
FT_EE_Read(...) |
Чтение содержимого области настроек USB |
FT_EE_UASize(...) |
Считывание размера области EEUA |
FT_EE_UAWrite(...) |
Запись данных в область EEUA |
FT_EE_UARead(...) |
Чтение данных из области EEUA |
Функции "FT_EE_Program" и "FT_EE_Read" позволяют считывать и задавать параметры, определяющие режимы работы USB. При этом программист задает и считывает конфигурационные данные при помощи структуры "PFT_PROGRAM_DATA". Формат этой структуры описан в заголовочном файле FT2XX.h и выглядит следующим образом:
typedef struct ft_program_data { |
|
WORD VendorId; WORD ProductId; char *Manufacturer; char *ManufacturerId; char *Description; char *SerialNumber; WORD MaxPower;
WORD PnP; WORD SelfPowered;
WORD RemoteWakeup;
|
// VID - идентификатор производителя (0x0403) // PID - идентификатор изделия (0x6001) // строковый идентификатор производителя // строковый префикс производителя // строковый идентификатор изделия // строка с серийным номером изделия // максимальный потребляемый ток в мА // минимум 0, максимум 500 // Plug and Play: запрещение (0)/ разрешение (1) // режим питания: 0 - питание от USB, 1 - питание от // внешнего источника // удалённый перевод в активное состояние. // 0 - невозможно, 1 - возможно. |
// Остальные поля структуры зарезервированы для микросхем четвёртой версии |
|
UCHAR Rev4; UCHAR IsoIn; UCHAR IsoOut; UCHAR PullDownEnable; UCHAR SerNumEnable;
UCHAR USBVersionEnable;
WORD USBVersion; |
// не ноль - микросхема версии 4, ноль - другая версия // не ноль, если приемник изохронный // не ноль, если передатчик изохронный // не ноль, если разрешена привязка к земле // не ноль, если микросхеме разрешено использовать //серийный номер // не ноль, если микросхеме разрешено использовать //код версии USB //код версии USB. 0х0200 - USB 2.0 |
} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA; |
Здесь следует отметить, что микросхемы FTDI могут работать и без внешней EEPROM. При этом микросхема, формируя USB-протокол, подставляет в USB-кадр конфигурационные данные по умолчанию. Их значения приведены в приложении документа "D2XX Programmer Guide". При этом сохраняется возможность подключать к шине множество устройств FTDI, несмотря на то, что без внешней EEPROM все они будут иметь совершенно одинаковые дескрипторы. Операционная система в этом случае будет различать устройства по номеру используемого USB-разъема. Конечно, в такой системе нельзя будет безболезненно менять конфигурацию дерева подключенных USB-устройств.
При использовании внешней EEPROM и назначении своих собственных идентификаторов следует иметь ввиду, что драйверы FTDI в том виде, как они предоставлены на сайте производителя, могут работать только с устройствами, имеющими стандартные идентификаторы FTDI (VID=0x0403 и PID=0x6001 или 0x6006). Вместе с тем разработчик USB-устройства имеет возможность задавать собственные строковые идентификаторы производителя, устройства и строковый серийный номер устройства для того, чтобы его конечное приложение могло использовать эти индивидуальные строковые идентификаторы для отображения информации о подключенном USB-устройстве. Кроме того, компания FTDI выдает и бесплатно регистрирует индивидуальные PID-идентификаторы. При этом необходимо помнить, что USB-устройство с индивидуальным PID-идентификатором должно комплектоваться скорректированными драйверами, настроенными на работу с данным идентификатором.
Оставшиеся три функции для работы с внешней EEPROM позволяют работать с областью пользовательских данных. В зависимости от длины строковых идентификаторов область пользовательских данных может иметь различные размеры. Поэтому имеется функция "FT_EE_UASize", которая позволяет определить размер пользовательской области. Следует также иметь в виду, что при перезаписи области настроек USB все данные из пользовательской области стираются.
Примером работы с внешней EEPROM служит утилита "EditEEPROM" (рис. 1). Она позволяет считывать и записывать USB-идентификаторы, находящиеся в EEPROM, а так же работать с User Area.
 Рис. 1
Функции поддержки новых режимов позволяют программировать интервал ожидания ("time-out") приемного буфера перед его заполнением новыми данными, а также дают возможность организовать обмен данными в режиме "Bit Bang". Если в обычном режиме 8 линий данных микросхемы FT245BM образуют двунаправленную шину и в отсутствии сигналов RD и WR находятся в высокоимпедансном состоянии, то в режиме "BitBang" линии данных функционируют аналогично порту микроконтроллера. Каждую линию данных можно сконфигурировать на ввод или на вывод. Данные, принятые по USB будут сразу же устанавливаться на выходных линиях, а состояния входных выводов может быть считано через USB в компьютер. Режим "Bit Bang" может использоваться, например, для конфигурирования микросхем программируемой логики через канал USB, или для ввода/вывода через USB цифровых логических сигналов без использования дополнительного микроконтроллера.
Функции FT-Win32 API являются альтернативой классическим функциям. Они эмулируют стандартные вызовы Win32 API для работы с последовательным каналом и позволяют быстро адаптировать уже готовое приложение, использующее эти вызовы, для работы с микросхемами FTDI.
Внимание! Группа классических функций и группа "FT-Win32 API" являются альтернативными друг другу. Разработчикам следует выбрать одну из них для работы и не смешивать функции в одной программе.
|