Здравствуйте. Собрал на базе примера CDC- basic USB девайс Full-Speed USB 2.0 на PIC18F4550 с эмуляцией COM-порта. Железка тупо либо по команде включает одно из реле либо в ответ на команду получает текущее время от RTCC по I2C и отдает инфу в USB. Все работает и посылается проблем нет. НО! спонтанно возникает проблема того что девайс по непонятной причине отключается при очередном нажатии на любую клавишу терминала на компе предположительно под Win7/Server 2008R2.
Драйвера все родные. Пакет MLA самый последний. Поставил сниффер USB и обнаружил что мой девайс по какой-то причине посылает сам без инициации от терминальной программки (Putty) BULK трансфер с 0-ым количеством байт со статусом 0xc00000004, после чего нажав на любую клавишу в терминалке - она отваливается, но само устройство остается в Диспетчере оборудования, однако, уже заново к нему нельзя подключиться.
Вот пакет:
000592: Bulk or Interrupt Transfer (UP), 2016-12-06 15:40:24,5811831 +1741,2981226. (1. Device: USB Serial Port (COM9)) Status: 0xc0000004
Pipe Handle: 0x9bb02f8 (Endpoint Address: 0x82)
Get 0x0 bytes from the device
Попытка заново подключится - Unable to configure device. что то такое...
Причем в Диспетчере - работает нормально. И сам ПИК не висит - поставил прерывания на светодиодик и реакцию на кнопочку.
За более 3х недель поисков не нашел никакой зависимости от каких-либо моих действий или бездействий
вот что делал:
1. Отключал и app_device_cdc_demo - чтобы девайс вообще ничего не остылал и никак не реагировал на посылаемые данные от хоста.
2. Увеличил клокинг core с 20 МГц напрямую кварца до 48МГц через PLL (думал не хватает производительности)
3. До минимума убрал все переменные дабы исключить случайное перекрывание памяти банков RAM 0x400-0x500 которые юзаются USB-стеком
4. Удалил код до минимума. Короче оставил фактически собственно сам оригинал только убрав кнопки и леды которые мне не нужны.
5. Пробовал разные компы с Win7/Server2008R2 и т.п.
6. Проверил Питание 5.0В на всех компах. Помехи осциллом однако не проверял
Один фиг всё что выше никак не повлияло на устранение или изменение характера появления ошибки.
Дома на компе с WinXP и роутере TPLink 3020 c OpenWRT(самой последней на вчера прошивкой) попробовал тоже подключать девайс - и вот почему то там ни на XP ни на Linux проблемы я ни разу не обнаружил. Поставил тот же сниффер на XP и этого "пустого" финального пакета от устройства тоже ни разу за каждодневные поиски и работы не нашел. Устройство работает стабильно в течение как минимум 8-12 часов что на XP что на OpenWRT через /dev/ttyACM0.
Сегодня обнаружил вот такое интересное дело. У меня 4 разных кабеля usb-миниusb. На работе подключаюсь либо через кабель от кард-ридера. И случайно решил подключить устройство через оригинальный красный кабель от PICKIT3. Мое удивление: - мой девайс что с моей программой что с оригом CDC-Basic Example пишет в Диспетчере - Unknown Device. Тут же в том же порте USB сервака 2008 или Win7 втыкаю кабель usb-miniusb от кард-ридера - все окей. Причем сам PICKIT3 работает от своего красного кабеля великолепно в течение уже нескольких лет пользования. Равно кстати как и от кардридеровского кабеля.
Вот теперь задумался - может я что-то нарушил с разводкой на плате с пинами USB? Было ли у кого что подобное и кто как экранирует USB разъем на плате своих устройств. Экранируете ли вы дорожки от MCU до разъема и вообще интересно было бы мне знать кто с чем сталкивался.
Дома пробовал только через кабель от ридера. Сегодня решил попробовать на XP все кабели. Может я тупо ищу ошибку в воздухе.
Ради справедливости замечу что с CDC Basic Example я и ни разу тоже ошибки подобной не получил, но и не тестил долго. что собственно вот в данный момент и делаю
PS. Замечу что дома другие кабели, причем один из них длиной 50 см и сегодня и завтра попробую с разными кабелями.
Всё равно, может кто сталкивался с подобным - намекните хотя бы куда рыть. В инете на тему аналогичной моей проблемы вообще ничего нет