galjoen 0 8 марта, 2009 Опубликовано 8 марта, 2009 · Жалоба Предисловие: Я давно пользуюсь данным приёмом, но не хотел предавать его огласке. Считал, что это моё конкурентное преимущество. И действительно. В частности за счёт этого мой USB девайс выиграл тендер. Т.к. во время испытаний у конкурентов девайс вешался, а у меня нет. Т.е. у меня тоже вешался, но потом сам развешивался. Но теперь я как-то осознал себя в одной лодке с другими разработчиками. Да ещё меня в другой ветке похвалили за то, что я выложил то, что по моему мнению было всем известно. Я предполагаю, что такой приём некоторые знают, но молчат, как молчал я. Пишу это в надежде, что и другие, кому есть что сказать, последуют моему примеру. Проблемма: USB девайсы бывает вешаются. Обсуждалось это и здесь. Пришли к выводу, что это хаб блокирует порт к которому подключен девайс. Разблокировать программно его можно (см. параллельные ветки). Но что делать в тех случаях, когда нельзя ставить/запускать никаких программ. Например ваш девайс это MassStorage с записанным в нем логом. Или HID, к которому обращаются стандартной программой. Или CDC с чужой программой? Решение - теория: Когда хаб блокирует порт, то со стороны девайса это воспринимается как переход в Suspend. Т.е. нужно засыпать, потребляя не более 500 микроампер. А различить со стороны девайса реальный Suspend и блокировку порта хабом невозможно. Невозможно без некоторых действий. Если девайс отключит свой подтягивающий резистор к D+, то хаб воспримет это как отключение девайса. Со стороны хаба это неотличимо. А раз девайс вытащили, то хаб переводит порт из заблокированного состояния в отключенное. При последующем подключении, хаб решит, что в этот порт воткнут новый/другой девайс и все начнет работать. Причём это никак не противоречит спецификации USB. Решение - практика: Когда мой девайс видит на шине USB состояние Suspend, он действительно засыпает и потребляет при этом не более 500 микроампер. Т.е. удовлетворяет всем спецификациям USB. НО. Периодически обычно раз в 2 секунды он отключает свой подтягивающий резистор на время более 2,5 микросекунд. Реально я делаю около 20 милисекуд и процессор у меня в это время спит. Проснувшись он подключает подтягивающий резистор и смотрит на реакцию шины. По описанию вроде д.б. в течении 15 милисекунд, но реально надо делать побольше. Если ничего не произошло - спит дальше. Появилась активность, пошла энумерация - девайс различает такой вариан от первого втыкания в USB. Данный способ можно реализовать даже и на FTDI и подобных микросхемах. У них обычно есть выход Suspend. Хотя лично мне эти переходники крайне не нравятся. ИМХО они допустимы ТОЛЬКО как временная мера. Заключение: Описанный способ это крайняя мера. Он не предназначен для исправления программных ляпов. Мне он видится чем-то подобным сторожевому таймеру. Надеюсь, что вы не будете уповать только на этот способ, но и будете отлаживать свой девайсы. Хотя в случае FTDI других способов и нет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Trashy_2 1 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба Поставь в шине D+ D- common mode filter. Потом хоть взрывай свой девайс. Хрен повиснет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба Поставь в шине D+ D- common mode filter. Потом хоть взрывай свой девайс. Хрен повиснет. Даже в некоторых USB флешках стоит маленький продольный трансформатор. Но не спасает... А большой ставить нельзя т.к. в USB в т.ч. и сингфазные сигналы для связи используются. Т.е. вообще работать не будет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 11 марта, 2009 Опубликовано 11 марта, 2009 · Жалоба Я как-то работал с платой, где в цепи D+/D- стоял подобный трансформатор. Так вот никакими способами (программными) мне не удалось добиться устойчивой enumeration с usb device, пока этот самый трансформатор не был закорочен. После этого в серийных устройствах мы такое решение не применяем и проблема не проявлялась. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Седой 0 23 марта, 2009 Опубликовано 23 марта, 2009 · Жалоба Я как-то работал с платой, где в цепи D+/D- стоял подобный трансформатор. Так вот никакими способами (программными) мне не удалось добиться устойчивой enumeration с usb device, пока этот самый трансформатор не был закорочен. После этого в серийных устройствах мы такое решение не применяем и проблема не проявлялась. Странно, а мы ставим (DLW21Hxxx) проблем нет. Может все-таки правильно подбирать номинал нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться