Имеется устройство на базе МК LPC2478, которое при подключении к компьютеру определяется как Mass Storage Device. Имеется код, который по специальной команде (отличающейся от стандартной команды чтения) должен послать 512 байт из массива. Вот код
Код
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);
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);
В таком виде код работает. Однако если удалить строчку
Код
delayMs(0,1);
, то передача не проходит. Насколько я понимаю, для отработки функции USB_WriteEP требуется какое-то время. Код функции USB_WriteEP взят из стандартной библиотеки Keil
Код
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);
}
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 (например, через какой-нибудь регистр) и в этом ли вообще дело? Или, выражаясь по-другому, как избавиться от функции задержки?