Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FTDI FT245R (USB-FIFO) "залипает"
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Torpeda
Добрый день,
Уважаемые знатоки, помогите решить вопрос с програмированием FTDI FT245R (USB-FIFO).

Конфигурация такая:
- На стороне ПС: win XP +VCP драйвер (COM порт)
- На другом конце - железка, которая забирает данные с FT245R.FIFO на большой скорости (всё чё приходит до >3MB\sek), согласно протоколу
- Передаю данные побайтно (с промежуточной печатью на экран между посылками)

ПРОБЛЕМА:
Всё работает хорошо, но недолго - после передачи N байт (разное количество, типично около 300), скорость передачи уменьшается до 1 байта за 4 сек приблизительно.
Данные приходят во внешнюю железку неправильные (неправильно интерпретируються)

Пробовал менять настройки COM (и разный хендшейкинг, и разную скорость, и разные настройки буферов...) - не помогает.
ERROR's порт не возвращает, CTS=1 всегда.

ВОПРОС:
1) Кто сталкивался с подобным? Где можно прочитать по теме...
2) Пробовал задать маленький выходной буфер (64 байта) и получить CTS=0 забив его байтами, но не выходит - CTS=1 всегда.
Кто знает как использовать правильно аппаратный хендшейк? Как сконфигурить порт для этого?
3) В win XP какой приоритет конфигураций COM порта (FTDIPORT.INF -> win XP settings -> опции команды OPEN)?

Заранее благодарю
svss
Цитата(Torpeda @ Aug 27 2012, 15:30) *
- На другом конце - железка, которая забирает данные с FT245R.FIFO на большой скорости (всё чё приходит до >3MB\sek), согласно протоколу

Сильно похоже на проблему с "хэндшейком". Однако, зачем оно Вам если "на большой скорости"?

Впрочем, поскольку вопросом на вопрос отвечать нехорошо - извольте:
1) ни разу не сталкивался, хотя ел эту морковку (FTDI) в больших количествах и разнообразиях. скорее всего тема - чисто Ваша.
2) FT_SetFlowControl(...), но в данном случае оно к делу относится, похоже, мало.
3) вопрос не ясен: что такое "приоритет конфигураций" (напоминает терминологию 1С)?
"опции команды Open" - это где такие, о чём речь?

К тому, FT245 - есть, как Вы правильно заметили, USB FIFO и при чём тут CTS до конца не понятно.
Возможно, но не понятно. Хотелось бы видеть что-то вроде RXF/TXE.
Torpeda
Цитата(svss @ Aug 28 2012, 23:17) *
Сильно похоже на проблему с "хэндшейком". Однако, зачем оно Вам если "на большой скорости"?

Впрочем, поскольку вопросом на вопрос отвечать нехорошо - извольте:
1) ни разу не сталкивался, хотя ел эту морковку (FTDI) в больших количествах и разнообразиях. скорее всего тема - чисто Ваша.
2) FT_SetFlowControl(...), но в данном случае оно к делу относится, похоже, мало.
3) вопрос не ясен: что такое "приоритет конфигураций" (напоминает терминологию 1С)?
"опции команды Open" - это где такие, о чём речь?

К тому, FT245 - есть, как Вы правильно заметили, USB FIFO и при чём тут CTS до конца не понятно.
Возможно, но не понятно. Хотелось бы видеть что-то вроде RXF/TXE.


Мне тоже на хендшейк похоже, вот и спрашиваю как его правильно использовать...
Хоть скорость "приёмника" и большая, но программа должна быть правильно написана - с хендшейком, особенно потому, что "COM-портовский битрейт" в USB имеет довольно специфическую реализацию из-за разных принципов передачи.
2) Пишу на Tcl, поэтому и терминологические отличия (в часности команда Open).
Можна сказать что использовал FT_SetFlowControl(...) для розрешения аппаратного (RTS\CTS) хендшейка.
Но CTS=1 как я не старался. Вам удавалось видеть чтобы CTS=0 когда нибудь?
3) "приоритет конфигураций" - Что будет главнее, если все три варианта противоречиво заданы (напр. разный битрейт указан, то какой установиться)?
Переформулирую:
FTDIPORT.INF - это прямо настройки в драйвере -> win XP settings в окошке свойств порта-> FT_SetFlowControl(...) прямо из программы.
4) FT245 это USB FIFO, но со стороны win XP - это COM порт, а значит должен работать и в режиме аппаратного хендшейка со стороны программы.
Или при работе с FT245 VCP драйвером хендшейк не предусмотрен или какой-то особенный?
RXF/TXE - это хендшейк на стороне FIFO.
alexPec
Цитата(Torpeda @ Aug 29 2012, 11:24) *
FTDIPORT.INF - это прямо настройки в драйвере -> win XP settings в окошке свойств порта-> FT_SetFlowControl(...) прямо из программы.


У меня всегда выставляется битрейт, который указываю при открытии порта
svss
Цитата(Torpeda @ Aug 29 2012, 13:24) *
Но CTS=1 как я не старался. Вам удавалось видеть чтобы CTS=0 когда нибудь?
..
FT245 это USB FIFO, но со стороны win XP - это COM порт, а значит должен работать и в режиме аппаратного хендшейка со стороны программы.
Или при работе с FT245 VCP драйвером хендшейк не предусмотрен или какой-то особенный?

Аппаратный handshake (RTS или CTS или XonOff) относится только к Вашим проводам которые здесь есть аппаратный GPIO FIFO.
То есть фишки от COM-порта нипричём. (Детали существуют, но только если Вы глубоко влезаете внутрь чипа и пользуете недокументированное, что не похоже на эту тему)
Есть аппаратный хендшейк TXE/RXF. Никаких программных настроек не требуется.
Скорости обмена тоже нет, сколько ни устанавливайте бодрейт. Со стороны USB - скорость USB, со стороны GPIO - ваша печаль.
Вы пишете в COM-порт с любой скоростью, USB передаёт как умеет. Всё, что не выгребается со стороны GPIO прилипает в FIFO.
Как только FIFO заполняется, USB перестаёт мочь передавать, и некоторое количество байт прилипает в очередях драйвера и HAL.
Начинаются тормоза.


А, да, Вы спросили чего читать..
D2XX_Programmer's_Guide(FT000071).pdf


Страница примерно 35.
FT_GetStatus()
Torpeda
Цитата(svss @ Aug 29 2012, 17:05) *
Аппаратный handshake (RTS или CTS или XonOff) относится только к Вашим проводам которые здесь есть аппаратный GPIO FIFO.
То есть фишки от COM-порта нипричём. (Детали существуют, но только если Вы глубоко влезаете внутрь чипа и пользуете недокументированное, что не похоже на эту тему)

Странно, ибо с VCP драйвером - эмуляция СОМ порта должна быть 100%....
Возможно програмно и можно вычитывать СTS состояние, но при использовании FTDI.VCP драйвера оно не работает "по-чесному" как в реальном СОМ, а просто всегда поставлено в СTS=1 (чтобы обмануть программу и всегда розрешать писать в порт. по типу нульмодема).
Хотелось-бы это подтвердить документально.....
Чё-то описание особенностей роботы с FTDI.VCP драйвером не находил....
Да и странно отсутствие хендшейкинга....

Цитата(svss @ Aug 29 2012, 17:05) *
Есть аппаратный хендшейк TXE/RXF. Никаких программных настроек не требуется.

Это понятно, но это со стороны железки (FIFO), а у меня проблемы на стороне программы.
Программе тоже нужен хендшейк... При роботе с чесным ПС СОМ портом я всегда использовал хендшейкинг в программе.....

Цитата(svss @ Aug 29 2012, 17:05) *
Скорости обмена тоже нет, сколько ни устанавливайте бодрейт. Со стороны USB - скорость USB, со стороны GPIO - ваша печаль.
Вы пишете в COM-порт с любой скоростью, USB передаёт как умеет. Всё, что не выгребается со стороны GPIO прилипает в FIFO.
Как только FIFO заполняется, USB перестаёт мочь передавать, и некоторое количество байт прилипает в очередях драйвера и HAL.
Начинаются тормоза.

Это конечно странно....
При работе с D2XX драйвером, программа может получать от него обратную связь через FT_GetStatus(), FT_GetModemStatus, и тем самым не переполнять все буфера.

1) Зачем при таком розкладе тогда вообще FT_GetModemStatus, FT_SetBaudRate, FT_SetFlowControl?

2) Что тогда задаёт FT_SetBaudRate если по Вашему "Скорости обмена тоже нет, сколько ни устанавливайте бодрейт"?

3) Вопрос в том, как работать со статусом модема в VCP драйвере?
Собственно я даже умею получать состояние СTS, но оно почему-то константа....

Цитата(svss @ Aug 29 2012, 17:05) *
А, да, Вы спросили чего читать..
D2XX_Programmer's_Guide(FT000071).pdf
Страница примерно 35.
FT_GetStatus()

К сожалению это о D2XX но не о VCP драйвере....

4) Я так понял, что вы используете D2XX драйвер.
Для гарантии непереполнения буферов, вы используете FT_GetStatus().
Правильно?
А FT_GetModemStatus() пробовали (RTS\CTS)?

------------------
Кстати, неужели никто не пользуется хендшейкингом при написании Win софта при роботе с FTDI?

Цитата(alexPec @ Aug 29 2012, 15:48) *
У меня всегда выставляется битрейт, который указываю при открытии порта

А где и как Вы видете какой битрейт установился?
Torpeda
Кому интересно розвитие темы....

Цитата(svss @ Aug 29 2012, 17:05) *
Скорости обмена тоже нет, сколько ни устанавливайте бодрейт. Со стороны USB - скорость USB, со стороны GPIO - ваша печаль.
Вы пишете в COM-порт с любой скоростью, USB передаёт как умеет. Всё, что не выгребается со стороны GPIO прилипает в FIFO.
Как только FIFO заполняется, USB перестаёт мочь передавать, и некоторое количество байт прилипает в очередях драйвера и HAL.
Начинаются тормоза.

Установка разных значений битрейта COM порта действительно не влияет на битрейт со стороны FTDI.FIFO.
В любом случае получается константа большой (максимально возможной для канала USB порт - FTDI) величины.

Спасибо svss за ответы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.