|
USB LPC2000, как работае |
|
|
|
Aug 7 2008, 13:03
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Привет! Народ помогите, в конец замучался. На ЛПЦ 2148 пытаюсь реализовать ХИД девайс. Проблема что не могу отправить усб сообщение через нулевую контрольную точку. Принимать сообщения принимаю и правильные, но дальше Дескриптора устройтсва и задания адреса не сдвинулся. Все ведет себя как то не предсказуемо, и уже не знаю на что и думать. Регулярно получаю ошибку Unexpected Packet причем и в еррор статусе и еррор коде регистре. Есть те кто реализовывал УСБ на ЛПЦ 2148 вот на всякий случай текст функции посылки сообщения, вроде из названия функций можно догадаться что они делают Рад буду любой помощи Код int USBSendData(int EPNum, char *Buffer, int DataLen, int MaxPocketSize) { int ErrorCode=0; int TimeOut=0; int EPPhysNum=((EPNum<<1)+1); //convert logical to physcal EP num
char EPInfo; //logical to physycal ErrorCode=(USBCmd((CMD_USB_SEL_EP+EPPhysNum),NULL,&EPInfo)<<3);
if((EPInfo&0x01)!=0) //not end sending of previous send { #ifdef DEBUG UARTSendText("Prev send not end, EP info :",0); UARTSendHexStr(&EPInfo,1,0); #endif return 4; }
if(DataLen==0) //need send zero length data { USBCTRL=(((EPNum&0x0F)<<2)|0x02);// set write mode, and sellect EP TPKTLEN=0; TDATA=0; //just in case, for internal mechanics
ErrorCode+=(USBValidateBuffer(EPPhysNum)<<6); //need use physical ep number; if(ErrorCode!=0) //error code return ErrorCode;
TimeOut=0; EPInfo=0x01; while(((EPInfo&0x01)!=0)&&(TimeOut++<USB_DEV_TIMEOUT)) //waite end of sending { USBCmd((CMD_USB_SEL_EP+EPPhysNum),NULL,&EPInfo); if((EPInfo&0x02)!=0) //ep was STALLed { UARTSendText("EP was STALLed, EPInfo :",0); UARTSendHexStr(&EPInfo,1,0); break; } }
if(((EPInfo&0x02)!=0)||((EPInfo&0x01)!=0)) //not end of sending interrupt, or EP STALLed return 3;
USBCmd((CMD_USB_SEL_CLR_INT_EP+EPPhysNum),NULL,&EPInfo); //clear usb clock domain interrupt
#ifdef SPEED_DEBUG UARTSendText("Zerro EP Info :",0); UARTSendHexStr(&EPInfo,1,0); #endif }
while(DataLen>0) //send data by max pocket size if nedded { int CurrentSendDataLen; if(DataLen>MaxPocketSize) CurrentSendDataLen=MaxPocketSize; else CurrentSendDataLen=DataLen;
USBCTRL=(((EPNum&0x0F)<<2)|0x02);// set write mode, and sellect EP TPKTLEN=(CurrentSendDataLen&0x3FF);
for(int j=0;j<CurrentSendDataLen;j+=4) //send by word { if((CurrentSendDataLen-j)<4)//last part of sending { int TempData=0; char *Pointer=((char *)&TempData); for(int k=j;k<CurrentSendDataLen;k++) *Pointer=*Buffer++; TDATA=TempData; break; }
TDATA=*((int *)Buffer); Buffer+=4; //write by words }
ErrorCode+=(USBValidateBuffer(EPPhysNum)<<6); //need use physical ep number; if(ErrorCode!=0) //error code return ErrorCode;
DataLen-=CurrentSendDataLen;
/*if(DataLen>0) //need send one more data, waite end of last sending {*/ TimeOut=0; EPInfo=0x01; while(((EPInfo&0x01)!=0)&&(TimeOut++<USB_DEV_TIMEOUT)) //waite end of sending { USBCmd((CMD_USB_SEL_EP+EPPhysNum),NULL,&EPInfo); if((EPInfo&0x02)!=0) //ep was STALLed { UARTSendText("EP was STALLed, EPInfo :",0); UARTSendHexStr(&EPInfo,1,0); break; } }
if(((EPInfo&0x02)!=0)||((EPInfo&0x01)!=0)) //not end of sending interrupt, or EP STALLed return 3;
USBCmd((CMD_USB_SEL_CLR_INT_EP+EPPhysNum),NULL,&EPInfo); //clear usb clock domain interrupt
#ifdef SPEED_DEBUG UARTSendText("Zerro EP Info :",0); UARTSendHexStr(&EPInfo,1,0); #endif //} }
return ErrorCode; }
|
|
|
|
|
 |
Ответов
|
Aug 8 2008, 20:34
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Здравствуйте! Дальнейшие копания привели меня к мысли, что я все-таки чего то не понимаю. Описание в юзер мануале очень скудное, книги по армам которые я нашел, содержат еще более скудное описание. Отсюда вопрос. Кто-нибудь где-нибудь видел боле менее подробное описание работы усб модуля? Надо ли делать паузы в прописывании регистров, при посылки и приеме данных (я так и не могу понять ремарки про разность частот на шинах усб-ешного домена и процессора). Сигнал ресета в статус сбрасывает настройки усб или должен вызвать сброс этих настроек? То есть получая ресет, мне надо заново весь модуль инитить, или просто будет достаточно буфера 0 точки почистить? Откликнитесь пожалуста те кто имел реальную практику работы с усб в этих кристалах, ЛПЦ2148 интирисует особенно. Я что-то застрял окончательно. Вроде сделал все по описанию, и получаю сообщения(сообщения правильные), но послать правильно что-то не могу. Все время получить дискриптор устройства, задать адрес, и ресет. И крутится по кругу, пока винда не забивает на устрйоство. Длинна в требованиях дескриптора вроде меняется, то есть что-то от меня до компа доходит, но что и как? А посылки практически всегда сопровождаются ошибками типа неожиданный пакет. Естественно прослушать что происходить на шине невозможно, так как пока устройство в системе не зарегистрируется, сниферы нчиего не кажут  Это уже крик души... что-то я не понимаю, но что!? связь 114101601 golikoff_a ___ mail___ ru пожалуйста дайте кто нить о себе знать  а?
|
|
|
|
Сообщений в этой теме
Golikov A. USB LPC2000 Aug 7 2008, 13:03 Diz Посмотрите lpcusb - http://wiki.sikken.nl/index.ph... Aug 9 2008, 00:56 Golikov A. Цитата(Diz @ Aug 9 2008, 04:56) Посмотрит... Aug 9 2008, 08:44  amw Из вопроса видно, что Вы не понимаетет сам USB. LP... Aug 9 2008, 09:48   Golikov A. Цитата(amw @ Aug 9 2008, 13:48) Из вопрос... Aug 9 2008, 11:14    amw Цитата(Golikov A. @ Aug 9 2008, 14:14) Из... Aug 10 2008, 17:38     Golikov A. Привет! Спасибо за ответ.
Опустим взаимные уп... Aug 10 2008, 18:10      Golikov A. Ура с бардаком разобрался, я убирал флаг после отв... Aug 11 2008, 09:24      amw Цитата(Golikov A. @ Aug 10 2008, 21:10) П... Aug 11 2008, 11:25       Golikov A. Привет!
Вот сейчас почитал и думаю как трактов... Aug 11 2008, 12:06        galjoen Цитата(Golikov A. @ Aug 11 2008, 16:06) П... Aug 11 2008, 12:45         Golikov A. Цитата(galjoen @ Aug 11 2008, 16:45) 1. С... Aug 11 2008, 13:22          galjoen Цитата(Golikov A. @ Aug 11 2008, 17:22) Д... Aug 11 2008, 14:08           Golikov A. Цитата(galjoen @ Aug 11 2008, 18:08) Не с... Aug 11 2008, 14:30            galjoen Цитата(Golikov A. @ Aug 11 2008, 18:30) Т... Aug 11 2008, 15:57             Golikov A. Цитата(galjoen @ Aug 11 2008, 19:57) NAK-... Aug 11 2008, 17:21              amw Цитата(Golikov A. @ Aug 11 2008, 20:21) С... Aug 11 2008, 20:48              Axel Цитата(Golikov A. @ Aug 11 2008, 21:21) .... Aug 12 2008, 05:41             Golikov A. Уважаемый galjoen
Не подскажете ли мне еще по ста... Aug 12 2008, 08:49              galjoen Цитата(Golikov A. @ Aug 12 2008, 12:49) У... Aug 12 2008, 10:17               Golikov A. Цитата(galjoen @ Aug 12 2008, 14:17) Личн... Aug 12 2008, 10:36                galjoen Цитата(Golikov A. @ Aug 12 2008, 14:36) 3... Aug 12 2008, 10:49                 Golikov A. Цитата(galjoen @ Aug 12 2008, 14:49) Реше... Aug 12 2008, 12:24                  aaarrr Цитата(Golikov A. @ Aug 12 2008, 16:24) Э... Aug 12 2008, 12:29                   Golikov A. Цитата(aaarrr @ Aug 12 2008, 16:29) Хаб у... Aug 12 2008, 12:49                    aaarrr Цитата(Golikov A. @ Aug 12 2008, 16:49) П... Aug 12 2008, 12:52                     Golikov A. Цитата(aaarrr @ Aug 12 2008, 16:52) Хаб н... Aug 12 2008, 13:00                      galjoen Цитата(Golikov A. @ Aug 12 2008, 17:00) П... Aug 12 2008, 16:40                       Golikov A. Цитата(galjoen @ Aug 12 2008, 20:40) По у... Aug 12 2008, 17:17                        Golikov A. УРА за АКАло.. Может кому то будет полезно...
Рег... Aug 12 2008, 21:14        amw Цитата(Golikov A. @ Aug 11 2008, 15:06) П... Aug 11 2008, 15:53 drovik В текст пока не вникал, но хотелось-бы увидеть дес... Aug 14 2008, 08:29 Golikov A. Цитата(drovik @ Aug 14 2008, 12:29) В тек... Aug 14 2008, 08:57 Golikov A. Всем привет!
Извеняюсь с выбором подфорума, н... Aug 15 2008, 22:29 Golikov A. Цитата(Golikov A. @ Aug 16 2008, 02:29) В... Aug 17 2008, 22:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|