Помогите осилить 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? Как его определяют?
-
- Отвечает Александр Друзь! Hexxx(1701 знак., 23.04.2007 13:44, )
- P.S.S Hexxx(249 знак., 23.04.2007 13:45, )
- Отвечает Александр Друзь! Hexxx(1701 знак., 23.04.2007 13:44, )