Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу заставить работать CDC на LPC2378
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
Regressor
Люди добрые мы сами не местные... Эх... Не так начал...

В общем проблема в следующем - делаю некое устройство в авто на LPC2378. Само устройство будет общаться с компьютером через HID (тут все работает), плюс на это устройство заведен GPS, который устройство использует для синхронизации времени. Но ГПС также нужен на комьютере (не ставить же два). Делаю на LPC2378 составное устройство CDC serial + HID. Взял пример USB для KEIL (bundle LPC23XX_.R5/USBDEV v1.10) и немного дописал его.

На сегодняшний день устройство нормально проходит enumeration, в системе появляется HID устройство и дополнительный ком-порт (на хосте стоит Windows XP-SP3 со всеми последними обновлениями). Однако при попытке открыть устройство выдается "Не удается открыть COMx. Проверьте параметры порта."

При этом при подключении провода usb проходят 1 запрос GET_LINE_CODING и сразу следом за ним SET_LINE_CONTROL_STATE. При попытке подключения к com порту с помощью hiperterminal проходят 4! запроса GET_LINE_CODING, потом SET_LINE_CODING c параметрами spd=0, char=0, Par=0, DB=0 затем еще три GET_LINE_CODING, затем SET_LINE_CODING с параметрами spd=4800, char=0, Par=0, DB=8 (т.е. те, которые я указал при подключении), потом GET_LINE_CODING и наконец SET_LINE_CONTROL_STATE.

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

Код обработки запросов в EP0 обработчике такой:

CODE
if (SetupPacket.wIndex.WB.L == USB_CDC_IF_NUM)
{
switch (SetupPacket.bRequest)
{
case SET_LINE_CODING:
memcpy((BYTE *)&LineCoding, EP0Data.pData, 7);
USB_StatusInStage();
goto class_ok;

case GET_LINE_CODING:
memcpy(EP0Buf, (BYTE *)&LineCoding, 7);
EP0Data.pData = EP0Buf;
EP0Data.Count = 7;
USB_DataInStage();
goto class_ok;

case SET_CONTROL_LINE_STATE:
USB_StatusInStage();
goto class_ok;

// Unhandled request
default:
printf("Unhandled CDC request %d\n", SetupPacket.bRequest);
}
}



SysNucleus USBTrace показывает вот такую картинку:
Нажмите для просмотра прикрепленного файла

Структура LineCoding вроде правильно передается...
Regressor
Блин... Разобрался. Заработало... Сам дурак. Этот пример кейловский status при SET_LINE_CODING не совсем корректно отсылал. Надо ему явно в обработчике EP0Data.Count = 0; выставлять. Жаль тему грохнуть нельзя sad.gif
uriy
Попробуйте те ка для начала разными терминалками открыть ком порт. У меня какая-то беда была с виртуальными портами, правда это было с блютуз но все же. Терминалки говорили якобы порт уже кем-то занят. Перепробовал около 5 терминалок. Только вот эта Terminal by Br@y++ и MATLAB смогли открыть порт. У меня есть плата на LPC2378. Вечерами занимаюсь изучением USB. Мне нужно будет делать составное устройство AUDIO+CDC. Могу проверить в выходные у себя как будут вести себя терминалки с исходниками от кейла.
Regressor
Цитата(uriy @ Mar 6 2009, 15:03) *
Попробуйте те ка для начала разными терминалками открыть ком порт. У меня какая-то беда была с виртуальными портами, правда это было с блютуз но все же. Терминалки говорили якобы порт уже кем-то занят. Перепробовал около 5 терминалок. Только вот эта Terminal by Br@y++ и MATLAB смогли открыть порт. У меня есть плата на LPC2378. Вечерами занимаюсь изучением USB. Мне нужно будет делать составное устройство AUDIO+CDC. Могу проверить в выходные у себя как будут вести себя терминалки с исходниками от кейла.


Уже не актуально. Проблема была в том, что устройство в ответ на SET_LINE_CODING возвращало статус ненулевой с мусором из буфера. Вот и отваливалось усе. Исправил, теперь заработало, GPS данные льются. Красота. Щас правда другая беда - при подключении к порту вне зависимости от того что я указываю при подключении присылаются нулевые настройки. Т.е. скорость=0, число битов=0 и т.п. Подозреваю что это не баг, а фича микрософтового драйвера, но нигде про это ничего найти не могу. Может надо режектить нулевые настройки и тогда драйвер этот будет присылать нормальные ? Вообще все это на линухе работает - возможно usbser линуксовый не будет себя так вести...
aaarrr
Цитата(Regressor @ Mar 6 2009, 10:11) *
Щас правда другая беда - при подключении к порту вне зависимости от того что я указываю при подключении присылаются нулевые настройки. Т.е. скорость=0, число битов=0 и т.п. Подозреваю что это не баг, а фича микрософтового драйвера, но нигде про это ничего найти не могу.

Майкрософтовский usbser присылает корректные настройки, так что это баг.
Regressor
Цитата(aaarrr @ Mar 6 2009, 17:15) *
Майкрософтовский usbser присылает корректные настройки, так что это баг.


Тогда такой вопрос: А при подключении устройства микрософтовский драйвер сколько раз спрашивает GET_LINE_CODING ? У меня раз 6-7.. Типа "сколько-сколько ??". Это нормальное поведение или мое устройство все-таки некорректно отдает настройки ?
aaarrr
У меня один раз (XP SP1).
Regressor
А можешь лог снять каким-нибуть монитором - хочу попробовать сравнить. Все вроде проверил, все красиво... Но вот так вот глючит.
aaarrr
Железки сейчас под рукой нет. Последовательность запросов при подключении такая: GET_LINE_CODING -> ответ устройства -> SET_CONTROL_LINE_STATE.
Regressor
В общем победил. Оказалось в EP0 обработчике я не там обработку CDC команд сделал. Теперь все как положено работает. Самое смешное то, что в bundle софте для кейла есть три папочки - USBDEV (там HID), USBHOST (соответственно хост для LPC) и USBUSV (видео). Так вот в USBUSV есть весь нужный рабочий код для CDC кроме двух файликов (cdcuser.h cdcuser.c). Я его обнаружил после того как свой доделал. Закон подлости блин-компот.

З.Ы. А есть какой-нибуть способ выяснить на сколько грузит микроконтроллер LPC2378 USB код своими прерываниями ? Я в этих МК новичок.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.