Всем привет! Имеется устройство на базе МК LPC2478, которое при подключении к компьютеру определяется как Mass Storage Device. Имеется код, который по специальной команде (отличающейся от стандартной команды чтения) должен послать 512 байт из массива. Вот код Код (Text): BYTE * buffer=(BYTE * )malloc(sizeof(BYTE)*512); DWORD res; BYTE i=0,j=0; CSW.dDataResidue = 512; BulkStage=MSC_BS_DATA_IN; fill(0,buffer,135,1);//заполняем массив while(CSW.dDataResidue>0) { delayMs(0,1); USB_WriteEP(MSC_EP_IN, (BYTE*)&mci_buffer[i*64],64); CSW.dDataResidue-=64; i++; } BulkStage = MSC_BS_DATA_IN_LAST; CSW.bStatus = CSW_CMD_PASSED; free(mci_buffer); В таком виде код работает. Однако если удалить строчку Код (Text): delayMs(0,1); , то передача не проходит. Насколько я понимаю, для отработки функции USB_WriteEP требуется какое-то время. Код функции USB_WriteEP взят из стандартной библиотеки Keil Код (Text): DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) { DWORD n; USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_WR_EN; TX_PLENGTH = cnt; for (n = 0; n < (cnt + 3) / 4; n++) { TX_DATA = *((__packed DWORD *)pData); pData += 4; } USB_CTRL = 0; WrCmd(CMD_SEL_EP(EPAdr(EPNum))); WrCmd(CMD_VALID_BUF); return (cnt); } Вопрос: можно ли как-то отследить состояние выполнения записи на endpoint (например, через какой-нибудь регистр) и в этом ли вообще дело? Или, выражаясь по-другому, как избавиться от функции задержки?
Lecko Для начало надо понимать подсистему USB. Кто инициирует запрос на получения данных? ага тотоже ... Когда функта отработает os_evt_wait_or(USB_EVT_IN, 0xFFFF); Тогда вы можете смело и красиво посылать данные ... Конечно извените но ваш код это убитый высер. (( сорри ахахахаха. Так как если хост подвиснит команды перестанут опять таки отправлятся.
1) данный код вызывается по соответствующему прерыванию, просто в листинге я этого не привел. 2) как я уже писал выше, при установки задержки в 1 мс на каждый пакет код работает. Вопрос заключался в том, зачем эта задержка нужна и как от нее избавиться
Прерывание какое? вам нужно события прочекать что хост готов получать данные... Хотя конечно время отправки тоже какое то есть , но должно входить в write. Вот тут можно покопать: http://developerarm7.googlecode.com/svn-history/r2/trunk/NXP/Project/USB_UVC_LPC/ http://read.pudn.com/downloads135/ebook/574089/USBHIDkeyboard20080805/USBHID/usbuser.c__.htm
спасибо, заработало! Главная идея в том, что перед отправкой очередной порции байт нужно проверять, закончилась ли отправка предыдущей и готов ли хост к приему - соответствующие байты в регистре RX_DATA