BitBang. Технология BitBang для чипов FTDI означает управление ножками чипа через соединение USB. На компьютере запускается программа, которая с помощью вызовов функций из фирменной DLL FTDI может управлять логическими уровнями выводов микросхемы FTDI, и может читать логический уровень на этих выводах. Таким образом, ножки чипа FTDI работают как порты ввода/вывода микроконтроллера GPIO, но управляются они не из firmware микроконтроллера, а программой, работающей на компьютере.
Программное обеспечение, поддерживающее BitBang, называется D2XX Direct Drivers [1] и туда относится библиотека DLL (FTD2XX.DLL), которую должно загрузить приложение, чтобы впоследствии вызывать функции BitBang (FT_SetBitMode, FT_GetBitMode). На сайте FTDI есть примеры кода для C++ Builder, C#, Delphi, LabVIEW, Visual Basic, Visual C++ и других платформ [2]. Далее приведен перевод даташита FTDI "D2XX Programmer's Guide" [1].
D2XX. Интерфейс D2XX является проприетарной (закрытой) разработкой компании FTDI, специально предназначенной для программного интерфейса с чипами этой компании. Использует драйверы D2XX и FTD2XX.DLL.
VCP. Virtual COM Port - виртуальный последовательный порт (COM-порт), который получается в операционной системе Windows, когда к ней подключается устройство класса USB CDC. Чипы компании FTDI часто работают именно как устройства USB CDC.
CDM. Эта аббревиатура расшифровывается как Combined Driver Model. Пакет драйверов Windows, в котором сосредоточены и драйверы D2XX, и драйверы VCP.
CDM v2.12.00 WHQL Certified.exe универсальный, единый пакет драйверов VCP и D2XX для всех операционных систем семейства Windows, 32-битных и 64 битных (за исключением Windows RT и Windows CE)
FTD2XX_NET_v1.0.14.zip FTD2XX_NET.dll, так называемая managed wrapper DLL, и XML-файл для Intellisense документации в среде Visual Studio
Компания FTDI предоставляет 2 альтернативных программных интерфейса для своих микросхем USB-UART и USB-FIFO. Один интерфейс предоставляет Virtual COM Port (VCP), который система Windows видит как обычный COM-порт. Второй интерфейс, D2XX, предоставляется через проприетарную DLL (FTD2XX.DLL). Интерфейс D2XX дает доступ к специальным функциям, которые не доступны в стандартном API COM-порта операционной системы, таким как установка устройства FTDI в разные режимы или запись данных в память EEPROM устройства.
В случае драйверов FTDI для Windows, оба драйвера D2XX и VCP распространяются в одном инсталляционном пакете (см. ссылки [1]), так называемом Combined Driver Model (CDM) package (на момент написания перевода это был универсальный инсталлятор CDM v2.12.00 WHQL Certified.exe). На рис. 2.1 показана Windows CDM Driver Architecture (архитектура драйвера Windows CDM).
Рис. 2.1. Windows CDM Driver Architecture.
Для Linux, Mac OS X (10.4 и более свежих) и Windows CE (4.2 и более свежих) драйверы D2XX и VCP являются взаимоисключающими опциями, т. е. только один тип драйвера может быть установлен в одно и то же время для имеющегося идентификатора устройства USB (device ID). В случае системы Windows, на которой работает драйвер CDM, приложения могут использовать либо D2XX, либо VCP интерфейс без необходимости установки другого драйвера, но все-таки нельзя использовать оба интерфейса одновременно.
Поскольку интерфейс драйвера VCP разработан для эмулирования стандартного COM-порта, то FTDI не предоставляет специальную документацию, где описано, как осуществлять обмен между драйвером VCP и приложением; разработчик может пользоваться большим количеством имеющегося справочного материала и готового кода по теме последовательного обмена данными.
В этом документе специально рассматривается проприетарный интерфейс D2XX для устройств компании FTDI. Описаны функции библиотеки FTD2XX которые разработчик может использовать в своих приложениях.
[3. Классические функции D2XX]
Функции, описанные в этой секции, совместимы со всеми устройствами FTDI.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие).
Команда подключает пользовательскую комбинацию VID и PID к внутренней таблице устройства. Это позволяет драйверу работать через указанную комбинацию идентификаторов VID и PID.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
По умолчанию драйвер будет поддерживать ограниченный набор VID и PID, соответствующих устройствам (только VID 0x0403 с PID-ами 0x6001, 0x6010, 0x6006). Чтобы использовать драйвер с другими комбинациями VID и PID, предварительно должна быть использована функция FT_SetVIDPID, и только после этого можно использовать такие функции как FT_ListDevices, FT_Open, FT_OpenEx или FT_CreateDeviceInfoList.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Эта функция строит список информации об устройствах, и возвращает количество устройств D2XX, подключенных к системе. В списке содержится информация о не открытых устройствах (которые пока не используются программно) и об открытых устройствах (с которыми программно ведется взаимодействие).
lpdwNumDevs указатель на число типа unsigned long, куда будет сохранено количество подключенных устройств.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Приложение может использовать эту функцию для получения количества устройств, подключенных к системе. Функция выделяет место для информационного списка устройств, который потом можно опросить с использованием FT_GetDeviceInfoList или FT_GetDeviceInfoDetailFT_GetDeviceInfoDetail.
Если в системе были изменения, связанные с подключениями устройств, то информационный список устройств не изменится, пока функция FT_CreateDeviceInfoList не будет вызвана заново. Пример:
FT_STATUS ftStatus;
DWORD numDevs;
// Создание device information list:
ftStatus = FT_CreateDeviceInfoList(&numDevs);
if (ftStatus == FT_OK)
{
printf("Количество устройств %d\n", numDevs);
}
*pDest указатель на массив структур FT_DEVICE_LIST_INFO_NODE. lpdwNumDevs указатель на количество элементов в массиве.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция должна быть вызвана только после вызова FT_CreateDeviceInfoList. Если в подключениях устройств со стороны системы были изменения, то они не отразятся в списке device info list, пока функция FT_CreateDeviceInfoList не будет вызвана заново.
Информация Location ID для устройств не будет возвращена для устройств, которые были открыты в момент вызова FT_CreateDeviceInfoList.
Информация не будет доступна для устройств, которые открыты в других процессах. В этом случае параметр Flags в структуре FT_DEVICE_LIST_INFO_NODE покажет, что устройство открыто, но в других полях информация не появится.
Значение флагов представлено 4-байтной картой бит, содержащей различные данные, как это определено в приложении Appendix A – Type Definitions. Бит 0 (самый младший) этого числа показывает, что порт открыт (open, 1) или закрыт (closed, 0). Бит 1 показывает, как устройство прошло энумерацию - как high-speed USB device (1) или full-speed USB device (0). Остальные биты (2 - 31) зарезервированы для будущего использования.
Массив FT_DEVICE_LIST_INFO_NODES содержит все доступные данные по каждому устройству в системе. Структура FT_DEVICE_LIST_INFO_NODES приведена в приложении. Место в памяти для списка должно быть выделено приложением. Для этой цели может быть использовано количество устройств, возвращенное функцией FT_CreateDeviceInfoList.
Когда программирование осуществляется в Visual Basic, LabVIEW или подобных языках, может потребоваться FT_GetDeviceInfoDetail вместо этой функции.
Обратите внимание, что Linux, Mac OS X и Windows CE не поддерживают идентификаторы размещения (location ID). Поэтому для этих систем параметр Location ID в структуре будет пуст.
dwIndex индекс записи в списке device info list. lpdwFlags указатель на unsigned long, куда будет сохранено значение флагов. lpdwType указатель на unsigned long для сохранения типа устройства. lpdwID указатель на unsigned long для сохранения device ID. lpdwLocId указатель на unsigned long для сохранения device location ID. pcSerialNumber указатель на буфер для сохранения серийного номера устройства как ASCIIZ строки (null-terminated string, строка оканчивающаяся нулем). pcDescription указатель на буфер для сохранения описания устройства как ASCIIZ строки (null-terminated string, строка оканчивающаяся нулем). *ftHandle указатель на переменную типа FT_HANDLE, куда будет сохранен хендл.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция должна быть вызвана только после вызова FT_CreateDeviceInfoList. Если в подключениях устройств со стороны системы были изменения, то они не отразятся в списке device info list, пока функция FT_CreateDeviceInfoList не будет вызвана заново.
Значение переменной индекса начинается с 0.
Значение флагов представлено 4-байтной картой бит, содержащей различные данные, как это определено в приложении Appendix A – Type Definitions. Бит 0 (самый младший) этого числа показывает, что порт открыт (open, 1) или закрыт (closed, 0). Бит 1 показывает, как устройство прошло энумерацию - как high-speed USB device (1) или full-speed USB device (0). Остальные биты (2 - 31) зарезервированы для будущего использования.
Информация Location ID для устройств не будет возвращена для устройств, которые были открыты в момент вызова FT_CreateDeviceInfoList.
Информация не будет доступна для устройств, которые открыты в других процессах. В этом случае параметр Flags в структуре FT_DEVICE_LIST_INFO_NODE покажет, что устройство открыто, но в других полях информация не появится.
Для возврата всего списка информации об устройства как массива структур FT_DEVICE_LIST_INFO_NODE используйте FT_CreateDeviceInfoList.
Обратите внимание, что Linux, Mac OS X и Windows CE не поддерживают идентификаторы размещения (location ID). Поэтому для этих систем параметр Location ID в структуре будет пуст.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Получает информацию об устройствах, подключенных к системе в настоящий момент. Функция может вернуть такую информацию, как количество подключенных устройств, серийный номер устройства и строки описания устройства, и идентификаторы location ID для подключенных устройств.
pvArg1 значение зависит от dwFlags. pvArg2 значение зависит от dwFlags. dwFlags определяет формат возвращенной информации.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция может использоваться разными способами для получения информации различного типа. Более продвинутый способ, чем эта функция - использовать FT_CreateDeviceInfoList, FT_GetDeviceInfoList и FT_GetDeviceInfoDetail, потому что они возвращают больше информации об устройствах.
В этой упрощенной форме функция может быть использована для получения количества подключенных в настоящее время устройств. Если в dwFlags установлен бит FT_LIST_NUMBER_ONLY, то параметр pvArg1 интерпретируется как указатель на переменную DWORD для сохранения количества подключенных в настоящее время устройств.
Функция может быть использована для возврата информации об устройстве: если в dwFlags установлен флаг FT_OPEN_BY_SERIAL_NUMBER, то будет возвращена строка серийного номера; если в dwFlags установлен бит FT_OPEN_BY_DESCRIPTION, то будет возвращена строка описания продукта; если в dwFlags установлен бит FT_OPEN_BY_LOCATION, то будет возвращен Location ID; если не установлен ни один из этих битов, то по умолчанию будет возвращена строка серийного номера.
Функция может использоваться для возврата строки описания одного устройства. Если в dwFlags установлены биты FT_LIST_BY_INDEX и FT_OPEN_BY_SERIAL_NUMBER или FT_OPEN_BY_DESCRIPTION, то параметр pvArg1 интерпретируется как индекс устройства, и параметр pvArg2 интерпретируется как указатель на буфер, который должен принять соответствующую строку. Используются индексы по базе 0, и для недопустимого индекса будет возвращен код ошибки FT_DEVICE_NOT_FOUND.
Функция может использоваться для возврата строки описания всех подключенных устройств. Если в dwFlags установлены биты FT_LIST_ALL и FT_OPEN_BY_SERIAL_NUMBER или FT_OPEN_BY_DESCRIPTION, то параметр pvArg1 интерпретируется как указатель на массив указателей на буферы, куда должны быть помещены соответствующие строки, и параметр pvArg2 интерпретируется как указатель на DWORD, куда будет сохранено количество подключенных в настоящее время устройств. Имейте в виду для pvArg1, что последняя запись в массиве указателей на буферы должна содержать NULL-указатель, так что в массиве может быть больше записей, чем количество подключенных устройств.
Будет возвращен location ID устройства, если в dwFlags установлены биты FT_LIST_BY_INDEX и FT_OPEN_BY_LOCATION. В этом случае параметр pvArg1 интерпретируется как индекс устройства, и параметр pvArg2 интерпретируется как указатель на переменную типа long, куда должно быть помещено значение location ID. Используются индексы по базе 0, и для недопустимого индекса будет возвращен код ошибки FT_DEVICE_NOT_FOUND. Имейте в виду, что Windows CE и Linux не поддерживают идентификаторы location ID.
Идентификаторы location ID всех подключенных устройств могут быть возвращены, если в dwFlags установлены биты FT_LIST_ALL и FT_OPEN_BY_LOCATION. В этом случае pvArg1 интерпретируется как указатель на массив переменных типа long, куда должны быть сохранены идентификаторы location ID, и параметр pvArg2 интерпретируется как указатель на DWORD, куда будет сохранено количество подключенных в настоящее время устройств.
Пример 1. Получение количества подключенных устройств.
if (ftStatus == FT_OK)
{
// FT_ListDevices OK, в Buffer находится серийный номер
}
else
{
// функция FT_ListDevices завершилась с ошибкой
}
Помните, что индексы базируются на нуле. Если подключено больше одного устройства, то инкремент devIndex приведет к получению серийного номера следующего устройства, и т. д.
Пример 3. Получение описаний всех подключенных устройств.
FT_STATUS ftStatus;
DWORD numDevs;
char*BufPtrs[3]; // указатель на массив из 3 указателей
char Buffer1[64]; // буфер для описания первого устройства
char Buffer3[64]; // буфер для описания второго устройства
// Инициализация массива указателей:
BufPtrs[0] = Buffer1;
BufPtrs[1] = Buffer2;
BufPtrs[2] =NULL; // последняя запись в массиве должна быть NULL
if (ftStatus == FT_OK)
{
// FT_ListDevices OK, описание устройств находятся в буферах Buffer1 и Buffer2,// и numDevs содержит количество подключенных устройств
}
else
{
// функция FT_ListDevices завершилась с ошибкой
}
Этот пример подразумевает, что к системе подключено 2 устройства. Если на самом деле устройств больше, то размер массива указателей должен быть увеличен, и должно быть создано большее количество буферов для строк.
Пример 4. Получение размещений (location) всех подключенных устройств.
if (ftStatus == FT_OK)
{
// FT_ListDevices OK, идентификаторы location ID находятся в locIdBuf,// и в numDevs содержится количество подключенных устройств.
}
else
{
// функция FT_ListDevices завершилась с ошибкой
}
Этот пример подразумевает, что к системе подключено не более 16 устройств. Если на самом деле устройств больше, то размер массива должен быть увеличен.
iDevice индекс по базе 0 для открываемого устройства. ftHandle указатель на переменную типа FT_HANDLE, куда будет сохранен хендл. Этот хендл должен использоваться для доступа к устройству.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Хотя эта функция может быть использована для открытия нескольких устройств путем установки iDevice в 0, 1, 2 и т. д., у неё нет возможности открыть специфическое устройство. Чтобы открыть именованные устройства, используйте функцию FT_OpenEx.
Пример:
FT_HANDLE ftHandle;
FT_STATUS ftStatus;
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus == FT_OK)
{
// FT_Open OK, используйте ftHandle для работы с устройством
}
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Открывает указанное устройство и возвращает хендл к нему, который будет использоваться для последующего доступа к устройству. Устройство может быть указано по серийному номеру, по описанию или по размещению (location).
Эта функция может также использоваться для того, чтобы открыть несколько устройств одновременно. Несколько устройств может быть указано по серийному номеру, описанию устройства или location ID (информация размещения, полученная от физического места подключения устройства на шине USB). Идентификаторы Location ID для специфических портов USB может быть получена утилитой USBView и дана в шестнадцатеричном формате. Идентификаторы Location ID для устройств, подключенных к системе, могут быть получены вызовом FT_GetDeviceInfoList или FT_ListDevices с соответствующими флагами.
pvArg1 указатель на аргумент, тип которого зависит от значения dwFlags. Обычно он интерпретируется как указатель на ASCIIZ-строку. dwFlags FT_OPEN_BY_SERIAL_NUMBER, FT_OPEN_BY_DESCRIPTION или FT_OPEN_BY_LOCATION. ftHandle указатель на переменную типа FT_HANDLE, куда будет сохранен хендл. Этот хендл должен использоваться для доступа к устройству.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Параметр в pvArg1 зависит от dwFlags: если dwFlags FT_OPEN_BY_SERIAL_NUMBER, то pvArg1 интерпретируется как указатель на null-terminated строку, представляющую серийный номер устройства; если dwFlags FT_OPEN_BY_DESCRIPTION, то pvArg1 интерпретируется как указатель на null-terminated строку, представляющую описание устройства; если dwFlags FT_OPEN_BY_LOCATION, то pvArg1 интерпретируется как значение long, которое содержит location ID устройства. Имейте в виду, что Windows CE и Linux не поддерживают идентификаторы location ID.
Пример 1. Открыть устройство с серийным номером "FT000001".
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Закрывает открытое устройство по указанному хендлу.
FT_STATUS FT_Close (FT_HANDLE ftHandle);
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Пример:
FT_HANDLE ftHandle;
FT_STATUS ftStatus;
ftStatus = FT_Open(0, &ftHandle);
if (ftStatus == FT_OK)
{
// FT_Open OK, используйте ftHandle для доступа к устройству
...
// когда закончите, то вызовите FT_Close:
FT_Close(ftHandle);
}
ftHandle хендл устройства. lpBuffer указатель на буфер, который примет данные от устройства. dwBytesToRead количество байт, которые нужно прочитать из устройства. lpdwBytesReturned указатель на переменную типа DWORD, которая примет количество байт, прочитанных из устройства.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код FT_IO_ERROR.
FT_Read всегда вернет в lpdwBytesReturned количество прочитанных байт.
Эта функция не завершит управление, пока не будет прочитано в буфер количество dwBytesToRead байт. Количество байт в очереди приема может быть получено вызовом FT_GetStatus или FT_GetQueueStatus, и передано функции FT_Read как параметр dwBytesToRead, чтобы функция прочитала данные и сделала возврат немедленно.
Когда предыдущим вызовом FT_SetTimeouts был указан таймаут, FT_Read возвратит управление, когда истечет таймаут, или когда будет прочитано dwBytesToRead байт - в любом из этих двух случаев, который произойдет быстрее. Если произошел таймаут, то FT_Read прочитает доступные данные в буфер и вернет FT_OK.
Приложение должно использовать значение возврата функции и значение lpdwBytesReturned, когда обрабатывается буфер. Если возвращенное значение FT_OK, и lpdwBytesReturned равна dwBytesToRead, то FT_Read была нормально завершена до истечения таймаута. Если возвращаемое значение FT_OK, и lpdwBytesReturned меньше dwBytesToRead, то был таймаут, и чтение было выполнено только частично. Имейте в виду, что если произошел таймаут, и не были прочитаны данные, то возвращенное значение все равно будет FT_OK.
Возвращаемое значение FT_IO_ERROR говорит об ошибке в параметрах функции, или о фатальной ошибке наподобие отключения устройства от USB.
Пример 1. Как прочитать все доступные в настоящий момент данные.
ftHandle хендл устройства. lpBuffer указатель на буфер, который содержит данные для записи в устройство. dwBytesToRead количество байт, которые нужно записать в устройство. lpdwBytesReturned указатель на переменную типа DWORD, которая примет количество байт, записанных в устройство.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция больше не нужна, потому что FT_SetBaudRate сама автоматически вычислит требуемый делитель для запрошенного параметра скорости. В апноуте "Setting baud rates for the FT8U232AM" (доступен в разделе Application сайта компании FTDI) описано, как вычислять делитель для нестандартных скоростей обмена.
ftHandle хендл устройства. uWordLength количество бит на слово (фрейм) - тут должно быть значение FT_BITS_8 или FT_BITS_7. uStopBits количество стоп-бит - должно быть FT_STOP_BITS_1 или FT_STOP_BITS_2. uParity четность - должно быть FT_PARITY_NONE, FT_PARITY_ODD, FT_PARITY_EVEN, FT_PARITY_MARK или FT_PARITY SPACE.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
ftHandle хендл устройства. usFlowControl должен быть одним из значений FT_FLOW_NONE, FT_FLOW_RTS_CTS, FT_FLOW_DTR_DSR или FT_FLOW_XON_XOFF. uXon символ, используемый как сигнал Xon. Используется только для варианта FT_FLOW_XON_XOFF. uXoff символ, используемый как сигнал Xoff. Используется только для варианта FT_FLOW_XON_XOFF.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Пример:
FT_HANDLE ftHandle;
FT_STATUS ftStatus;
ftStatus = FT_Open(0, &ftHandle);
if(ftStatus != FT_OK)
{
// ошибка FT_Openreturn;
}// Устанавливает тип управления потоком RTS/CTS:
ftStatus = FT_SetFlowControl(ftHandle, FT_FLOW_RTS_CTS, 0x11, 0x13);
if (ftStatus == FT_OK)
{
// FT_SetFlowControl OK
}
ftHandle хендл устройства. lpdwModemStatus указатель на переменную типа DWORD, в которую будут записаны состояние модема и линии устройства.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Младший байт lpdwModemStatus содержит состояние модема. На Windows и Windows CE, состояние линии содержится в следующем за самым младшим по старшинству байте lpdwModemStatus.
Состояние модема описывается набором флагов, определяемых по маскам: Clear To Send (CTS) = 0x10, Data Set Ready (DSR) = 0x20, Ring Indicator (RI) = 0x40, Data Carrier Detect (DCD) = 0x80.
Состояние линии описывается набором флагов, определяемых по маскам: Overrun Error (OE) = 0x02, Parity Error (PE) = 0x04, Framing Error (FE) = 0x08, Break Interrupt (BI) = 0x10.
if (ftStatus == FT_OK)
{
// FT_GetModemStatus OK// Состояние линии находится во втором байте dwModemStatus:
dwLineStatus = ((dwModemStatus >>8) &0x000000FF);
// Теперь маской выделим байт состояния модема:
dwModemStatus = (dwModemStatus &0x000000FF);
}
ftHandle хендл устройства. pftType указатель на unsigned long для сохранения типа устройства. lpdwID указатель на unsigned long для сохранения device ID. pcSerialNumber указатель на буфер, куда будет записан серийный номер устройства как null-terminated string. pcDescription указатель на буфер, куда будет записано описание устройства как null-terminated string. pvDummy зарезервировано для будущего использования - сюда нужно записать NULL.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция используется для возврата типа устройства, идентификатора устройства (device ID), описателя устройства и серийного номера. Идентификатор device ID закодирован в DWORD - старшая половина двойного слова (старшее слово, 2 байта) содержит vendor ID (идентификатор производителя, VID), младшая половина двойного слова (младшее слово, 2 байта) содержит product ID (идентификатор продукта, PID). Таким образом, возвращенный ID 0x04036001 соответствует device ID VID_0403&PID_6001.
ftHandle хендл устройства. lpdwDriverVersion указатель на номер версии драйвера.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Номер версии (unsigned long, 4 байта) содержит в себе части major, minor и build. Байт 0 (самый младший) содержит версию сборки (build version), байт 1 содержит minor version, и байт 2 содержит major version. Байт 3 в настоящий момент установлен в 0.
Например, версия драйвера "2.04.06" представлена как 0x00020406. Имейте в виду, что устройство должно быть открыто перед вызовом этой функции.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Номер версии (unsigned long, 4 байта) содержит в себе части major, minor и build. Байт 0 (самый младший) содержит версию сборки (build version), байт 1 содержит minor version, и байт 2 содержит major version. Байт 3 в настоящий момент установлен в 0.
Например, версия D2XX DLL "3.01.15" представлена как 0x00030115. Обратите внимание, что в параметрах функции нет хендла, так что не обязательно открывать устройство перед вызовом этой функции.
Пример:
FT_STATUS ftStatus;
DWORD dwLibraryVer;
// Получение версии DLL:
ftStatus = FT_GetLibraryVersion(&dwLibraryVer);
if (ftStatus == FT_OK)
printf("Версия библиотеки = 0x%x\n",dwLibraryVer);
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Получает состояние устройства, включая количество символов в очереди приема, количество символов в очереди передачи, и текущее состояние событий (event status).
ftHandle хендл устройства. lpdwAmountInRxQueue указатель на переменную типа DWORD, которая примет количество символов в очереди приема. lpdwAmountInTxQueue указатель на переменную типа DWORD, которая примет количество символов в очереди передачи. lpdwEventStatus указатель на переменную типа DWORD, которая примет текущее состояние событий (event status).
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Пример, как использовать эту функцию, см. в описании функции FT_SetEventNotification.
ftHandle хендл устройства. dwEventMask условия, которые приведут к установке события. pvArg интерпретируется как обработчик события.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Приложение может использовать эту функцию для настройки условий, которые позволяют заблокировать поток, пока не наступит одно из условий. Обычно приложение создает событие, вызывает эту функцию, в результате чего поток блокируется. Когда условие срабатывает, устанавливается событие, и поток приложения разблокируется.
dwEventMask является набором битов, заданных маской, которые описывают события, интересующие приложение. pvArg интерпретируется как обработчик события, который создается приложением. Если срабатывает одно из заданных условий, то устанавливается событие.
Если в dwEventMask установлен бит FT_EVENT_RXCHAR, то событие будет установлено, когда устройство примет символ.
Если в dwEventMask установлен бит FT_EVENT_MODEM_STATUS, то событие будет установлено, когда устройство обнаружит изменение сигналов модема.
Если в dwEventMask установлен бит FT_EVENT_LINE_STATUS, то событие будет установлено, когда устройство обнаружит изменение сигналов состояния линии.
Пример 1. Этот пример допустим для Windows и Windows CE, и он покажет, как ждать события приема символа или изменения состояния модема.
// Сначала нужно создать событие и вызвать FT_SetEventNotification.
FT_HANDLE ftHandle; // хендл для открытого устройства
FT_STATUS ftStatus;
HANDLE hEvent;
DWORD EventMask;
ftHandle хендл устройства. uEventCh символ события (event character). uEventChEn 0 если event character запрещен, иначе не ноль. uErrorCh символ ошибки (error character). uErrorChEn 0 если error character запрещен, иначе не ноль.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция позволяет вставлять указанные символы в поток данных, чтобы сообщать о событиях или ошибках.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция используется для попытки восстановления порта после ошибки. Она не эквивалентна событию отключения-переподключения (unplug-replug event). В качестве эквивалента unplug-replug event используйте FT_CyclePort.
Пример:
FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эффект от этой функции такой же, как от отключения и повторного подключения устройства в порту USB. Можно использовать эту функцию в случае фатальной ошибки, когда сложно, или невозможно, восстановить работоспособность без отключения и переподключения кабеля USB. Эта функция может также использоваться после перепрограммирования EEPROM, чтобы заставить устройство FTDI прочитать новые настройки из EEPROM, что иначе потребовало бы физического отключения/переподключения.
Так как текущая сессия не восстанавливается, когда драйвер устройства перезагружается, то приложение должно уметь восстанавливать нормальную работу после вызова этой функции. Приложение должно закрыть текущий хендл после успешного вызова FT_CyclePort.
Функция FT_CyclePort применима для устройств FT4232H, FT2232H и FT2232, и будет работать только на Windows XP и более свежих версиях.
Пример:
FT_HANDLE ftHandle; // рабочий хендл, полученный вызовом FT_OpenEx
FT_STATUS ftStatus;
ftStatus = FT_CyclePort(ftHandle);
if (ftStatus == FT_OK)
{
// Успешно выполнена команда cycle.// Закрыть хендл, потому что он больше недействителен:
ftStatus = FT_Close(ftHandle);
}
Эта функция может быть полезной при попытке программно восстановить работу с устройством.
FT_STATUS FT_Rescan (void);
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Вызов FT_Rescan эквивалентен выбору "Scan for hardware changes" (сканировать в поиске изменений в аппаратуре) в Device Manager (Менеджер Устройств). Для новых устройств проверяется только аппаратура USB. Будут просканированы все устройства USB, не только FTDI.
Функция принудительно перезагрузит драйвер для устройств с указанными VID и PID.
FT_STATUS FT_Reload (WORD wVID, WORD wPID);
Параметры:
wVID Vendor ID устройств. wPID Product ID устройств.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Вызов FT_Reload принуждает операционную систему выгрузить и повторно загрузить драйвер для устройств с указанными идентификаторами. Если параметры VID и PID равны null, то будут перезагружены драйверы для корневых хабов USB (USB root hub), это приведет к тому, что у всех устройств будут перезагружены их драйверы. Имейте в виду, что эта функция не будет корректно работать на 64-битной Windows, когда вызов функции происходит из 32-битного приложения.
Пример 1. Здесь показано, как вызвать FT_Reload, чтобы перезагрузить драйвер для стандартного устройства FT232R (VID 0x0403, PID 0x6001).
FT_STATUS ftstatus;
WORD wVID =0x0403;
WORD wPID =0x6001;
ftHandle хендл устройства. dwCount число unsigned long, содержащее значение для ResetPipeRetryCount.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
ResetPipeRetryCount управляет максимальным количеством попыток драйвера сбросить канал (pipe), на котором произошла ошибка. По умолчанию значение ResetPipeRequestRetryCount равно 50. В условиях повышенного уровня помех может понадобиться увеличить это значение, когда происходит много ошибок USB.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Останавливает задачу IN драйвера.
FT_STATUS FT_StopInTask (FT_HANDLE ftHandle);
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция используется для перевода задачи драйвера IN (чтение, read) в состояние ожидания (wait state). Может использоваться в ситуациях, когда постоянно происходит прием данных, чтобы можно было очистить устройство без приема большего количества данных. Функция используется совместно с FT_RestartInTask, которая снова активирует задачу IN.
ftHandle хендл устройства. dwDeadmanTimeout значение таймаута deadman в миллисекундах. Значение по умолчанию 5000.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Таймаут deadman относится к продвинутым опциям драйвера (Advanced Driver Options), описанным в апноуте AN232B-10, который можно найти на сайте компании FTDI. Это так называемый таймаут USB. Маловероятно, что эта функция понадобится большинству пользователей.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Очищает содержимое EEPROM устройства.
FT_STATUS FT_EraseEE (FT_HANDLE ftHandle);
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция полностью очищает содержимое EEPROM, включая область данных пользователя. Имейте в виду, что устройства FT232R и FT245R содержат в себе встроенную память EEPROM, которая не может быть очищена.
ftHandle хендл устройства. pData указатель на структуру типа FT_PROGRAM_DATA.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Функция интерпретирует параметр pData как указатель на структуру типа FT_PROGRAM_DATA, которая предназначена для приема данных из EEPROM.
Функция не производит никакие проверки на размеры буферов, так что буферы, переданные в структуре FT_PROGRAM_DATA, должны быть достаточного размера, чтобы разместить ожидаемые строки (включая завершающие null-терминаторы). Размеры, показанные в следующем примере, более чем адекватные, и могут быть уменьшены, если это необходимо. Ограничение состоит в том, что длина строки описания производителя (Manufacturer string) плюс длина строки описания (Description string) меньше или равна 40 символам.
Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.
ftHandle хендл устройства. pData указатель на структуру типа FT_PROGRAM_DATA. *Manufacturer указатель на null-terminated строку, которая содержит имя производителя. *ManufacturerId указатель на null-terminated строку, которая содержит идентификатор производителя. *Description указатель на null-terminated строку, которая содержит описание устройства. *SerialNumber указатель на null-terminated строку, которая содержит серийный номер устройства.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта версия стандартной функции FT_EE_Read была добавлена для поддержки таких языков, как LabVIEW, где есть проблемы с указателями на строки, которые содержатся в структуре.
Эта функция интерпретирует параметр pData как указатель на структуру FT_PROGRAM_DATA, где есть место для данных, которые будут прочитаны из EEPROM.
Функция не выполняет никакие проверки на размеры буферов, поэтому буферы, переданные через поля структуры FT_PROGRAM_DATA должны быть достаточно велики, чтобы разместить в себе ожидаемые строки (включая их null-терминаторы).
Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.
Строковые параметры в структуре FT_PROGRAM_DATA должны быть переданы как DWORD, чтобы избежать пересечение параметров. Все указатели строк передаются отдельно от структуры FT_PROGRAM_DATA.
ftHandle хендл устройства. pData указатель на структуру типа FT_PROGRAM_DATA.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция интерпретирует параметр pData как указатель на структуру FT_PROGRAM_DATA, где содержаться данные, которые должны быть записаны в EEPROM. Данные записываются в EEPROM, затем вычитываются и проверяются.
Если поле SerialNumber в FT_PROGRAM_DATA равно NULL, или SerialNumber указывает на NULL-строку, то будет сгенерирован серийный номер на основе ManufacturerId и текущих даты/времени. Длина строки Manufacturer плюс длина строки Description должна быть меньше или равна 40 символам.
Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.
Если pData равен NULL, то по умолчанию версия структуры будет 0 (как в оригинальной серии BM) и устройство будет запрограммировано данными по умолчанию.
В примере ниже показано, как программировать EEPROM устройства FT232B. Остальные параметры должны быть установлены для других типов устройств.
// Структура версии 4 для программирования устройства серии BM.
// Другие поля структуры должны содержать ненулевые значения для устройств FT2232, FT232R,
// FT245R, FT2232H или FT4232H.
FT_PROGRAM_DATA ftData =
{
0x00000000, // заголовок - тут должно быть значение 0x00000000 0xFFFFFFFF, // заголовок - тут должно быть значение 0xffffffff 0x00000004, // заголовок - тут должна быть версия FT_PROGRAM_DATA0x0403, // VID 0x6001, // PID "FTDI", // строка имени производителя (Manufacturer)"FT", // идентификатор производителя (Manufacturer ID)"USB HS Serial Converter", // строка описания (Description)"FT000001", // серийный номер44, // максимальная потребляемая мощьность от шины (MaxPower)1, // PnP 0, // если не 0, то устройство имеет свой источник питания (SelfPowered)1, // есть ли функция удаленного пробуждения (RemoteWakeup)1, // не 0, если чип Rev4, иначе 00, // не 0, если in endpoint изохронная0, // не 0, если out endpoint изохронная0, // не 0, если разрешен pull down1, // не 0, если используется серийный номер0, // не 0, если чип использует USBVersion 0x0110// BCD (0x0200 => USB2)//// Расширения для FT2232C (разрешены, если Version = 1 или больше)//0, // не 0, если чип Rev5, иначе 00, // не 0, если in endpoint изохронная 0, // не 0, если in endpoint изохронная 0, // не 0, если out endpoint изохронная 0, // не 0, если out endpoint изохронная 0, // не 0, если pull down разрешен0, // не 0, если используется серийный номер 0, // не 0, если чип использует USBVersion 0x0, // BCD (0x0200 => USB2) 0, // не 0, если интерфейс потребляет большой ток0, // не 0, если интерфейс потребляет большой ток0, // не 0, если интерфейс 245 FIFO 0, // не 0, если интерфейс 245 FIFO CPU target 0, // не 0, если интерфейс Fast serial 0, // не 0, если интерфейс использует драйверы VCP 0, // не 0, если интерфейс 245 FIFO 0, // не 0, если интерфейс 245 FIFO CPU target 0, // не 0, если интерфейс Fast serial 0, // не 0, если интерфейс использует драйверы VCP //// Расширения для FT232R (разрешены, если Version = 2 или больше) //0, // если не 0, то использовать внешний генератор0, // если не 0, то I/O с повышенной нагрузочной способностью0, // размер конечной точки 0, // не 0, если разрешен pull down 0, // не 0, если используется серийный номер 0, // не 0, если инверсный TXD 0, // не 0, если инверсный RXD 0, // не 0, если инверсный RTS 0, // не 0, если инверсный CTS 0, // не 0, если инверсный DTR 0, // не 0, если инверсный DSR0, // не 0, если инверсный DCD 0, // не 0, если инверсный RI 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // не 0, если используются драйверы D2XX//// Расширения Rev 7 (FT2232H, разрешены, если Version = 3 или больше)//0, // не 0, если разрешен pull down 0, // не 0, если используется серийный номер 0, // не 0, если AL выводы имеют малую скорость изменения уровня 0, // не 0, если AL выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если AH выводы имеют малую скорость изменения уровня 0, // не 0, если AH выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если BL выводы имеют малую скорость изменения уровня 0, // не 0, если BL выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если BH выводы имеют малую скорость изменения уровня 0, // не 0, если BH выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если интерфейс 245 FIFO 0, // не 0, если интерфейс 245 FIFO CPU target 0, // не 0, если интерфейс Fast serial 0, // не 0, если интерфейс использует драйверы VCP 0, // не 0, если интерфейс 245 FIFO 0, // не 0, если интерфейс 245 FIFO CPU target0, // не 0, если интерфейс Fast serial 0, // не 0, если интерфейс использует драйверы VCP 0, // не 0, если BCBUS7 используется для экономии энергии в схемах// с собственным питанием (self-powered)//// Расширения Rev 8 (FT4232H, разрешены если Version = 4)// 0, // не 0, если разрешен pull down 0, // не 0, если используется серийный номер 0, // не 0, если AL выводы имеют малую скорость изменения уровня 0, // не 0, если AL выводы работают как входы с триггером Шмитта0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если AH выводы имеют малую скорость изменения уровня 0, // не 0, если AH выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если BL выводы имеют малую скорость изменения уровня 0, // не 0, если BL выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если BH выводы имеют малую скорость изменения уровня 0, // не 0, если BH выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если port A использует RI как RS485 TXDEN 0, // не 0, если port B использует RI как RS485 TXDEN 0, // не 0, если port C использует RI как RS485 TXDEN 0, // не 0, если port D использует RI как RS485 TXDEN 0, // не 0, если интерфейс использует драйверы VCP 0, // не 0, если интерфейс использует драйверы VCP 0, // не 0, если интерфейс использует драйверы VCP 0, // не 0, если интерфейс использует драйверы VCP//// Расширения Rev 9 (FT232H, разрешено если Version = 5)//0, // не 0, если разрешен pull down 0, // не 0, если используется серийный номер 0, // не 0, если AC выводы имеют малую скорость изменения уровня 0, // не 0, если AC выводы работают как входы с триггером Шмитта0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // не 0, если AD выводы имеют малую скорость изменения уровня 0, // не 0, если AD выводы работают как входы с триггером Шмитта 0, // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control))0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // Управление мультиплексором Cbus (управление мультиплексором CBUS (Cbus Mux control)) 0, // не 0, если интерфейс 245 FIFO 0, // не 0, если интерфейс 245 FIFO CPU target 0, // не 0, если интерфейс Fast serial 0, // не 0, если интерфейс FT1248 0, // полярность тактов FT1248 - уровень ожидания тактов (clock idle) высокий (1)// или низкий (0)0, // порядок следования данных FT1248, сначала LSB (1) или MSB (0) 0, // разрешено ли управление потоком (flow control) FT12480, // не 0, если интерфейс использует драйверы VCP0// не 0, если ACBUS7 используется для экономии энергии в схемах// с собственным питанием (self-powered)
FT_HANDLE ftHandle;
ftHandle хендл устройства. pData указатель на структуру типа FT_PROGRAM_DATA. *Manufacturer указатель на null-terminated строку, которая содержит имя производителя. *ManufacturerId указатель на null-terminated строку, которая содержит идентификатор производителя. *Description указатель на null-terminated строку, которая содержит описание устройства. *SerialNumber указатель на null-terminated строку, которая содержит серийный номер устройства.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Это версия функции FT_EE_Program была добавлена для поддержки таких языков, как LabVIEW, где есть проблемы с указателями на строки, которые содержатся в структуре.
Эта функция интерпретирует параметр pData как указатель на структуру FT_PROGRAM_DATA, где находятся данные, которые будут записаны в EEPROM. Данные записываются в EEPROM, затем вычитываются и проверяются.
Строковые параметры в структуре FT_PROGRAM_DATA должны быть переданы как DWORD, чтобы избежать пересечение параметров. Все указатели строк передаются отдельно от структуры FT_PROGRAM_DATA.
Если поле SerialNumber в FT_PROGRAM_DATA равно NULL, или SerialNumber указывает на NULL-строку, то будет сгенерирован серийный номер на основе ManufacturerId и текущих даты/времени. Длина строки Manufacturer плюс длина строки Description должна быть меньше или равна 40 символам.
Имейте в виду, что DLL должна быть информирована о версии используемой структуры FT_PROGRAM_DATA. Это делается через элементы структуры Signature1, Signature2 и Version. Signature1 всегда должна быть равна 0x00000000, Signature2 всегда должна быть равна 0xFFFFFFFF, и Version может быть установлена в ту версию, которая нужна. Для совместимости со всеми текущими устройствами Version должна быть установлена в последнюю версию структуры FT_PROGRAM_DATA, как это задано в заголовочном файле FTD2XX.h.
Если pData равен NULL, то по умолчанию версия структуры будет 0 (как в оригинальной серии BM) и устройство будет запрограммировано данными по умолчанию.
ftHandle хендл устройства. lpdwSize указатель на DWORD, куда будет записан доступный размер области данных пользователя в байтах.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Область данных пользователя в EEPROM устройства FTDI не используется в конфигурации устройства и его дескрипторах. Эта область доступна пользователю для записи туда любой информации, специфичной для его приложения. Размер области данных пользователя зависит от длины строк Manufacturer, ManufacturerId, Description и SerialNumber, запрограммированных в EEPROM.
Пример:
FT_HANDLE ftHandle;
FT_STATUS ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK)
{
// ошибка FT_Open!return;
}
DWORD EEUA_Size;
ftStatus = FT_EE_UASize(ftHandle, &EEUA_Size);
if (ftStatus == FT_OK)
{
// FT_EE_UASize OK// EEUA_Size содержит размер области EEUA в байтах
}
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Читает из EEPROM содержимое области данных пользователя.
FT_STATUS FT_EE_UARead (FT_HANDLE ftHandle,
PUCHAR pucData,
DWORD dwDataLen,
LPDWORD lpdwBytesRead);
Параметры:
ftHandle хендл устройства. pucData указатель на буфер, который содержит место для данных. dwDataLen размер буфера в байтах. lpdwBytesRead указатель на DWORD, куда будет записано количество прочитанных байт.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция интерпретирует параметр pucData как указатель на байтовый массив размером dwDataLen, куда должны попасть прочитанные данные. Действительное количество прочитанных байт будет сохранено в DWORD, на которое указывает lpdwBytesRead.
Если dwDataLen меньше, чем размер области данных пользователя в EEPROM, то dwDataLen байт будет прочитано в буфер. Иначе в буфер будет прочитана вся область данных пользователя. Размер области данных пользователя может быть определен вызовом FT_EE_UASize.
Приложение должно проверить возвращенное функцией значение в переменной lpdwBytesRead, когда произошел возврат из FT_EE_UARead.
Пример:
FT_HANDLE ftHandle;
FT_STATUS ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK)
{
// ошибка FT_Open!return;
}
if (ftStatus == FT_OK)
{
// FT_EE_UARead OK,// данные пользвателя сохранены в буфере Buffer,// количество прочитанных байт из EEUA сохранено в BytesRead
}
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Записывает данные в область пользователя EEPROM.
FT_STATUS FT_EE_UAWrite (FT_HANDLE ftHandle, PUCHAR pucData, DWORD dwDataLen);
Параметры:
ftHandle хендл устройства. pucData указатель на буфер, который содержит записываемые данные. dwDataLen размер буфера в байтах.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция интерпретирует параметр pucData как указатель на байтовый массив размером dwDataLen, который содержит данные для записи в область данных пользователя EEPROM. Если dwDataLen будет больше размера области данных пользователя в EEPROM, то произойдет ошибка программирования данных. Доступный размер области данных пользователя может быть определен вызовом FT_EE_UASize.
Пример:
FT_HANDLE ftHandle;
FT_STATUS ftStatus = FT_Open(0, &ftHandle);
if (ftStatus != FT_OK)
{
// ошибка FT_Open!return;
}
ftHandle хендл устройства. *eepromData указатель на буфер, который предназначен для прочитанных данных. Примечание: эта структура отличается для каждого типа устройства. epromDataSize размер буфера eepromData. *Manufacturer указатель на null-terminated строку, содержащую место для имени производителя. *ManufacturerId указатель на null-terminated строку, содержащую место для идентификатора производителя (manufacturer ID). *Description указатель на null-terminated строку, содержащую место для описания устройства. *SerialNumber указатель на null-terminated строку, содержащую место для серийного номера устройства.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция интерпретирует параметр *eepromDATA как указатель на структуру, соответствующую типу устройства, например:
PFT_EEPROM_232B это структура для устройств FT2xxB. PFT_EEPROM_2232 это структура для устройств FT2232D. PFT_EEPROM_232R это структура для устройств FT232R. PFT_EEPROM_2232H это структура для устройств FT2232H. PFT_EEPROM_4232H это структура для устройств FT4232H. PFT_EEPROM_232H это структура для устройств FT232H. PFT_EEPROM_X_SERIES это структура для устройств FT2xxX.
Функция не выполняет никаких проверок на размеры буферов, так что размеры буферов, которые передаются в структуре eepromDATA, должны быть достаточно велики, чтобы вместить соответствующие строки (включая null-терминаторы). Размеры, показанные в следующем примере, более чем адекватные, и могут быть уменьшены, если это необходимо. Ограничение состоит в том, что длина строки описания производителя (Manufacturer string) плюс длина строки описания (Description string) меньше или равна 40 символам.
Имейте в виду, что DLL должна быть информирована о версии используемой структуры eepromDATA. Это делается через структуру PFT_EEPROM_HEADER. Первый элемент структуры deviceType, который может быть FT_DEVICE_BM, FT_DEVICE_AM, FT_DEVICE_2232C, FT_DEVICE_232R, FT_DEVICE_2232H, FT_DEVICE_4232H, FT_DEVICE_232H или FT_DEVICE_X_SERIES, как это задано в FTD2XX.h.
ftHandle хендл устройства. *eepromData указатель на буфер, который содержит данные для записи. Примечание: эта структура отличается для каждого типа устройства. epromDataSize размер буфера eepromData. *Manufacturer указатель на null-terminated строку, содержащую имя производителя. *ManufacturerId указатель на null-terminated строку, содержащую идентификатор производителя (manufacturer ID). *Description указатель на null-terminated строку, содержащую описание устройства. *SerialNumber указатель на null-terminated строку, содержащую серийный номер устройства.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция интерпретирует параметр *eepromDATA как указатель на структуру, соответствующую типу устройства, например:
PFT_EEPROM_232B это структура для устройств FT2xxB. PFT_EEPROM_2232 это структура для устройств FT2232D. PFT_EEPROM_232R это структура для устройств FT232R. PFT_EEPROM_2232H это структура для устройств FT2232H. PFT_EEPROM_4232H это структура для устройств FT4232H. PFT_EEPROM_232H это структура для устройств FT232H. PFT_EEPROM_X_SERIES это структура для устройств FT2xxX.
Функция не выполняет никаких проверок на размеры буферов, так что размеры буферов, которые передаются в структуре eepromDATA, должны быть достаточно велики, чтобы вместить соответствующие строки (включая null-терминаторы). Размеры, показанные в следующем примере, более чем адекватные, и могут быть уменьшены, если это необходимо. Ограничение состоит в том, что длина строки описания производителя (Manufacturer string) плюс длина строки описания (Description string) меньше или равна 40 символам.
Имейте в виду, что DLL должна быть информирована о версии используемой структуры eepromDATA. Это делается через структуру PFT_EEPROM_HEADER. Первый элемент структуры deviceType, который может быть FT_DEVICE_BM, FT_DEVICE_AM, FT_DEVICE_2232C, FT_DEVICE_232R, FT_DEVICE_2232H, FT_DEVICE_4232H, FT_DEVICE_232H или FT_DEVICE_X_SERIES, как это задано в FTD2XX.h.
Пример изменения серийного номера устройства с помощью FT_EEPROM_Read и FT_EEPROM_Program (для упрощения проверки статуса ошибки для них опущены):
// Тип устройства, к которому осуществляется доступ:
ft_eeprom_header.deviceType = FT_DEVICE_2232H;
FT_EEPROM_2232H ft_eeprom_2232h;
ft_eeprom_2232h.common = ft_eeprom_header;
ft_eeprom_2232h.common.deviceType = FT_DEVICE_2232H;
status = FT_Open(0, &fthandle);
if(status != FT_OK)
{
printf("Ошибка открытия устройства, статус %d\n", status);
return;
}
status = FT_EEPROM_Read(fthandle,
&ft_eeprom_2232h,
sizeof(ft_eeprom_2232h),
Manufacturer,
ManufacturerId,
Description,
SerialNumber);
strcpy(SerialNumber, "FT000001");
status = FT_EEPROM_Program(fthandle,
&ft_eeprom_2232h,
sizeof(ft_eeprom_2232h),
Manufacturer,
ManufacturerId,
Description,
SerialNumber);
FT_Close(fthandle);
[5. Функции расширенного API]
Так называемые функции расширенного API (extended API) не применимы к устройствам FT8U232AM или FT8U245AM. Микросхемы FTDI, не относящиеся к USB-UART и USB-FIFO (FT2232H, FT4232H, FT232R, FT245R, FT2232, FT232B и FT245B) могут поддерживать эти функции. Имейте в виду, что что некоторые из этих функций привязаны к конкретным устройствам.
ftHandle хендл устройства. ucTimer требуемое значение в миллисекундах для latency timer. Допустимый диапазон 2 .. 255.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
В устройствах FT8U232AM и FT8U245AM таймаут буфера приема, используемый для сброса (flush) оставшихся данных из буфера приема, был фиксирован на 16 мс. Во всех других устройствах FTDI этот таймаут программируется, и может быть установлен с шагом 1 мс в интервале 2 мс .. 255 мс. Это позволяет лучше оптимизировать устройство под протоколы, требующие ускоренного ответа на короткие пакеты данных.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Получение текущего значения latency timer.
FT_STATUS FT_GetLatencyTimer (FT_HANDLE ftHandle, PUCHAR pucTimer);
Параметры:
ftHandle хендл устройства. pucTimer указатель на unsigned char, куда будет сохранено значение latency timer.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
В устройствах FT8U232AM и FT8U245AM таймаут буфера приема, используемый для сброса (flush) оставшихся данных из буфера приема, был фиксирован на 16 мс. Во всех других устройствах FTDI этот таймаут программируется, и может быть установлен с шагом 1 мс в интервале 2 мс .. 255 мс. Это позволяет лучше оптимизировать устройство под протоколы, требующие ускоренного ответа на короткие пакеты данных.
ftHandle хендл устройства. ucMask требуемое значение для битовой маски режима. Это устанавливает, какие биты работают как входы, какие как выходы. Значение бита 0 устанавливает соответствующий вывод как вход, а 1 устанавливает соответствующий вывод как выход. В случае CBUS Bit Bang старший ниббл этого значения управляет тем, какие выводы входы и выходы, а младший ниббл управляет, какие выходы должны стать в уровень лог. 1 или лог. 0. ucMode значение, определяющее режим. Может принимать одно из значений:
0x0 = Reset (сброс) 0x1 = Asynchronous Bit Bang, асинхронное манипулирование выводами 0x2 = MPSSE (только для устройств FT2232, FT2232H, FT4232H и FT232H, что это такое см. [3]) 0x4 = Synchronous Bit Bang, синхронное управление выводами (только для устройств FT232R, FT245R, FT2232, FT2232H, FT4232H и FT232H, см. [3, 4]) 0x8 = MCU Host Bus Emulation Mode, режим эмулирования микропроцессорной шины (только для устройств FT2232, FT2232H, FT4232H и FT232H, см. [3]) 0x10 = Fast Opto-Isolated Serial Mode, быстрый режим с оптоизоляцией (только для устройств FT2232, FT2232H, FT4232H и FT232H, см. [3]) 0x20 = CBUS Bit Bang Mode (только для устройств FT232R и FT232H, см. [4]) 0x40 = Single Channel Synchronous 245 FIFO Mode (только для устройств FT2232H и FT232H, см. [3])
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Описание режимов FT232R см. в апноуте "Bit Bang Modes for the FT232R and FT245R" (перевод на русский язык [4]).
Описание режимов FT2232 см. в апноуте "Bit Mode Functions for the FT2232".
Описание режимов Bit Bang для FT232B и FT245B см. апноут "FT232B/FT245B Bit Bang Mode".
Апноуты доступны для загрузки на сайте компании FTDI.
Имейте в виду, что для использования CBUS Bit Bang в FT232R, CBUS должна быть сконфигурирована через EEPROM для CBUS Bit Bang.
Имейте также в виду, что для использования Single Channel Synchronous 245 FIFO для FT2232H, channel A должен быть сконфигурирован через EEPROM для режима FT245 FIFO.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Немедленное получение значения с шины данных.
FT_STATUS FT_GetBitmode (FT_HANDLE ftHandle, PUCHAR pucMode);
Параметры:
ftHandle хендл устройства. pucMode указатель на unsigned char, куда будет сохранено текущее значение с шины данных.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Описание режимов FT232R см. в апноуте "Bit Bang Modes for the FT232R and FT245R" (перевод на русский язык см. в [4]). Описание режимов FT2232 см. в апноуте "Bit Mode Functions for the FT2232". Описание режимов Bit Bang для FT232B и FT245B см. апноут "FT232B/FT245B Bit Bang Mode". Описание режимов FT4232H и FT2232H см. в апноуте на микросхему (перевод на русский язык см. в [3]).
Апноуты доступны для загрузки на сайте компании FTDI.
ftHandle хендл устройства. dwInTransferSize размер передачи для запроса USB IN. dwOutTransferSize размер передачи для запроса USB OUT.
Возвращаемое значение: FT_OK если все прошло удачно, иначе будет возвращен код ошибки FT.
Эта функция может использоваться для изменения размеров передач от значения по умолчанию 4096, чтобы лучше подходить к требованиям приложения. Размеры передач должны быть установлены как число, кратное 64 байтам, в диапазоне от 64 байт до 65536 байт.
Когда вызывается FT_SetUSBParameters, изменения вступят в силу немедленно, и любые данные, которые в настоящий момент удерживались драйвером, будут потеряны.
Имейте в виду, что в настоящий момент поддерживается только dwInTransferSize.
Функции, представленные в этой секции, предоставлены для упрощения портирования из приложений Win32, работающих с последовательным портом. Эти функции поддерживаются на не-Windows платформах, что значительно облегчает перенос существующих приложений из Windows. Имейте в виду, что классические функции D2XX и функции Win32 D2XX не должны смешиваться, если не указано обратное.
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Откроет указанное устройство и возвратит хендл, который будет использоваться для последующего доступа. Устройство может быть указано по своему серийному номеру, описанию или размещению на шине USB (location).
Эта функция должна использоваться, если требуется ввод/вывод с перекрытием (overlapped I/O).
pvArg1 значение зависит от dwAttrsAndFlags. Может быть указателем на null-terminated строку, которая содержит описание или серийный номер устройства, или может быть location устройства. Эти значения могут быть получены из вызова функций FT_CreateDeviceInfoList, FT_GetDeviceInfoDetail или FT_ListDevices. dwAccess тип доступа к устройству. Может быть GENERIC_READ, GENERIC_WRITE или оба вместе. Параметр игнорируется в Linux. dwShareMode как устройство используется совместно. Это значение должно быть установлено в 0. lpSecurityAttributes этот параметр не дает эффекта, и должен быть установлен в NULL. dwCreate этот параметр должен быть установлен в OPEN_EXISTING. Параметр игнорируется в Linux. dwAttrsAndFlags атрибуты и флаги файла. Этот параметр является комбинацией FILE_ATTRIBUTE_NORMAL, FILE_FLAG_OVERLAPPED если используется overlapped I/O, FT_OPEN_BY_SERIAL_NUMBER если pvArg1 серийный номер устройства, и FT_OPEN_BY_DESCRIPTION если pvArg1 описание устройства. hTemplate этот параметр должен быть NULL.
Возвращаемое значение: если все прошло удачно, то будет возвращен хендл, иначе будет возвращен код ошибки Win32 INVALID_HANDLE_VALUE.
Значение pvArg1 зависит от dwAttrsAndFlags: если там установлены FT_OPEN_BY_SERIAL_NUMBER или FT_OPEN_BY_DESCRIPTION, то pvArg1 содержит указатель на соответствующую null-terminated строку с серийным номером или описанием устройства; если в dwAttrsAndFlags установлен FT_OPEN_BY_LOCATION, то pvArg1 интерпретируется как значение типа long, содержащее location ID устройства.
Параметр dwAccess может быть GENERIC_READ, GENERIC_WRITE или оба сразу; dwShareMode должен быть установлен в 0; lpSecurityAttributes должен быть установлен в NULL; dwCreate должен быть установлен в OPEN_EXISTING; как уже упоминалось, dwAttrsAndFlags является комбинацией FILE_ATTRIBUTE_NORMAL, FILE_FLAG_OVERLAPPED если используется overlapped I/O, FT_OPEN_BY_SERIAL_NUMBER, или FT_OPEN_BY_DESCRIPTION, или FT_OPEN_BY_LOCATION; hTemplate должен быть NULL.
Имейте в виду, что Linux, Mac OS X и Windows CE не поддерживают ни overlapped IO, ни идентификаторы location ID.
Пример 1. Открыть устройство для overlapped I/O по его серийному номеру.
ftHandle хендл устройства. lpBuffer указатель на буфер, куда поступят принятые данные из устройства. dwBytesToRead количество байт, которое должно быть прочитано из устройства. lpdwBytesReturned указатель на переменную, которая примет количество прочитанных из устройства байт. lpOverlapped указатель на структуру "перекрытия".
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Эта функция поддерживает как non-overlapped, так и overlapped I/O, за исключением того, что Linux, Mac OS X и Windows CE поддерживают только non-overlapped I/O.
Non-overlapped I/O. Параметр lpOverlapped должен быть NULL.
Функция всегда вернет в lpdwBytesReturned количество прочитанных байт.
Функция не вернет управление, пока в буфер не будет прочитано dwBytesToRead байт. Количество байт в очереди приема может быть определено вызовом FT_GetStatus или FT_GetQueueStatus, и передачей этого количества как dwBytesToRead, чтобы функция прочитала устройство и сразу сделала возврат.
Когда был установлен таймаут чтения предыдущим вызовом FT_W32_SetCommTimeouts, эта функция вернет управление после того, как время таймера истечет, или после того, как будет прочитано dwBytesToRead байт, в зависимости от того, что произойдет раньше. Если произошел таймаут, то любые доступные данные будут прочитаны в lpBuffer, и функция вернет ненулевое значение.
При обработке буфера приложение должно использовать значение возврата функции и lpdwBytesReturned. Если возвращенное значение не 0 (успешный возврат), и lpdwBytesReturned равно dwBytesToRead, то было нормальное завершение. Если же возвращенное значение не 0 (успешный возврат), и lpdwBytesReturned меньше, чем dwBytesToRead, то это означает, что истек таймаут, и запрос чтения был выполнен только частично. Имейте в виду, что если произошел таймаут, и не было прочитано никаких данных, то возвращенное значение все равно будет ненулевым.
Возвращенное значение FT_IO_ERROR говорит об ошибке в параметрах функции, или фатальной ошибке наподобие отключения от USB.
Overlapped I/O. Когда устройство открыто для overlapped I/O, приложение может выставить запрос, и продолжать выполнять некую дополнительную работу, пока запрос выполняется. Это отличается от non-overlapped I/O, когда приложение выдает запрос, и возвратит управление только после того, как будет выполнен запрос.
В параметре lpOverlapped должен быть указатель на инициализированную структуру OVERLAPPED.
Если в очереди приема находится достаточное количество данных, удовлетворяющее запросу, то запрос завершится немедленно и код возврата будет ненулевым. Количество прочитанных байт будет возвращено в lpdwBytesReturned.
Если данных на приеме недостаточно для удовлетворения запросу, то запрос завершается немедленно, и код возврата будет 0, что сигнализирует об ошибке. Приложение должно вызвать FT_W32_GetLastError, чтобы разобраться в причине ошибки. Если код ошибки ERROR_IO_PENDING, то сейчас выполняется overlapped-операция, и приложение может пока заняться другой работой. Время от времени приложение должно проверять результат overlapped-запроса вызовом FT_W32_GetOverlappedResult.
В случае успеха количество прочитанных байт будет возвращено в lpdwBytesReturned.
Пример 1. Здесь показано, как прочитать 256 байт из устройства, используя non-overlapped I/O.
FT_HANDLE ftHandle; // переменная настроена через FT_W32_CreateFile для non-overlapped I/O
char Buf[256];
DWORD dwToRead =256;
DWORD dwRead;
if (FT_W32_ReadFile(ftHandle, Buf, dwToRead, &dwRead, &osRead))
{
if (dwToRead == dwRead)
{
// FT_W32_ReadFile OK
}
else
{
// таймаут FT_W32_ReadFile
}
}
else
{
// ошибка FT_W32_ReadFile
}
Пример 2. Здесь показано, как прочитать 256 байт из устройства, используя overlapped I/O.
if (!FT_W32_ReadFile(ftHandle, Buf, dwToRead, &dwRead, &osRead))
{
if (FT_W32_GetLastError(ftHandle) == ERROR_IO_PENDING)
{
// чтение отложено, так что можно пока делать что-то еще
...
if (!FT_W32_GetOverlappedResult(ftHandle, &osRead, &dwRead, FALSE))
{
// ошибка
}
else
{
if (dwToRead == dwRead)
{
// FT_W32_ReadFile OK
}
else
{
// таймаут FT_W32_ReadFile
}
}
}
}
else
{
// FT_W32_ReadFile OK
}
CloseHandle (osRead.hEvent);
ftHandle хендл устройства. lpBuffer указатель на буфер, где содержатся данные для записи в устройство. dwBytesToWrite количество байт, которое нужно записать в устройство. lpdwBytesWritten указатель на переменную, которая примет количество записанных байт в устройство. lpOverlapped указатель на структуру перекрытия.
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Эта функция поддерживает как non-overlapped, так и overlapped I/O, за исключением того, что Linux, Mac OS X и Windows CE поддерживают только non-overlapped I/O.
Non-overlapped I/O. Параметр lpOverlapped должен быть NULL.
Функция всегда вернет в lpdwBytesWritten количество записанных байт.
Функция не вернет управление, пока в устройство не будет записано dwBytesToRead байт.
Когда был установлен таймаут записи предыдущим вызовом FT_W32_SetCommTimeouts, эта функция вернет управление после того, как время таймера истечет, или после того, как будет записано dwBytesToWrite байт, в зависимости от того, что произойдет раньше. Если произошел таймаут, то количество записанных байт будет помещено в lpdwBytesWritten, и функция вернет ненулевое значение.
Приложение должно всегда использовать значение возврата функции и lpdwBytesWritten. Если возвращенное значение не 0 (успешный возврат), и lpdwBytesWritten равно dwBytesToWrite, то было нормальное завершение. Если же возвращенное значение не 0 (успешный возврат), и lpdwBytesWritten меньше, чем dwBytesToWrite, то это означает, что истек таймаут, и запрос записи был выполнен только частично. Имейте в виду, что если произошел таймаут, и не было записано никаких данных, то возвращенное значение все равно будет ненулевым.
Overlapped I/O. Когда устройство открыто для overlapped I/O, приложение может выставить запрос, и продолжать выполнять некую дополнительную работу, пока запрос выполняется. Это отличается от non-overlapped I/O, когда приложение выдает запрос, и возвратит управление только после того, как будет выполнен запрос.
В параметре lpOverlapped должен быть указатель на инициализированную структуру OVERLAPPED.
Если в очереди приема находится достаточное количество данных, удовлетворяющее запросу, то запрос завершится немедленно и код возврата будет ненулевым. Количество прочитанных байт будет возвращено в lpdwBytesReturned.
Если функция завершается немедленно, и код возврата будет 0, что сигнализирует об ошибке. Приложение должно вызвать FT_W32_GetLastError, чтобы разобраться в причине ошибки. Если код ошибки ERROR_IO_PENDING, то сейчас выполняется overlapped-операция, и приложение может пока заняться другой работой. Время от времени приложение должно проверять результат overlapped-запроса вызовом FT_W32_GetOverlappedResult.
В случае успеха количество записанных байт будет возвращено в lpdwBytesWritten.
Пример 1. Здесь показано, как записать в устройство 128 байт, используя non-overlapped I/O.
FT_HANDLE ftHandle; // переменная настроена вызовом FT_W32_CreateFile для non-overlapped I/O
char Buf[128]; // содержит данные для записи в устройство
DWORD dwToWrite =128;
DWORD dwWritten;
if (FT_W32_WriteFile(ftHandle, Buf, dwToWrite, &dwWritten, &osWrite))
{
if (dwToWrite == dwWritten)
{
// FT_W32_WriteFile OK
}
else
{
// таймаут FT_W32_WriteFile
}
}
else
{
// ошибка FT_W32_WriteFile
}
Пример 2. Здесь показано, как записать в устройство 128 байт, используя overlapped I/O.
FT_HANDLE ftHandle; // переменная настроена вызовом FT_W32_CreateFile для overlapped I/O
char Buf[128]; // содержит данные для записи в устройство
DWORD dwToWrite =128;
DWORD dwWritten;
OVERLAPPED osWrite = { 0 };
if (!FT_W32_WriteFile(ftHandle, Buf, dwToWrite, &dwWritten, &osWrite))
{
if (FT_W32_GetLastError(ftHandle) == ERROR_IO_PENDING)
{
// запись отложена так что можно пока делать другую работу
...
if (!FT_W32_GetOverlappedResult(ftHandle, &osWrite, &dwWritten, FALSE))
{
// ошибка
}
else
{
if (dwToWrite == dwWritten)
{
// FT_W32_WriteFile OK
}
else
{
// таймаут FT_W32_WriteFile
}
}
}
}
ftHandle хендл к устройству. lpOverlapped указатель на overlapped структуру. lpdwBytesTransferred указатель на переменную, которая примет количество переданных байт за время overlapped-операции. bWait устанавливается в TRUE, если функция не должна сделать возврат, пока не завершит работу.
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Эта функция используется для overlapped I/O, и она не поддерживается в Linux, Mac OS X или Windows CE. Примеры использования см. в описаниях функций FT_W32_ReadFile и FT_W32_WriteFile.
ftHandle хендл устройства. lpdwStat указатель на переменную, которая примет значения сигналов управления модема (modem control. Значение modem control может быть комбинацией следующих сигналов:
MS_CTS_ON – Clear To Send (CTS) в лог. 1 MS_DSR_ON – Data Set Ready (DSR) в лог. 1 MS_RING_ON – Ring Indicator (RI) в лог. 1 MS_RLSD_ON – Receive Line Signal Detect (RLSD) в лог. 1
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
if (FT_W32_GetCommState(ftHandle, &ftDCB))
{
// FT_W32_GetCommState ok, состояние устройства находится в ftDCB
ftDCB.BaudRate =921600; // изменение скоростиif (FT_W32_SetCommState(ftHandle,&ftDCB))
; // FT_W32_SetCommState okelse
; // ошибка FT_W32_SetCommState
}
ftHandle хендл устройства. lpftTimeouts указатель на структуру FTTIMEOUTS, где имеется информация таймаута.
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Таймауты вычисляются с использованием информации в структуре FTTIMEOUTS.
Для запросов чтения количество байт для чтения умножается на общий множитель таймаута, и к этому добавляется общая константа таймаута. Таким образом, если TS это структура FTTIMEOUTS, и количество байт для чтения это dwToRead, то таймаут чтения rdTO вычисляется по следующему выражению:
Для запросов записи количество записываемых байт умножается на общий множитель таймаута, и к этому добавляется общая константа таймаута. Таким образом, если TS это структура FTTIMEOUTS, и количество байт для записи это dwToWrite, то таймаут записи wrTO вычисляется по следующему выражению:
ftHandle хендл устройства. dwMask маска, определяющая события, которые устройство должно мониторить. Здесь может быть ИЛИ-комбинация следующих констант:
EV_BREAK – BREAK condition (событие останова потока на линии) EV_CTS – поменялся сигнал Clear To Send (CTS) EV_DSR – поменялся сигнал Data Set Ready (DSR) EV_ERR – ошибка в состоянии линии EV_RING – поменялся сигнал Ring Indicator (RI) EV_RLSD – поменялся сигнал Receive Line Signal Detect (RLSD) EV_RXCHAR – принят символ EV_RXFLAG – событие приема символа EV_TXEMPTY – передатчик пуст
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Функция настраивает события, которые должны отслеживаться устройством. Приложение может вызвать функцию FT_W32_WaitCommEvent, чтобы ждать наступление события.
ftHandle хендл устройства. lpdwEventMask указатель на ячейку памяти DWORD, в которую будет записана маска, определяющая отслеживаемые события, которые в настоящий момент разрешены для мониторинга устройством. Маска может состоять из ИЛИ-комбинации одной или нескольких констант:
EV_BREAK – BREAK condition (событие останова потока на линии) EV_CTS – поменялся сигнал Clear To Send (CTS) EV_DSR – поменялся сигнал Data Set Ready (DSR) EV_ERR – ошибка в состоянии линии EV_RING – поменялся сигнал Ring Indicator (RI) EV_RLSD – поменялся сигнал Receive Line Signal Detect (RLSD) EV_RXCHAR – принят символ EV_RXFLAG – событие приема символа EV_TXEMPTY – передатчик пуст
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Вызовом этой функции можно узнать, наступление каких событий отслеживает устройство. Мониторинг этих событий ранее был разрешен вызовом функции FT_W32_SetCommMask.
ftHandle хендл устройства. lpdwEvent указатель на ячейку памяти, содержащую маску случившихся событий. lpOverlapped указатель на структуру overlapped.
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Функция поддерживает как non-overlapped, так и overlapped I/O, за исключением Windows CE и Linux, которые поддерживают только non-overlapped I/O.
Non-overlapped I/O. В этом случае параметр lpOverlapped должен быть равен NULL.
Функция не вернет управление, пока не произойдет событие, заданное предыдущим вызовом FT_W32_SetCommMask. События, которые произошли, будут возвращены этой функцией в ячейке, на которую указывает lpdwEvent.
Overlapped I/O. Когда устройство было открыто для overlapped I/O, приложение может выставить запрос и далее без остановки выполнять какую-то другую работу, пока запрос выполняется. Это отличается от случая non-overlapped I/O, когда приложение выставляет запрос, и возвращает управление в приложение только после завершения запроса (наступления события).
Параметр lpOverlapped должен указывать на инициализированную структуру OVERLAPPED.
Если событие, которое было ранее задано вызовом FT_W32_SetCommMask, уже произошло, то запрос будет выполнен немедленно, и код возврата будет ненулевым. Произошедшие события можно определить по значению, сохраненному в lpdwEvent.
Если событие пока еще не произошло, то запрос все равно завершится немедленно, к код возврата будет 0, что сигнализирует об ошибке. В этом случае приложение должно вызвать FT_W32_GetLastError, чтобы определить вид ошибки. Если код ошибки ERROR_IO_PENDING, то overlapped-операция все еще выполняется, и приложение может выполнять другую работу. Периодически приложение проверяет результат overlapped-запроса, вызывая FT_W32_GetOverlappedResult. События, которые произошли, в результате будут возвращены и сохранены в lpdwEvent.
Пример 1. Этот пример показывает, как записать 128 байт, используя non-overlapped I/O.
if (!FT_W32_WaitCommEvent(ftHandle, &dwEvents, &osWait))
{
if (FT_W32_GetLastError(ftHandle == ERROR_IO_PENDING)
{
// запрос выставлен, но пока тне завершился, так что // можно выполнять какую-то другую работу
...
if (!FT_W32_GetOverlappedResult(ftHandle, &osWait, &dwRes, FALSE))
; // ошибкаelse
; // FT_W32_WaitCommEvent OK// События, которые произошли, сохранены как маска в dwEvents
}
}
else
{
// FT_W32_WaitCommEvent OK// События, которые произошли, сохранены как маска в dwEvents
}
Поддерживаемые ОС: Linux, Mac OS X (10.4 и более свежие), Windows (2000 и более свежие), Windows CE (4.2 и более свежие).
Получает информацию об ошибке, которая произошла с устройством.
DWORD FT_W32_GetLastError (FT_HANDLE ftHandle);
Параметры:
ftHandle хендл устройства.
Возвращаемое значение: если все прошло удачно, то будет возвращено ненулевое значение, иначе будет возвращен 0.
Это функция обычно используется для overlapped I/O, и не поддерживается в Windows CE. Как использовать функцию, см. примеры кода для FT_W32_ReadFile и FT_W32_WriteFile. В Linux и Mac OS X эта функция вернет DWORD, который напрямую привязан к FT Errors (например номер ошибки FT_INVALID_HANDLE).
if (bChanged)
{
if (dwErrors & CE_BREAK)
; // детектировано событие останова (BREAK condition)if (dwErrors & CE_FRAME)
; // детектирована ошибка фреймаif (dwErrors & CE_RXOVER)
; // переполнение буфера приемаif (dwErrors & CE_TXFULL)
; // буфер передачи заполненif (dwErrors & CE_OVERRUN)
; // переполнение буфера символаif (dwErrors & CE_RXPARITY)
; // детектирована ошибка четностиif (newCS.fCtsHold)
; // передатчик ждет CTSif (newCS.fDsrHold)
; // передатчик ждет DSRif (newCS.fRlsdHold)
; // передатчик ждет RLSDif (newCS.fXoffHold)
; // передатчик ждет, потому что был принят XOFFif (newCS.fXoffSent)
; // был отправлен XOFFif (newCS.fEof)
; // принят символ конца файла (End of file, EOF)if (newCS.fTxim)
; // символ непосредственно поставлен в очередь передачи// newCS.cbInQue содержит количество байт в очереди приема// newCS.cbOutQue содержит количество байт в очереди передачи
}
[Appendix A – Type Definitions (определения типов)]
typedefstruct ft_program_data
{
DWORD Signature1; // заголовок - тут должно быть 0x0000000
DWORD Signature2; // заголовок - тут должно быть 0xffffffff
DWORD Version; // заголовок - версия FT_PROGRAM_DATA // 0 = оригинальная версия (FT232B)// 1 = расширения FT2232// 2 = расширения FT232R// 3 = расширения FT2232H// 4 = расширения FT4232H// 5 = расширения FT232H
WORD VendorId; // 0x0403
WORD ProductId; // 0x6001char*Manufacturer; // "FTDI"char*ManufacturerId; // "FT"char*Description; // "USB HS Serial Converter"char*SerialNumber; // "FT000001" если фиксировано, или NULL
WORD MaxPower; // 0 < MaxPower < = 500
WORD PnP; // 0 = запрещено, 1 = разрешено
WORD SelfPowered; // 0 = питание от шины USB, 1 = свой источник питания
WORD RemoteWakeup; // 0 = не применимо, 1 = применимо//// Расширения для Rev4 (FT232B)//
UCHAR Rev4; // не 0, если чип Rev4, иначе 0
UCHAR IsoIn; // не 0, если IN endpoint изохронная
UCHAR IsoOut; // не 0, если OUT endpoint изохронная
UCHAR PullDownEnable;// не 0, если разрешен pull down
UCHAR SerNumEnable; // не 0, если используется серийный номер
UCHAR USBVersionEnable; // не 0, если чип использует USBVersion
WORD USBVersion; // BCD (0x0200 => USB2)//// Расшинения для Rev 5 (FT2232)//
UCHAR Rev5; // не 0, если чип Rev5, иначе 0
UCHAR IsoInA; // не 0, если IN endpoint изохронная
UCHAR IsoInB; // не 0, если IN endpoint изохронная
UCHAR IsoOutA; // не 0, если OUT endpoint изохронная
UCHAR IsoOutB; // не 0, если OUT endpoint изохронная
UCHAR PullDownEnable5; // не 0, если разрешен pull down
UCHAR SerNumEnable5; // не 0, если используется серийный номер
UCHAR USBVersionEnable5; // не 0, если чип использует USBVersion
WORD USBVersion5; // BCD (0x0200 => USB2)
UCHAR AIsHighCurrent; // не 0, если интерфейс с высокой нагрузочной способностью (high current)
UCHAR BIsHighCurrent; // не 0, если интерфейс с высокой нагрузочной способностью (high current)
UCHAR IFAIsFifo; // не 0, если интерфейс 245 FIFO
UCHAR IFAIsFifoTar; // не 0, если интерфейс 245 FIFO CPU target
UCHAR IFAIsFastSer; // не 0, если интерфейс Fast serial
UCHAR AIsVCP; // не 0, если интерфейс использует драйверы VCP
UCHAR IFBIsFifo; // не 0, если интерфейс 245 FIFO
UCHAR IFBIsFifoTar; // не 0, если интерфейс 245 FIFO CPU target
UCHAR IFBIsFastSer; // не 0, если интерфейс Fast serial
UCHAR BIsVCP; // не 0, если интерфейс использует драйверы VCP//// Расшинения для Rev 6 (FT232R)//
UCHAR UseExtOsc; // используется внешний генератор
UCHAR HighDriveIOs; // ввод/вывод с высокой нагрузочной способностью (High Drive I/O)
UCHAR EndpointSize; // размер буфера конечной точки (endpoint size)
UCHAR PullDownEnableR; // не 0, если разрешен pull down
UCHAR SerNumEnableR; // не 0, если используется серийный номер
UCHAR InvertTXD; // не 0, если инверсия TXD
UCHAR InvertRXD; // не 0, если инверсия RXD
UCHAR InvertRTS; // не 0, если инверсия RTS
UCHAR InvertCTS; // не 0, если инверсия CTS
UCHAR InvertDTR; // не 0, если инверсия DTR
UCHAR InvertDSR; // не 0, если инверсия DSR
UCHAR InvertDCD; // не 0, если инверсия DCD
UCHAR InvertRI; // не 0, если инверсия RI
UCHAR Cbus0; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus1; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus2; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus3; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus4; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR RIsD2XX; // не 0, если используется драйвер D2XX//// Расширения для Rev 7 (FT2232H)//
UCHAR PullDownEnable7; // не 0, если разрешен pull down
UCHAR SerNumEnable7; // не 0, если используется серийный номер
UCHAR ALSlowSlew; // не 0, если AL выводы имеют низкую скорость переключения
UCHAR ALSchmittInput;// не 0, если AL выводы имеют на входе триггер Шмитта
UCHAR ALDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR AHSlowSlew; // не 0, если AH выводы имеют низкую скорость переключения
UCHAR AHSchmittInput;// не 0, если AH выводы имеют на входе триггер Шмитта
UCHAR AHDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR BLSlowSlew; // не 0, если BL выводы имеют низкую скорость переключения
UCHAR BLSchmittInput;// не 0, если BL выводы имеют на входе триггер Шмитта
UCHAR BLDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR BHSlowSlew; // не 0, если BH выводы имеют низкую скорость переключения
UCHAR BHSchmittInput;// не 0, если BH выводы имеют на входе триггер Шмитта
UCHAR BHDriveCurrent;// допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR IFAIsFifo7; // не 0, если интерфейс 245 FIFO
UCHAR IFAIsFifoTar7; // не 0, если интерфейс 245 FIFO CPU target
UCHAR IFAIsFastSer7; // не 0, если интерфейс Fast serial
UCHAR AIsVCP7; // не 0, если интерфейс использует драйверы VCP
UCHAR IFBIsFifo7; // не 0, если интерфейс 245 FIFO
UCHAR IFBIsFifoTar7; // не 0, если интерфейс 245 FIFO CPU target
UCHAR IFBIsFastSer7; // не 0, если интерфейс Fast serial
UCHAR BIsVCP7; // не 0, если интерфейс использует драйверы VCP
UCHAR PowerSaveEnable; // не 0, если BCBUS7 используется для управления // энергопотреблением в случае своего питания//// Расширения для Rev 8 (FT4232H)//
UCHAR PullDownEnable8; // не 0, если разрешен pull down
UCHAR SerNumEnable8; // не 0, если используется серийный номер
UCHAR ASlowSlew; // не 0, если AL выводы имеют низкую скорость переключения
UCHAR ASchmittInput; // не 0, если AL выводы имеют на входе триггер Шмитта
UCHAR ADriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR BSlowSlew; // не 0, если AH выводы имеют низкую скорость переключения
UCHAR BSchmittInput; // не 0, если AH выводы имеют на входе триггер Шмитта
UCHAR BDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR CSlowSlew; // не 0, если BL выводы имеют низкую скорость переключения
UCHAR CSchmittInput; // не 0, если BL выводы имеют на входе триггер Шмитта
UCHAR CDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR DSlowSlew; // не 0, если BH выводы имеют низкую скорость переключения
UCHAR DSchmittInput; // не 0, если BH выводы имеют на входе триггер Шмитта
UCHAR DDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR ARIIsTXDEN; // не 0, если port A использует RI как RS485 TXDEN
UCHAR BRIIsTXDEN; // не 0, если port B использует RI как RS485 TXDEN
UCHAR CRIIsTXDEN; // не 0, если port C использует RI как RS485 TXDEN
UCHAR DRIIsTXDEN; // не 0, если port D использует RI как RS485 TXDEN
UCHAR AIsVCP8; // не 0, если интерфейс использует драйверы VCP
UCHAR BIsVCP8; // не 0, если интерфейс использует драйверы VCP
UCHAR CIsVCP8; // не 0, если интерфейс использует драйверы VCP
UCHAR DIsVCP8; // не 0, если интерфейс использует драйверы VCP//// Расширения для Rev 9 (FT232H)//
UCHAR PullDownEnableH; // не 0, если разрешен pull down
UCHAR SerNumEnableH; // не 0, если используется серийный номер
UCHAR ACSlowSlewH; // не 0, если AC выводы имеют низкую скорость переключения
UCHAR ACSchmittInputH; // не 0, если AC выводы имеют на входе триггер Шмитта
UCHAR ACDriveCurrentH; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR ADSlowSlewH; // не 0, если AD выводы имеют низкую скорость переключения
UCHAR ADSchmittInputH; // не 0, если AD выводы имеют на входе триггер Шмитта
UCHAR ADDriveCurrentH; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR Cbus0H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus1H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus2H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus3H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus4H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus5H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus6H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus7H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus8H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus9H; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR IsFifoH; // не 0, если интерфейс 245 FIFO
UCHAR IsFifoTarH; // не 0, если интерфейс 245 FIFO CPU target
UCHAR IsFastSerH; // не 0, если интерфейс Fast serial
UCHAR IsFT1248H; // не 0, если интерфейс FT1248
UCHAR FT1248CpolH; // FT1248 полярность тактов - clock idle лог. 1 (1) или лог. 0 (0)
UCHAR FT1248LsbH; // FT1248 порядок следования данных, сначала LSB (1) или MSB (0)
UCHAR FT1248FlowControlH; // FT1248 разрешение управлением потоком (flow control)
UCHAR IsVCPH; // не 0, если интерфейс использует драйверы VCP
UCHAR PowerSaveEnableH; // не 0, если ACBUS7 используется для управления // энергопотреблением в случае своего питания
} FT_PROGRAM_DATA, *PFT_PROGRAM_DATA;
typedefstruct ft_eeprom_header
{
FT_DEVICE deviceType;// тип устройства FTxxxx для программирования// Опции дескриптора устройства
WORD VendorId; // 0x0403
WORD ProductId; // 0x6001
UCHAR SerNumEnable; // не 0, если используется серийный номер// Опции дескриптора конфигурации
WORD MaxPower; // 0 < MaxPower < = 500
UCHAR SelfPowered; // 0 = питание от шины USB, 1 = свой источник питания
UCHAR RemoteWakeup; // 0 = не применимо, 1 = применимо// Опции аппаратуры
UCHAR PullDownEnable;// не 0, если в suspend (приостановка) разрешен pull down
} FT_EEPROM_HEADER, *PFT_EEPROM_HEADER;
Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.
typedefstruct ft_eeprom_232b
{
// Общий заголовок
FT_EEPROM_HEADER common; // общие элементы EEPROM для всех устройств
} FT_EEPROM_232B, *PFT_EEPROM_232B;
Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.
typedefstruct ft_eeprom_2232
{
// Общий заголовок
FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств// Опции нагрузочной способности
UCHAR AIsHighCurrent; // не 0, если интерфейс с высокой нагрузочной способностью (high current)
UCHAR BIsHighCurrent; // не 0, если интерфейс с высокой нагрузочной способностью (high current)// Опции аппаратуры
UCHAR AIsFifo; // не 0, если интерфейс 245 FIFO
UCHAR AIsFifoTar; // не 0, если интерфейс 245 FIFO CPU target
UCHAR AIsFastSer; // не 0, если интерфейс Fast serial
UCHAR BIsFifo; // не 0, если интерфейс 245 FIFO
UCHAR BIsFifoTar; // не 0, если интерфейс 245 FIFO CPU target
UCHAR BIsFastSer; // не 0, если интерфейс Fast serial// Опции драйвера
UCHAR ADriverType;
UCHAR BDriverType;
} FT_EEPROM_2232, *PFT_EEPROM_2232;
Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.
typedefstruct ft_eeprom_232r
{
// Общий заголовок
FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств// Опции нагрузочной способности
UCHAR IsHighCurrent; // не 0, если интерфейс с высокой нагрузочной способностью (high current)// Опции аппаратуры
UCHAR UseExtOsc; // используется внешний генератор
UCHAR InvertTXD; // не 0, если инверсия TXD
UCHAR InvertRXD; // не 0, если инверсия RXD
UCHAR InvertRTS; // не 0, если инверсия RTS
UCHAR InvertCTS; // не 0, если инверсия CTS
UCHAR InvertDTR; // не 0, если инверсия DTR
UCHAR InvertDSR; // не 0, если инверсия DSR
UCHAR InvertDCD; // не 0, если инверсия DCD
UCHAR InvertRI; // не 0, если инверсия RI
UCHAR Cbus0; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus1; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus2; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus3; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus4; // управление мультиплексором CBUS (Cbus Mux control)// Опции драйвера
UCHAR DriverType;
} FT_EEPROM_232R, *PFT_EEPROM_232R;
Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.
typedefstruct ft_eeprom_2232h
{
// Общий заголовок
FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств// Опции нагрузочной способности
UCHAR ALSlowSlew; // не 0, если AL выводы имеют низкую скорость переключения
UCHAR ALSchmittInput; // не 0, если AL выводы имеют на входе триггер Шмитта
UCHAR ALDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR AHSlowSlew; // не 0, если AH выводы имеют низкую скорость переключения
UCHAR AHSchmittInput; // не 0, если AH выводы имеют на входе триггер Шмитта
UCHAR AHDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR BLSlowSlew; // не 0, если BL выводы имеют низкую скорость переключения
UCHAR BLSchmittInput; // не 0, если BL выводы имеют на входе триггер Шмитта
UCHAR BLDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR BHSlowSlew; // не 0, если BH выводы имеют низкую скорость переключения
UCHAR BHSchmittInput; // не 0, если BH выводы имеют на входе триггер Шмитта
UCHAR BHDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА// Опции аппаратуры
UCHAR AIsFifo; // не 0, если интерфейс 245 FIFO
UCHAR AIsFifoTar; // не 0, если интерфейс 245 FIFO CPU target
UCHAR AIsFastSer; // не 0, если интерфейс Fast serial
UCHAR BIsFifo; // не 0, если интерфейс 245 FIFO
UCHAR BIsFifoTar; // не 0, если интерфейс 245 FIFO CPU target
UCHAR BIsFastSer; // не 0, если интерфейс Fast serial
UCHAR PowerSaveEnable; // не 0, если BCBUS7 используется для управления // энергопотреблением в случае своего питания// Опции драйвера
UCHAR ADriverType;
UCHAR BDriverType;
} FT_EEPROM_2232H, *PFT_EEPROM_2232H;
Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.
typedefstruct ft_eeprom_4232h
{
// Общий заголовок
FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств// Опции нагрузочной способности
UCHAR ASlowSlew; // не 0, если A выводы имеют низкую скорость переключения
UCHAR ASchmittInput; // не 0, если A выводы имеют на входе триггер Шмитта
UCHAR ADriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR BSlowSlew; // не 0, если B выводы имеют низкую скорость переключения
UCHAR BSchmittInput; // не 0, если B выводы имеют на входе триггер Шмитта
UCHAR BDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR CSlowSlew; // не 0, если C выводы имеют низкую скорость переключения
UCHAR CSchmittInput; // не 0, если C выводы имеют на входе триггер Шмитта
UCHAR CDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR DSlowSlew; // не 0, если D выводы имеют низкую скорость переключения
UCHAR DSchmittInput; // не 0, если D выводы имеют на входе триггер Шмитта
UCHAR DDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА// Опции аппаратуры
UCHAR ARIIsTXDEN; // не 0, если port A использует RI как RS485 TXDEN
UCHAR BRIIsTXDEN; // не 0, если port B использует RI как RS485 TXDEN
UCHAR CRIIsTXDEN; // не 0, если port C использует RI как RS485 TXDEN
UCHAR DRIIsTXDEN; // не 0, если port D использует RI как RS485 TXDEN// Опции драйвера
UCHAR ADriverType;
UCHAR BDriverType;
UCHAR CDriverType;
UCHAR DDriverType;
} FT_EEPROM_4232H, *PFT_EEPROM_4232H;
Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.
typedefstruct ft_eeprom_232h
{
// Общий заголовок
FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств// Опции нагрузочной способности
UCHAR ACSlowSlew; // не 0, если AC bus выводы имеют низкую скорость переключения
UCHAR ACSchmittInput; // не 0, если AC bus выводы имеют на входе триггер Шмитта
UCHAR ACDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR ADSlowSlew; // не 0, если AD bus выводы имеют низкую скорость переключения
UCHAR ADSchmittInput; // не 0, если AD bus выводы имеют на входе триггер Шмитта
UCHAR ADDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА// Опции CBUS
UCHAR Cbus0; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus1; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus2; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus3; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus4; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus5; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus6; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus7; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus8; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus9; // управление мультиплексором CBUS (Cbus Mux control)// FT1248 options
UCHAR FT1248Cpol; // FT1248 полярность тактов - clock idle лог. 1 (1) или лог. 0 (0)
UCHAR FT1248Lsb; // FT1248 порядок следования данных, сначала LSB (1) или MSB (0)
UCHAR FT1248FlowControl;// FT1248 разрешение управлением потоком (flow control)// Опции аппаратуры
UCHAR IsFifo; // не 0, если интерфейс 245 FIFO
UCHAR IsFifoTar; // не 0, если интерфейс 245 FIFO CPU target
UCHAR IsFastSer; // не 0, если интерфейс Fast serial
UCHAR IsFT1248 // не 0, если интерфейс FT1248
UCHAR PowerSaveEnable;
// Опции драйвера
UCHAR DriverType;
} FT_EEPROM_232H, *PFT_EEPROM_232H;
Эта структура нужна для использования вместе с FT_EEPROM_Read и FT_EEPROM_Program.
typedefstruct ft_eeprom_x_series
{
// Общий заголовок
FT_EEPROM_HEADER common;// общие элементы EEPROM для всех устройств// Опции нагрузочной способности
UCHAR ACSlowSlew; // не 0, если AC bus выводы имеют низкую скорость переключения
UCHAR ACSchmittInput; // не 0, если AC bus выводы имеют на входе триггер Шмитта
UCHAR ACDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА
UCHAR ADSlowSlew; // не 0, если AD bus выводы имеют низкую скорость переключения
UCHAR ADSchmittInput; // не 0, если AD bus выводы имеют на входе триггер Шмитта
UCHAR ADDriveCurrent; // допустимые значения 4 мА, 8 мА, 12 мА, 16 мА// Опции CBUS
UCHAR Cbus0; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus1; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus2; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus3; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus4; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus5; // управление мультиплексором CBUS (Cbus Mux control)
UCHAR Cbus6; // управление мультиплексором CBUS (Cbus Mux control)// Опции сигналов UART
UCHAR InvertTXD; // не 0, если инверсия TXD
UCHAR InvertRXD; // не 0, если инверсия RXD
UCHAR InvertRTS; // не 0, если инверсия RTS
UCHAR InvertCTS; // не 0, если инверсия CTS
UCHAR InvertDTR; // не 0, если инверсия DTR
UCHAR InvertDSR; // не 0, если инверсия DSR
UCHAR InvertDCD; // не 0, если инверсия DCD
UCHAR InvertRI; // не 0, если инверсия RI// Опции детектирования заряда батареи (Battery Charge Detect)
UCHAR BCDEnable; // разрешить Battery Charger Detection
UCHAR BCDForceCbusPWREN;// выставляет сигнал power enable на CBUS, когда// был детектирован порт зарядки
UCHAR BCDDisableSleep; // принудительно запрещает устройству переходить в sleep mode// Опции I2C
WORD I2CSlaveAddress; // Адрес подчиненного устройства на шине I2C (I2C slave device address)
DWORD I2CDeviceId; // Идентификатор устройства на шине I2C (I2C device ID)
UCHAR I2CDisableSchmitt;// Запрет триггера Шмитта на шине I2C// FT1248 options
UCHAR FT1248Cpol; // FT1248 полярность тактов - clock idle лог. 1 (1),// или лог. 0 (0)
UCHAR FT1248Lsb; // FT1248 порядок следования данных, сначала LSB (1) или MSB (0)
UCHAR FT1248FlowControl;// FT1248 разрешение управлением потоком (flow control)// Опции аппаратуры
UCHAR RS485EchoSuppress;
UCHAR PowerSaveEnable;
// Опции драйвера
UCHAR DriverType;
} FT_EEPROM_X_SERIES, *PFT_EEPROM_X_SERIES;
CLRDTR =6// Сброс сигнала DTR
CLRRTS =4// Сброс сигнала RTS
SETDTR =5// Установка сигнала DTR
SETRTS =3// Установка сигнала RTS
SETBREAK =8// Установка состояния останова (BREAK condition)
CLRBREAK =9// Сброс состояния останова (non-BREAK condition)
MS_CTS_ON =0x0010// Сигнал Clear To Send (CTS) в лог. 1
MS_DSR_ON =0x0020// Сигнал Data Set Ready (DSR) в лог. 1
MS_RING_ON =0x0040// Сигнал Ring Indicator (RI) в лог. 1
MS_RLSD_ON =0x0080// Receive Line Signal Detect (RLSD) в лог. 1
typedefstruct _FTDCB
{
DWORD DCBlength; // sizeof(FTDCB)
DWORD BaudRate; // Скорость
DWORD fBinary:1; // Binary Mode (пропуск проверки EOF)
DWORD fParity:1; // Разрешение проверки на четность
DWORD fOutxCtsFlow:1;// Управление выходом CTS handshaking
DWORD fOutxDsrFlow:1;// Управление выходом DSR handshaking
DWORD fDtrControl:2; // Управление потоком DTR
DWORD fDsrSensitivity:1; // Чувствительность DSR
DWORD fTXContinueOnXoff:1;// Продолжение TX, когда отправлен Xoff
DWORD fOutX:1; // Разрешить на выходе X-ON/X-OFF
DWORD fInX:1; // Разрешить на входе X-ON/X-OFF
DWORD fErrorChar:1; // Разрешить замену при ошибке (Err Replacement)
DWORD fNull:1; // Разрешить Null stripping
DWORD fRtsControl:2; // Управление потоком RTS
DWORD fAbortOnError:1; // Оборвать все чтения и записи при ошибке
DWORD fDummy2:17; // Зарезервировано
WORD wReserved; // Пока не используется
WORD XonLim; // Порог передачи X-ON
WORD XoffLim; // Порог передачи X-OFF
BYTE ByteSize; // Размер фрейма (количество бит в байте), 7-8
BYTE Parity; // 0..4: None, Odd, Even, Mark, Space
BYTE StopBits; // 0, 2: 1, 2char XonChar; // Символ X-ON для Tx и Rx char XoffChar; // Символ X-OFF для Tx и Rx char ErrorChar; // Символ замены при ошибке (Error replacement char)char EofChar; // Символ окончания ввода (End of Input character)char EvtChar; // Символ приема события (Received Event character)
WORD wReserved1; // Зарезервировано
} FTDCB, *LPFTDCB;
typedefstruct _FTTIMEOUTS
{
DWORD ReadIntervalTimeout; // max время между читаемыми символами
DWORD ReadTotalTimeoutMultiplier; // множитель для символов
DWORD ReadTotalTimeoutConstant; // константа в миллисекундах
DWORD WriteTotalTimeoutMultiplier; // множитель для символов
DWORD WriteTotalTimeoutConstant; // константа в миллисекундах
} FTTIMEOUTS, *LPFTTIMEOUTS;
У меня адаптер на FTDI 232R Vag k+can commander 1,4. Чип полностью пустой, перепаял новый, а он тоже не определяется ни по производителю, ни по ID, VID_0000&PID_0000. Из командной строки не хватает образования прописать. Пробовал подставлять ваши команды, пишет что не является командой для записи. Установлен Windows 7, 32-bit. Можно что либо сделать или купить новый адаптер?
microsin: можно конечно что-то сделать. Но сначала надо понять, в чем причина. Скорее всего, просто плохо чип запаяли, и где-то непропай или замыкание.
Комментарии
microsin: можно конечно что-то сделать. Но сначала надо понять, в чем причина. Скорее всего, просто плохо чип запаяли, и где-то непропай или замыкание.
RSS лента комментариев этой записи