ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 июля
87020
Hexxx (19.04.2007 16:02, просмотров: 1391)
Помогите осилить SL811 Люди помогите, уже 2 недели бьюсь не могу понять как должно работать чтение. :help: Как я делаю: Инициализирую SL811 в режим Full Speed: <c> SL811Write(cSOFcnt,0xAE); // Set up host & full speed direct and SOF cnt SL811Write(cDATASet,0xE0); // SOF Counter Low = 0xE0; 1ms interval SL811Write(CtrlReg,0x05); // Setup 48MHz and SOF enable SL811Write(EP0Status,0x50); // Setup SOF Token, EP0 SL811Write(EP0Counter,0x00); // reset to zero count SL811Write(EP0Control,0x01); // start generate SOF or EOP SL811Write(IntStatus,INT_CLEAR); </c> Шлю запрос на получение дескриптора конфигурации: <c> SL811BufWrite(EP0_Buf,pData,DataSize); SL811Write(EP0Status,(PID_SETUP | 0)); SL811Write(EP0Counter,0); // USB address SL811Write(EP0Address,EP0_Buf); // buffer address, start with "data0" SL811Write(EP0XferLen,DataSize); // data transfer length SL811Write(IntStatus,INT_CLEAR); // clear interrupt status SL811Write(EP0Control,sDATA0_WR); </c> Дальше жду пока закончится отправка и читаю статус: <c> do { intr = SL811Read(IntStatus); // wait for interrupt to be done if((intr & USB_RESET) || (intr & INSERT_REMOVE)) //leave if device is removed return ERROR_DISCONNECT; } while (!(intr & USB_A_DONE)); // interrupt done !!! SL811Write(IntStatus,INT_CLEAR); // clear interrupt status status = SL811Read(EP0Status); // read EP0status register </c> Возращается (status & EP0_ACK)==EP0_ACK. Т.е. с отправкой все ok. Далее читаю ответ. Я в снифере на компе поглядел, что должно прийти 0x43 байта. Размер EP0_Buf= 0x40 байт. Поэтому пытаюсь читать 0x40 байт: <c> SL811Write(EP0Status, (PID_IN | 0)); // PID + EP address SL811Write(EP0Counter, 0); // USB address SL811Write(EP0Address, EP0_Buf); // buffer address, start with "data0" if (ReqProc.BufferSize > 0x40) SL811Write(EP0XferLen, 0x40); else SL811Write(EP0XferLen,BufferSize); // data transfer length SL811Write(IntStatus, INT_CLEAR); // clear interrupt status SL811Write(EP0Control, sDATA0_RD); </c> Снова жду результата: <c> do { intr = SL811Read(IntStatus); // wait for interrupt to be done if((intr & USB_RESET) || (intr & INSERT_REMOVE)) //leave if device is removed return ERROR_DISCONNECT; } while (!(intr & USB_A_DONE)); // interrupt done !!! SL811Write(IntStatus,INT_CLEAR); // clear interrupt status status = SL811Read(EP0Status); // read EP0status register </c> Опять возращается (status & EP0_ACK)==EP0_ACK. Т.е. вроде как прочитало. Читаю сколько там осталось дочитать: <c> remainder = SL811Read(EP0Counter); </c> remainder = 0x30, получается что недочитано 0x30 байт! Что делать дальше? Как их дочитать? Почему оно их недочитало? В примере из EZ811 DK они вообще такие пакеты скипают. Пробовал ради интереса прочитать то что лежит в EP0_Buf. Там лежит 0x10 байт, правильных, таких же как я видел в снифере на компе, а дальше мусор. Еще в примере из EZ811 DK они зачем-то переключают буферы когда читают большой кусок, зачем? И последнее, что такое payload? Как его определяют?