реклама на сайте
подробности

 
 
8 страниц V  « < 6 7 8  
Reply to this topicStart new topic
> FT245R работает со сбоями
_3m
сообщение Mar 5 2009, 17:04
Сообщение #106


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(n_bogoyavlensky @ Mar 5 2009, 12:13) *
Проведено множество экспериментов и доработка устройства.
Сбои не удалось устранить.

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

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

Интересно.
Собственно я тоже отключаю и включаю с помощья setup api, но у меня hid устройство.
Как вы обнаруживаете факт сбоя?
И самое главное: удалось ли вам обнаружить и обойти сбой, возникший в процессе енумерации. Мне это не удалось.

Сообщение отредактировал _3m - Mar 5 2009, 17:05
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 5 2009, 17:13
Сообщение #107


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(n_bogoyavlensky @ Mar 5 2009, 12:13) *
Что-то заглох топик...

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

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

Мне интересно.
Go to the top of the page
 
+Quote Post
koluna
сообщение Mar 6 2009, 05:58
Сообщение #108


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



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

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


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Walker2k
сообщение Apr 17 2009, 05:40
Сообщение #109





Группа: Новичок
Сообщений: 5
Регистрация: 11-10-06
Из: Москва
Пользователь №: 21 212



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

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

надо аппаратно детектить команду суспенда и выключать все потребители на это время
точно уже не помню, но в стандарте усб все параметры описаны
Go to the top of the page
 
+Quote Post
koluna
сообщение Apr 17 2009, 07:00
Сообщение #110


Профессионал
*****

Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061



Цитата(Walker2k @ Apr 17 2009, 08:40) *
мучился с фтди тоже порядочно

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

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


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


--------------------
Благодарю заранее!
Go to the top of the page
 
+Quote Post
Walker2k
сообщение Apr 17 2009, 07:48
Сообщение #111





Группа: Новичок
Сообщений: 5
Регистрация: 11-10-06
Из: Москва
Пользователь №: 21 212



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

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

а проявлялось на устройстве с фтди так, все нормально отрабатывалось - данные передавались без проблем, пока не наступала пауза в передаче данных, после этого устройство подвисало, программно не ресетилось и вывести его было можно лишь передернув усб кабель из компа
Go to the top of the page
 
+Quote Post
galjoen
сообщение Apr 17 2009, 12:35
Сообщение #112


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



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

Да нет такой команды! Что за чушь тут пишут? Не верьте. Прочтите стандарт USB.
А дальше можно поступать так, как я советовал:
http://electronix.ru/forum/index.php?showtopic=60155
Т.е. перетыкать USB шнур програмно.
Go to the top of the page
 
+Quote Post
Walker2k
сообщение Apr 21 2009, 10:39
Сообщение #113





Группа: Новичок
Сообщений: 5
Регистрация: 11-10-06
Из: Москва
Пользователь №: 21 212



n_bogoyavlensky

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


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

Сообщение отредактировал Walker2k - Apr 21 2009, 11:00
Go to the top of the page
 
+Quote Post
galjoen
сообщение Apr 21 2009, 15:27
Сообщение #114


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



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

А причём здесь низкоскоростные устройства?
Go to the top of the page
 
+Quote Post

8 страниц V  « < 6 7 8
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016