Переделал usb_demo (USB HID) в CDC (использую BULK ENDPOINT2 IN и OUT для передачи данных). OUT работает нормально.
IN (данные передаются в HOST по нажатию кнопки в устройстве) передает только 1 раз, при повторном нажатии в терминальную программу ничего не приходит, при третьем вызове циклится на if ((USB_Cmd(CMD_USB_SET_EP_STAT + ENP2_IN,0) & 1) == 0) ...
Код
// DataSize д.б. меньше размера пакета для конечной точки
void CDC_SendDataByEP2 (unsigned char * Data, unsigned int DataSize)
{
unsigned int * pData = (unsigned int *)Data;
unsigned int i;
int ZeroLength = 0;
// Select Endpoint
USBCTRL_bit.LOG_ENDPOINT = ENP2_IN>>1;
USBCTRL_bit.WR_EN = 1;
TPKTLEN = i;
do
{
TDATA = *pData++;
}
while (USBCTRL_bit.WR_EN);
// Validate buffer
USB_ValidateBuffer(ENP2_IN);
// следующий код отсутствует в AN10420 (CDC для KEIL)
// если его убрать, то при повторной передаче HOST все равно ничего не получит
// Wait until data is send or overwrite by setup packet
while ((ENDPINTS & (1<<ENP2_IN)) == 0)
{
if ((USB_Cmd(CMD_USB_SET_EP_STAT + ENP2_IN,0) & 1) == 0)
{
if((ENDPINTS & (1<<ENP2_IN)) == 0)
{
USB_Cmd(CMD_USB_SEL_CLR_INT_EP + ENP2_IN,0);
return;
}
}
}
USB_Cmd(CMD_USB_SEL_CLR_INT_EP + ENP2_IN,0);
ENDPINTCLR = (1<<ENP2_IN);
}
функция USB_Cmd(CMD_USB_SET_EP_STAT + ENP2_IN,0) возвращает при первом вызове CDC_SendDataByEP2 значение 0, как и должно быть. При втором вызове CDC_SendDataByEP2 значение 64, при третьем 97 ( 97&1=1 - с установленным флагом Stall).
Подскажите, пожалуйста, в чем может быть причина.Спасибо!