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

 
 
> Не могу заставить работать CDC на LPC2378
Regressor
сообщение Mar 6 2009, 03:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 10-01-09
Пользователь №: 43 111



Люди добрые мы сами не местные... Эх... Не так начал...

В общем проблема в следующем - делаю некое устройство в авто на 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 вроде правильно передается...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Mar 6 2009, 07:56
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Железки сейчас под рукой нет. Последовательность запросов при подключении такая: GET_LINE_CODING -> ответ устройства -> SET_CONTROL_LINE_STATE.
Go to the top of the page
 
+Quote Post



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

 


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


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