Jump to content

    

FT245R работает со сбоями

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

Сбои не удалось устранить.

:biggrin:

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

 

Задачу решил следующим образом.

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

Если интересно - могу код приаттачить.

Интересно.

Собственно я тоже отключаю и включаю с помощья setup api, но у меня hid устройство.

Как вы обнаруживаете факт сбоя?

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

Edited by _3m

Share this post


Link to post
Share on other sites
Что-то заглох топик...

Я на досуге попробовал в линуксе хабом управлять. Получается. Но только из под рута. Или разрешить нужно. Но у меня почему-то хаб только на запросы определённые классом правильно реагирует, а на стандартные как-то странно себя ведёт. Хотя м.б. я ещё не разобрался. Разберусь получше, тогда отпишусь.

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

Сбои не удалось устранить.

Это было прогнозируемо.

Задачу решил следующим образом.

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

Если интересно - могу код приаттачить.

Мне интересно.

Share this post


Link to post
Share on other sites

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

Критика и полезные советы очень приветствуются. Хотелось бы в результате обсуждения получить не только работоспособный, но и простой, красивый и оптимизированный код

 

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 (структура...). Не могу перевести нормально, а название поиметь хочется

 

Как вы обнаруживаете факт сбоя?

 

Функции записи/чтения D2XX возвращают FT_IO_ERROR = 4. Далее при открытии функция открытия возвращает FT_INVALID_HANDLE = 1 (хендл был предварительно успешно закрыт).

На основании этого делаю вывод: сбой. И программно переподключаю устройство.

Пока только так.

К сожалению, не совсем понятно поведение функций D2XX при возникновении разного рода ошибок...

Буду рад, если кто-то предложит что-то другое.

Давайте думать и обсуждать :)

 

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

 

У меня таких сбоев пока не было :) Не знаю как это проявляется...

Пока сбои при передёргивании любой сетевой вилки или без этого...

Они возникают в период 1-2 секунды после момента подключения устройства?

А если попробовать его сразу отключать и включать при старте приложения?

 

Написал ещё функцию, которая позволяет узнать подключено устройство к ПК или нет, включено оно или выключено.

Позже выложу.

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

Share this post


Link to post
Share on other sites

мучился с фтди тоже порядочно

 

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

 

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

точно уже не помню, но в стандарте усб все параметры описаны

Share this post


Link to post
Share on other sites
мучился с фтди тоже порядочно

 

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

 

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

точно уже не помню, но в стандарте усб все параметры описаны

 

А откуда она берётся эта команда суспенда во время обмена информацией?

Ну выключил, а дальше что?

Share this post


Link to post
Share on other sites

да по стандарту все усб 1.0

 

хост периодически шлет эту команду по шине усб,

по протоколу все устройства должны замереть и ограничить потребление, уже не помню, вроде 500 мка

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

 

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

Share this post


Link to post
Share on other sites
А откуда она берётся эта команда суспенда во время обмена информацией?

Ну выключил, а дальше что?

Да нет такой команды! Что за чушь тут пишут? Не верьте. Прочтите стандарт USB.

А дальше можно поступать так, как я советовал:

http://electronix.ru/forum/index.php?showtopic=60155

Т.е. перетыкать USB шнур програмно.

Share this post


Link to post
Share on other sites

n_bogoyavlensky

 

обрабатываете ли вы сигнал PWREN# с 12 ноги микросхемы FT245R ?

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

 

 

PS. командой перехода в состояние суспенд для низкоскоростных устройств является удержание в течении более 3мс линий D+ в 0, D- в 1.

Edited by Walker2k

Share this post


Link to post
Share on other sites
PS. командой перехода в состояние суспенд для низкоскоростных устройств является удержание в течении более 3мс линий D+ в 0, D- в 1.

А причём здесь низкоскоростные устройства?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this