|
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 9 2008, 00:56
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250

|
Посмотрите lpcusb - http://wiki.sikken.nl/index.php?title=LPCUSBНа первый взгляд очень вменяемо написанный фреймворк, собираюсь пробовать в ближайшем времени на lpc2468.
Сообщение отредактировал Diz - Aug 9 2008, 00:57
|
|
|
|
|
Aug 9 2008, 08:44
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата(Diz @ Aug 9 2008, 04:56)  Посмотрите lpcusb - http://wiki.sikken.nl/index.php?title=LPCUSBНа первый взгляд очень вменяемо написанный фреймворк, собираюсь пробовать в ближайшем времени на lpc2468. Это в целом, а тут уже нужны частности  . Хочется знать что надо ставить а что нет. из мануала Bus Reset bit. On a bus reset, the device will automatically go to the default state. In the default state:... что это значит? устройство перейдет в дефолтное состояние, или должно автоматическ переходить? то есть получив этот бит я должен заново инит усб настраивать все конечные точки и так далее (потому что устрйоство в дефолте), или я должен получив этот бит перевисти устрйство в дефолтное состоние? The Set Address command is used to set the USB assigned address and enable the (embedded) function. The address set in the device will take effect after the status phase of the setup token. (Alternately, issuing the Set Address command twice will set the address in the device) как это использовать? получив запрос сет адрес я должен вызвать эту функцию и отправить пакет нулевой длинны как "ак", а контроллер сам прочухает статус фазу ответа и выставит адрес? Или всегда добить по 2 раза? Чет он не так, не так не работает  ... ошибка неожиданный пакет... Странно что в регистре статуса прерываний контрольных точек не появляются биты еслине выключено соотвесвующее прерывание. Я ожидал осутсвие реакции на прервание,а не запрет появления соотвествующих битов%(... надо все усб еще разок с нуля переписать... все как в мануале, а не работает  ... И не знаю на что думать, может во времянные рамки не укладываюсь  ... Сколько времени дают на обработку запросов?
|
|
|
|
|
Aug 9 2008, 09:48
|
Знающий
   
Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847

|
Из вопроса видно, что Вы не понимаетет сам USB. LPC это уже частности. Прочитайте сначала сам USB стандарт. Цитата(Golikov A. @ Aug 9 2008, 11:44)  из мануала Bus Reset bit. On a bus reset, the device will automatically go to the default state. In the default state:...
что это значит? устройство перейдет в дефолтное состояние, или должно автоматическ переходить? то есть получив этот бит я должен заново инит усб настраивать все конечные точки и так далее (потому что устрйоство в дефолте), или я должен получив этот бит перевисти устрйство в дефолтное состоние? Хост устанавливает USB Reset при подключении устройства к шине, при ошибках и т.п. Получив его нужно, как минимум, запретить все конечные точки кроме EP0 и перевести устройство в исходное состояние. Это значит, что в программе, в той части, которая отвечает за логику функционировани USB, нужно обнулить или установить в какое-то начальное состояние переменные и пр. И перейти в состояние готовности к получению адреса. Цитата The Set Address command is used to set the USB assigned address and enable the (embedded) function. The address set in the device will take effect after the status phase of the setup token. (Alternately, issuing the Set Address command twice will set the address in the device) как это использовать? получив запрос сет адрес я должен вызвать эту функцию и отправить пакет нулевой длинны как "ак", а контроллер сам прочухает статус фазу ответа и выставит адрес? Или всегда добить по 2 раза? Чет он не так, не так не работает  ... ошибка неожиданный пакет... Нужно установить в регитсре полученный адрес. Разрешить остальные конечные точки. И перевести свою программу в рабочее состояние - то есть перейти в нормальный режим функционирования. Цитата Странно что в регистре статуса прерываний контрольных точек не появляются биты еслине выключено соотвесвующее прерывание. А что тут странного? Вы же их запретили. Отку да же возмутся биты статуса запрещенных прерываний? Цитата Я ожидал осутсвие реакции на прервание,а не запрет появления соотвествующих битов%(... Не стоит распространять опыт по PIC на другие архитектуры. И для начала возмите примеры на сайте NXP. http://www.standardics.nxp.com/support/doc...crocontrollers/Искать на предмет "Sample Code Bundle" И еще, возможно Вы путаете Data Sheet и User Manual? Это разные документы.
--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть. © Lewis Carroll. Alice's adventures in wonderland.
|
|
|
|
Сообщений в этой теме
Golikov A. USB LPC2000 Aug 7 2008, 13:03 Golikov A. Здравствуйте!
Дальнейшие копания привели меня... Aug 8 2008, 20:34   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
|
|
|