Перейти к содержанию
    

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

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

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

:biggrin:

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

 

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

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

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

Интересно.

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

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

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

Изменено пользователем _3m

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то заглох топик...

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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 с возвращением информации об устройстве проблемы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

n_bogoyavlensky

 

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

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

 

 

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

Изменено пользователем Walker2k

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...