|
|
  |
Плохая енумерация USB устройства на CY7C68001, Как с этим бороться? |
|
|
|
Sep 25 2007, 11:53
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(Oldring @ Sep 25 2007, 10:10)  Какие у неопознанного устройства PID и VID? Вот последовательность действий, которую мне удалось поймать. 1. Начальное состояние:  2. Втыкаем устройство, оно не распознается:  3. Двойной клик на неизвестном устройстве, смотрим, ничего толкового не видим:  4. В программе USB View появляется неопознанное устройство:  Видно, что PID и VID равны нулю. 5. Наконец в менеджере устройств оно тоже появляется. Причем, никаких желтых знаков вопроса не возникает:  Цитата(Oldring @ Sep 25 2007, 10:10)  Сброс USB интерфейса устройства при включении сделан корректно? Да, вроде вполне корректно. Схему ресета я взял из их типового примера. Кроме того, микроконтроллер тоже ресетит микросхему (получается около миллисекунды). Цитата(Седой @ Sep 25 2007, 14:05)  Можно попробовать выключить и включить питание порта хаба, к которому подключено устройство. Делается это программным способом, если хаб это поддерживает.
Попробуйте также отключить и потом включить использование хаба в диспетчере устройств. Хм... Интересная мысль... А можно ли это сделать программно? А то я ни выключать питание хаба, ни выключать его использование программно не умею.
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Sep 25 2007, 14:25
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(jur @ Sep 25 2007, 14:53)  Кроме того, микроконтроллер тоже ресетит микросхему (получается около миллисекунды). Может быть в этом и дело... Из "EZ-USB® Technical Reference Manual" (ez_usb_r___technical_reference_manual__trm__14.pdf): "If the EZ-USB’s XTALIN pin is driven by an external clock source that continues to run while the chip is in reset, RESET# need only be asserted for 200 μs. Otherwise, it must be asserted for at least 5 ms." Цитата(jur @ Sep 25 2007, 14:53)  Хм... Интересная мысль... А можно ли это сделать программно? А то я ни выключать питание хаба, ни выключать его использование программно не умею. Присоединяюсь к вопросу. Как программно выключать/включать питание для USB устройства, подключенного к одному из портов хаба?
|
|
|
|
|
Sep 25 2007, 18:01
|
Местный
  
Группа: Свой
Сообщений: 244
Регистрация: 21-02-05
Из: Урал
Пользователь №: 2 806

|
Цитата Присоединяюсь к вопросу. Как программно выключать/включать питание для USB устройства, подключенного к одному из портов хаба? 1. Открыть драйвер хаба. 2. Вызвать DeviceIoControl с кодом IOCTL_USB_HCD_DISABLE_PORT 3. Вызвать DeviceIoControl с кодом IOCTL_USB_HCD_ENABLE_PORT 4. Закрыть драйвер хаба. В Windows XP можно и через прямой вызов CLEAR_FEATURE и SET_FEATURE Более детально см. usbioctl.h и usbuser.h в DDK. PS. Более простой способ http://www.usb.org/phpbb/viewtopic.php?t=1...highlight=resetPS1. Еще можно использовать утилиту devcon (в DDK ее исходник), скачать http://support.microsoft.com/?kbid=311272
Сообщение отредактировал Седой - Sep 25 2007, 18:51
|
|
|
|
|
Sep 26 2007, 09:01
|
Участник

Группа: Новичок
Сообщений: 17
Регистрация: 27-09-05
Пользователь №: 8 995

|
[/quote] Я правда под Linux, но жду сигнала ENUMOK и если не нужный режим или еще что-то, то сброс CY7C68001, который определяется как физическое отключение и, затем происходит повторная инициализация.
|
|
|
|
|
Sep 26 2007, 19:35
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(Oldring @ Sep 25 2007, 16:52)  Я, к сожалению, не имею понятия, какая схема ресета в этом даташите. Искать его лень. Это self powered устройство? Прошу прощения, забыл указать, что устройство имеет свой источник питания. Цитата(Oldring @ Sep 25 2007, 16:52)  То, что устройство Low speed - это так и задумано, или глюк? Low speed - это результат того, что Винда не распознала устройство, поэтому считает, что имеет дело с какой-то паршивой мышью! ;-) И еще прошу прощения, к сожалению не заметил темы "Нестабильное определение USB устройства". Моя проблема во многом схожа. С той разницей, что я внешних элементов не использую. Цитата(Konst_777 @ Sep 25 2007, 17:25)  Может быть в этом и дело... Из "EZ-USB® Technical Reference Manual" (ez_usb_r___technical_reference_manual__trm__14.pdf): "If the EZ-USB’s XTALIN pin is driven by an external clock source that continues to run while the chip is in reset, RESET# need only be asserted for 200 μs. Otherwise, it must be asserted for at least 5 ms." Большое спасибо за подсказку! Попробую углубиться в этот вопрос. Кстати, нашел корявое, но работающее решение. Микроконтроллер проверяет выполнение енумерации, и в случае неудачи просто слепо ресетит микросхему и пытается еще раз. После < 10 попыток енумерация происходит. Хотя, чувствую - коряво... :-) Цитата(Седой @ Sep 25 2007, 21:01)  1. Открыть драйвер хаба. ... В Windows XP можно и через прямой вызов CLEAR_FEATURE и SET_FEATURE Более детально см. usbioctl.h и usbuser.h в DDK. ... Большое спасибо! Попробую. Цитата(al333 @ Sep 26 2007, 12:01)  Я правда под Linux, но жду сигнала ENUMOK и если не нужный режим или еще что-то, то сброс CY7C68001, который определяется как физическое отключение и, затем происходит повторная инициализация. Во-во. Я тоже к этому же пришел, только под Виндой :-) Видать, путь правильный. Хоть и корявый...
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Sep 26 2007, 20:05
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(jur @ Sep 26 2007, 23:35)  Low speed - это результат того, что Винда не распознала устройство, поэтому считает, что имеет дело с какой-то паршивой мышью! ;-) Это мне кажется очень странным. В аналогичной ситуации, когда некоторое левое устройство не запускалось и выдавались нулевые PID и VID, если я уже не ошибаюсь, все-равно устройство диагностировалось как Full Speed. Проверьте, правильно ли устройство подтягивает линии данных после ресета в случае некорректного запуска. Если неправильно - то это явный признак, что у Вас ресет просто не всегда срабатывает. P.S. Заглянул в даташит, что рекомендуют производители этого кристалла по поводу ресета. Рекомендуют они лажу. По крайней мере для bus powered устройств. RC цепь в качестве ресета для них просто недопустима, так как скорость нарастания напряжения питания на USB шине в USB спецификации не нормирована. Так что будьте осторожны.
--------------------
Пишите в личку.
|
|
|
|
|
Sep 27 2007, 19:46
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(Oldring @ Sep 26 2007, 23:05)  P.S. Заглянул в даташит, что рекомендуют производители этого кристалла по поводу ресета. Рекомендуют они лажу. По крайней мере для bus powered устройств. RC цепь в качестве ресета для них просто недопустима, так как скорость нарастания напряжения питания на USB шине в USB спецификации не нормирована. Так что будьте осторожны. Да, спасибо за подсказку! Этот чертов ресет... Вещь в себе. Я теперь ресет делаю вообще только с помощью микроконтроллера. И его длительность тоже задаю приличную. Если что-то не получается, то я отключаюсь от USB на пару сотен миллисекунд, и только после этого снова подключаюсь и снова енумерируюсь. Сейчас хочу поиграться с этими временами, подобрать оптимальную длительность.
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Sep 28 2007, 09:06
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
"Читаем дальше..." © Жванецкий :-) Подача ресета достаточной длительности хорошо помогает. Но я обнаружил еще один интересный эффект. Вот последовательность моих действий. 1. Включаю устройство. Микроконтроллер вызывает функцию USB_Init(), которая подает ресет на CY7C68001, программирует нужные регистры, загружает дескриптор и ждет завершения енумерации. 2. Когда приходит прерывание ENUMOK, микроконтроллер проверяет бит HSGRANT и возвращает OK. 3. Я сделал отладочную команду, которая позволяет вручную вызвать USB_Init(). Все инициализируется заново и устройство появляется в системе как High Speed, что мне и нужно. 4. Однако. USB_Init() всегда рапортует Full Speed и содержимое регистра 0x2D бывает 0 или 1! Что за чертовщина?! Смотрю в USB View - все нормально, устройство High Speed. Вызываю другую отладочную команду для дампа регистров CY7C68001 - тоже все нормально, регистр 0x2D равен 0x81. Выяснилось, что содержимое этого регистра меняется так: 0x00 -> 0x01 -> 0x81, или так 0x00 -> 0x80 -> 0x81. Таким образом получается, что при повторных енумерациях я не могу сразу после прерывания ENUMOK проверять бит HSGRANT. Пришлось сделать такой цикл проверки: Код byte b;
for(try_counter = 0;try_counter < 20;try_counter++) { delay(100); b = ReadRegister(0x2D); if((b & 0x7F) && (b & 0x80)) break; } После двух-трех считываний этого регистра цикл прерывается и все работает как мне нужно (устройство получает High Speed). Как-то криво это... Но работает :-)
--------------------
MPEG-4 - в массы!
|
|
|
|
|
Sep 28 2007, 15:49
|
Местный
  
Группа: Свой
Сообщений: 205
Регистрация: 16-10-05
Пользователь №: 9 704

|
Цитата(Oldring @ Sep 28 2007, 12:22)  МОжет быть дело просто в том, что High Speed устройства первоначально запускаются в режиме Full Speed и только потом переводятся в режим High Speed? Совершенно справедливо, скорее всего именно это и происходит. Но сайпрессовцы могли бы хоть пол-словом об этом обмолвиться! :-) (Во всяком случае я как-то не припомню, чтобы такая инфа попадалась мне на глаза.) Я ведь как рассуждаю. Если пришло прерывание ENUMOK, то резонно предположить, что этап енумерации завершен и устройство готово к работе. Логично? А получается, что оно ни хрена не готово! Оно станет готово только через бог знает сколько времени. У них даже в каком-то примере есть такой пассаж: после енумерации проверяется бит HSGRANT и соответствующим образом устанавливаются размеры рабочих буферов! Т.е. я, как дурак, повыставляю размеры буферов 64 байта, а вскорости окажется, что можно работать с размером 512 байт. (А в данный момент я вообще без 512 байт никуда. Мое устройство просто не будет работать.) Че-то в этом месте как-то туманно... Я уже попробовал по их аппнотам пошерстить - на эту тему ничего не заметил. Может в техподдержку обратиться?... Наверное придется, т.к. вопрос все-таки сложный: как узнать, что енумерация все-таки уже совсем-совсем завершилась?...
--------------------
MPEG-4 - в массы!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|