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

 
 
 
Reply to this topicStart new topic
> Не могу заставить работать 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
Regressor
сообщение Mar 6 2009, 04:59
Сообщение #2


Участник
*

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



Блин... Разобрался. Заработало... Сам дурак. Этот пример кейловский status при SET_LINE_CODING не совсем корректно отсылал. Надо ему явно в обработчике EP0Data.Count = 0; выставлять. Жаль тему грохнуть нельзя sad.gif
Go to the top of the page
 
+Quote Post
uriy
сообщение Mar 6 2009, 05:03
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Попробуйте те ка для начала разными терминалками открыть ком порт. У меня какая-то беда была с виртуальными портами, правда это было с блютуз но все же. Терминалки говорили якобы порт уже кем-то занят. Перепробовал около 5 терминалок. Только вот эта Terminal by Br@y++ и MATLAB смогли открыть порт. У меня есть плата на LPC2378. Вечерами занимаюсь изучением USB. Мне нужно будет делать составное устройство AUDIO+CDC. Могу проверить в выходные у себя как будут вести себя терминалки с исходниками от кейла.
Go to the top of the page
 
+Quote Post
Regressor
сообщение Mar 6 2009, 07:11
Сообщение #4


Участник
*

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



Цитата(uriy @ Mar 6 2009, 15:03) *
Попробуйте те ка для начала разными терминалками открыть ком порт. У меня какая-то беда была с виртуальными портами, правда это было с блютуз но все же. Терминалки говорили якобы порт уже кем-то занят. Перепробовал около 5 терминалок. Только вот эта Terminal by Br@y++ и MATLAB смогли открыть порт. У меня есть плата на LPC2378. Вечерами занимаюсь изучением USB. Мне нужно будет делать составное устройство AUDIO+CDC. Могу проверить в выходные у себя как будут вести себя терминалки с исходниками от кейла.


Уже не актуально. Проблема была в том, что устройство в ответ на SET_LINE_CODING возвращало статус ненулевой с мусором из буфера. Вот и отваливалось усе. Исправил, теперь заработало, GPS данные льются. Красота. Щас правда другая беда - при подключении к порту вне зависимости от того что я указываю при подключении присылаются нулевые настройки. Т.е. скорость=0, число битов=0 и т.п. Подозреваю что это не баг, а фича микрософтового драйвера, но нигде про это ничего найти не могу. Может надо режектить нулевые настройки и тогда драйвер этот будет присылать нормальные ? Вообще все это на линухе работает - возможно usbser линуксовый не будет себя так вести...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 6 2009, 07:15
Сообщение #5


Гуру
******

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



Цитата(Regressor @ Mar 6 2009, 10:11) *
Щас правда другая беда - при подключении к порту вне зависимости от того что я указываю при подключении присылаются нулевые настройки. Т.е. скорость=0, число битов=0 и т.п. Подозреваю что это не баг, а фича микрософтового драйвера, но нигде про это ничего найти не могу.

Майкрософтовский usbser присылает корректные настройки, так что это баг.
Go to the top of the page
 
+Quote Post
Regressor
сообщение Mar 6 2009, 07:20
Сообщение #6


Участник
*

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



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


Тогда такой вопрос: А при подключении устройства микрософтовский драйвер сколько раз спрашивает GET_LINE_CODING ? У меня раз 6-7.. Типа "сколько-сколько ??". Это нормальное поведение или мое устройство все-таки некорректно отдает настройки ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 6 2009, 07:33
Сообщение #7


Гуру
******

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



У меня один раз (XP SP1).
Go to the top of the page
 
+Quote Post
Regressor
сообщение Mar 6 2009, 07:45
Сообщение #8


Участник
*

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



А можешь лог снять каким-нибуть монитором - хочу попробовать сравнить. Все вроде проверил, все красиво... Но вот так вот глючит.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 6 2009, 07:56
Сообщение #9


Гуру
******

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



Железки сейчас под рукой нет. Последовательность запросов при подключении такая: GET_LINE_CODING -> ответ устройства -> SET_CONTROL_LINE_STATE.
Go to the top of the page
 
+Quote Post
Regressor
сообщение Mar 10 2009, 02:39
Сообщение #10


Участник
*

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



В общем победил. Оказалось в EP0 обработчике я не там обработку CDC команд сделал. Теперь все как положено работает. Самое смешное то, что в bundle софте для кейла есть три папочки - USBDEV (там HID), USBHOST (соответственно хост для LPC) и USBUSV (видео). Так вот в USBUSV есть весь нужный рабочий код для CDC кроме двух файликов (cdcuser.h cdcuser.c). Я его обнаружил после того как свой доделал. Закон подлости блин-компот.

З.Ы. А есть какой-нибуть способ выяснить на сколько грузит микроконтроллер LPC2378 USB код своими прерываниями ? Я в этих МК новичок.
Go to the top of the page
 
+Quote Post

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

 


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


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