Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FT245R работает со сбоями
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Страницы: 1, 2, 3
_3m
Цитата(AndreyS @ Feb 19 2009, 17:27) *
Ну первое что лично мне не понравилось это несимметричная линия D+ и D-. Зачем нужно было ставить два переходных отверстия?? Да еще и с поворотом в 90 градусов, хотя и без прямых углов.

Для Full speed устройств сильно париться с разводкой не надо. Для 480 мегабит - да, надо аккуратно разводить.
Седой
Цитата(_3m @ Feb 19 2009, 20:53) *
Для Full speed устройств сильно париться с разводкой не надо. Для 480 мегабит - да, надо аккуратно разводить.

ИМХО.Чтобы потом не было мучительно больно, с разводкой нужно "париться" всегда, на любой плате.
koluna
1. Запитал ещё и левую часть конвертора от внешнего источника. Настроил в Self powered.
2. На RESET# FT245R повесил 10 нФ керамику, по одной из рекомендаций.

Сбои не исчезли.

Пробую с D2XX.
После возникновения сбоя функции чтения/записи возвращают ошибку FT_IO_ERROR = 4.
Пробовал сразу после их вызова в обработчике ошибок FT_CyclePort, FT_ResetPort - возвращают то же самое. Т. е., не работают они...

Цитата(Седой @ Feb 10 2009, 20:08) *
Сейчас просмотрел документацию на драйвера FTDI.
Можно же работать не через COM порт, а через D2XX интерфейс и попробовать воспользоваться функцией FT_ResetPort (FT_ResetDevice,FT_CyclePort) для выхода из ошибочного состояния.


Вот не работают они...
Да и описание какое-то скудное у них в Programmers Guide...
koluna
Следующее.

Продолжаю работать с D2XX.
При возникновении сбоя теперь моё приложение не виснет как с VCP.
Обмен данными отменяется. Устройство закрывается. Но при открытии устройства вновь возникает ошибка (FT_INVALID_HANDLE = 1)!
После передёргивания шнурка или после выбора в Диспетчере устройств пунктов меню "Отключить/Задействовать" устройство нормально открывается и функционирует...

Кстати, есть у кого-нибудь подробное описание функций D2XX?
Ошибок, возвращаемых функциями D2XX?

Вот, например, "FT_INVALID_HANDLE", "FT_IO_EROR" - что это значит?
koluna
Что-то заглох топик...

Проведено множество экспериментов и доработка устройства.
Сбои не удалось устранить.

Задачу решил следующим образом.
Отлавливаю возникновение сбоев и программно с помощью SetupAPI отключаю и включаю устройство. Как советовали.
Если интересно - могу код приаттачить.
_3m
Цитата(n_bogoyavlensky @ Mar 5 2009, 12:13) *
Проведено множество экспериментов и доработка устройства.
Сбои не удалось устранить.

biggrin.gif
Не удивительно, я подозреваю что разработчики усб интерфейса предусмотрели абсолютно все чтобы даже самый упорный разработчик не смог обеспечить его долговременную бесперебойную работу.

Цитата
Задачу решил следующим образом.
Отлавливаю возникновение сбоев и программно с помощью SetupAPI отключаю и включаю устройство. Как советовали.
Если интересно - могу код приаттачить.

Интересно.
Собственно я тоже отключаю и включаю с помощья setup api, но у меня hid устройство.
Как вы обнаруживаете факт сбоя?
И самое главное: удалось ли вам обнаружить и обойти сбой, возникший в процессе енумерации. Мне это не удалось.
galjoen
Цитата(n_bogoyavlensky @ Mar 5 2009, 12:13) *
Что-то заглох топик...

Я на досуге попробовал в линуксе хабом управлять. Получается. Но только из под рута. Или разрешить нужно. Но у меня почему-то хаб только на запросы определённые классом правильно реагирует, а на стандартные как-то странно себя ведёт. Хотя м.б. я ещё не разобрался. Разберусь получше, тогда отпишусь.
Цитата(n_bogoyavlensky @ Mar 5 2009, 12:13) *
Проведено множество экспериментов и доработка устройства.
Сбои не удалось устранить.

Это было прогнозируемо.
Цитата(n_bogoyavlensky @ Mar 5 2009, 12:13) *
Задачу решил следующим образом.
Отлавливаю возникновение сбоев и программно с помощью SetupAPI отключаю и включаю устройство. Как советовали.
Если интересно - могу код приаттачить.

Мне интересно.
koluna
Привожу свой код функции (работоспособный), которая выключает/включает устройство по коду экземпляра устройства.
Критика и полезные советы очень приветствуются. Хотелось бы в результате обсуждения получить не только работоспособный, но и простой, красивый и оптимизированный код

Код
function On_Off_Device(PnPID: PAnsiChar; State: Boolean): Boolean;

var
  DeviceInfoSet_ : HDEVINFO; // Хендл набора информации об устройствах.
  DeviceInfoData_ : TSPDevInfoData; // Структура информации об устройстве.
  SPPropChangeParams_ : TSPPropChangeParams;

begin
  DeviceInfoSet_ := nil;
// Получение хендла набора информации об устройстве по коду экземпляра устройства.
  DeviceInfoSet_ := SetupDiGetClassDevs(nil, PnPID, 0, DIGCF_ALLCLASSES or DIGCF_DEVICEINTERFACE);
  if Integer(DeviceInfoSet_) = INVALID_HANDLE_VALUE then
  begin
// Ошибка.
    Result := False;
    Exit;
  end
  else
  begin
// Хендл набора информации об устройстве получен.
    FillChar(DeviceInfoData_, SizeOf(TSPDevInfoData), 0);
    DeviceInfoData_.cbSize := SizeOf(TSPDevInfoData);
// Заполнение структуры информации об устройстве.
    if not SetupDiEnumDeviceInfo(DeviceInfoSet_, 0, DeviceInfoData_) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;

// Установка полей структуры
    SPPropChangeParams_.ClassInstallHeader.cbSize := SizeOf(TSPClassInstallHeader);
    SPPropChangeParams_.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
    SPPropChangeParams_.Scope := DICS_FLAG_GLOBAL;

    if State then SPPropChangeParams_.StateChange := DICS_ENABLE
    else SPPropChangeParams_.StateChange := DICS_DISABLE;

// Изменение состояния устройства.
    if not SetupDiSetClassInstallParams(DeviceInfoSet_,
                                        @DeviceInfoData_,
                                        @SPPropChangeParams_,
                                        SizeOf(TSPPropChangeParams)) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;
// Подтверждение изменения состояния устройства
// (повторный вызов функции SetupDiSetClassInstallParams).
    if not SetupDiSetClassInstallParams(DeviceInfoSet_,
                                        @DeviceInfoData_,
                                        @SPPropChangeParams_,
                                        SizeOf(TSPPropChangeParams)) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;

// Вызов установщика классов.
    if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DeviceInfoSet_, @DeviceInfoData_) then
    begin
// Ошибка.
      SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
      Result := False;
      Exit;
    end;

  end; // Integer(DeviceInfoSet_) <> INVALID_HANDLE_VALUE

  Result := True;
// Освобождение хендла набора информации об устройствах.
  SetupDiDestroyDeviceInfoList(DeviceInfoSet_);
end;


Попутно - несколько вопросов.

1. При вызове моей функции с параметром False для отключении устройства N раз подряд, чтобы включить устройство приходится вызывать эту функцию с параметром True тоже N раз подряд. Как будто где-то есть счётчик включения/выключения... Почему и зачем?
2. Хотелось бы прояснить работу SetupDiGetClassDevs. Без флага DIGCF_DEVICEINTERFACE - моя функция не работает. Хотя в других примерах видел вызывы и без этого флага (с параметром Enumerator!). Не понятна связь между параметром Enumerator и флагом DIGCF_DEVICEINTERFACE.
3. Хотелось бы знать как можно назвать по-русски следующие структуры, используемые при вызове функций: HDEVINFO (хендл на структуру ...), TSPDevInfoData (структура ...), TSPPropChangeParams (структура...). Не могу перевести нормально, а название поиметь хочется

Цитата(_3m @ Mar 5 2009, 21:04) *
Как вы обнаруживаете факт сбоя?


Функции записи/чтения D2XX возвращают FT_IO_ERROR = 4. Далее при открытии функция открытия возвращает FT_INVALID_HANDLE = 1 (хендл был предварительно успешно закрыт).
На основании этого делаю вывод: сбой. И программно переподключаю устройство.
Пока только так.
К сожалению, не совсем понятно поведение функций D2XX при возникновении разного рода ошибок...
Буду рад, если кто-то предложит что-то другое.
Давайте думать и обсуждать smile.gif

Цитата
И самое главное: удалось ли вам обнаружить и обойти сбой, возникший в процессе енумерации. Мне это не удалось.


У меня таких сбоев пока не было smile.gif Не знаю как это проявляется...
Пока сбои при передёргивании любой сетевой вилки или без этого...
Они возникают в период 1-2 секунды после момента подключения устройства?
А если попробовать его сразу отключать и включать при старте приложения?

Написал ещё функцию, которая позволяет узнать подключено устройство к ПК или нет, включено оно или выключено.
Позже выложу.
Может, напишу ещё функцию поиска какую-нибудь... а то как видно из последующего моего топика (http://electronix.ru/forum/index.php?showtopic=59971) - у FTDI с возвращением информации об устройстве проблемы...
Walker2k
мучился с фтди тоже порядочно

была проблема с режимом суспенд, из-за которого все и подвисало

надо аппаратно детектить команду суспенда и выключать все потребители на это время
точно уже не помню, но в стандарте усб все параметры описаны
koluna
Цитата(Walker2k @ Apr 17 2009, 08:40) *
мучился с фтди тоже порядочно

была проблема с режимом суспенд, из-за которого все и подвисало

надо аппаратно детектить команду суспенда и выключать все потребители на это время
точно уже не помню, но в стандарте усб все параметры описаны


А откуда она берётся эта команда суспенда во время обмена информацией?
Ну выключил, а дальше что?
Walker2k
да по стандарту все усб 1.0

хост периодически шлет эту команду по шине усб,
по протоколу все устройства должны замереть и ограничить потребление, уже не помню, вроде 500 мка
там линии Д+ и Д- в какое-то свое состояние встают, жесткая логика это детектит и питание схемы отрубает, пока линии из этой позы не выйдут

а проявлялось на устройстве с фтди так, все нормально отрабатывалось - данные передавались без проблем, пока не наступала пауза в передаче данных, после этого устройство подвисало, программно не ресетилось и вывести его было можно лишь передернув усб кабель из компа
galjoen
Цитата(n_bogoyavlensky @ Apr 17 2009, 11:00) *
А откуда она берётся эта команда суспенда во время обмена информацией?
Ну выключил, а дальше что?

Да нет такой команды! Что за чушь тут пишут? Не верьте. Прочтите стандарт USB.
А дальше можно поступать так, как я советовал:
http://electronix.ru/forum/index.php?showtopic=60155
Т.е. перетыкать USB шнур програмно.
Walker2k
n_bogoyavlensky

обрабатываете ли вы сигнал PWREN# с 12 ноги микросхемы FT245R ?
при состоянии PWREN# = 1, ваше устройство должно потреблять не более 500мкА


PS. командой перехода в состояние суспенд для низкоскоростных устройств является удержание в течении более 3мс линий D+ в 0, D- в 1.
galjoen
Цитата(Walker2k @ Apr 21 2009, 14:39) *
PS. командой перехода в состояние суспенд для низкоскоростных устройств является удержание в течении более 3мс линий D+ в 0, D- в 1.

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