
А вот прием идет шустро) посылаю 1023 байта все за кадр приходят)
Не забывайте что хост когда отправляет пакеты чередует данные DATA0 и DATA1 это разные прерывания RX_DATA_BK1 и RX_DATA_BK0 от одного источника (и разные буферы).
мой кусок обработки прерывания:
CODE
//---Обработка прерываний от конечной точки-------------------------------------
void USB_EP_INT()
{
switch ((AT91C_BASE_UDP -> UDP_CSR[POINT]) & UDP_CSR_STATUS)
{
case AT91C_UDP_RXSETUP:
{
send_byte(0xF1);//для отладки по RS-232
USB_READ_FIFO_EP((unsigned char *) pSetup_Packet, POINT);//переход на функцию сохранения байтов в память
RXSETUP_CLEAR(POINT);//Сброс бита RXSetup (данные из буфера прочитал)
switch ((pSetup_Packet -> bmRequestType) & USB_TYPE_REQUEST)
{
case USB_TYPE_STANDARD:
{
switch (pSetup_Packet -> bRequest) //че комп от меня хочет?
{
case GET_DESCRIPTOR:
{USB_GET_DESCRIPTOR(); break;}//запрос дескриптора
case SET_ADRESS:
{USB_SET_ADRESS(); break;}//установка адреса
case SET_CONFIGURATION:
{USB_SET_CONFIGURATION(); break;}
case CLEAR_FEATURE:
{USB_CLEAR_FEATURE(); break;}
default:
{USB_STALL(); break;}
//если запрос не известен то выход из оператора switch
}
break;
}
case USB_TYPE_CLASS:
{
switch (pSetup_Packet -> bRequest)//че комп от меня хочет?
{
case SET_LINE_CODING:
{k = 1; break;}
case GET_LINE_CODING:
{pData[POINT] = (unsigned char *) pLine_Control;
dLenght[POINT] = 7;
USB_WRITE_FIFO_EP(POINT); break;}
case SET_CONTROL_LINE_STATE:
{ZERO_PACKET(); break;}
default:
{USB_STALL();
break;}
//если запрос не известен то выход из оператора switch
}
break;
}
default: {USB_STALL(); break;}
}
break;
}
//------------------------------------------------------------------------------
case AT91C_UDP_TXCOMP:
{
send_byte(0xF2);
TXCOMP_CLEAR(POINT);//сбрасываем бит TXCOMP
if (pStatus[POINT])
{
USB_WRITE_FIFO_EP(POINT);
}
break;
}
//------------------------------------------------------------------------------
case AT91C_UDP_ISOERROR:
{
send_byte(0xF3);
STALL_CLEAR(POINT);
FORCESTALL_CLEAR(POINT);
break;
}
//------------------------------------------------------------------------------
case AT91C_UDP_RX_DATA_BK0:
case AT91C_UDP_RX_DATA_BK1:
{
send_byte(0xF4);
if (k) {k = 0; USB_READ_FIFO_EP((unsigned char *) pLine_Control, POINT); RX_DATA_BK_CLEAR(POINT); ZERO_PACKET();}
else {USB_READ_FIFO_EP(DATA, POINT); RX_DATA_BK_CLEAR(POINT);}
break;
}
default: break;
}
}
//==============================================================================
void USB_EP_INT()
{
switch ((AT91C_BASE_UDP -> UDP_CSR[POINT]) & UDP_CSR_STATUS)
{
case AT91C_UDP_RXSETUP:
{
send_byte(0xF1);//для отладки по RS-232
USB_READ_FIFO_EP((unsigned char *) pSetup_Packet, POINT);//переход на функцию сохранения байтов в память
RXSETUP_CLEAR(POINT);//Сброс бита RXSetup (данные из буфера прочитал)
switch ((pSetup_Packet -> bmRequestType) & USB_TYPE_REQUEST)
{
case USB_TYPE_STANDARD:
{
switch (pSetup_Packet -> bRequest) //че комп от меня хочет?
{
case GET_DESCRIPTOR:
{USB_GET_DESCRIPTOR(); break;}//запрос дескриптора
case SET_ADRESS:
{USB_SET_ADRESS(); break;}//установка адреса
case SET_CONFIGURATION:
{USB_SET_CONFIGURATION(); break;}
case CLEAR_FEATURE:
{USB_CLEAR_FEATURE(); break;}
default:
{USB_STALL(); break;}
//если запрос не известен то выход из оператора switch
}
break;
}
case USB_TYPE_CLASS:
{
switch (pSetup_Packet -> bRequest)//че комп от меня хочет?
{
case SET_LINE_CODING:
{k = 1; break;}
case GET_LINE_CODING:
{pData[POINT] = (unsigned char *) pLine_Control;
dLenght[POINT] = 7;
USB_WRITE_FIFO_EP(POINT); break;}
case SET_CONTROL_LINE_STATE:
{ZERO_PACKET(); break;}
default:
{USB_STALL();
break;}
//если запрос не известен то выход из оператора switch
}
break;
}
default: {USB_STALL(); break;}
}
break;
}
//------------------------------------------------------------------------------
case AT91C_UDP_TXCOMP:
{
send_byte(0xF2);
TXCOMP_CLEAR(POINT);//сбрасываем бит TXCOMP
if (pStatus[POINT])
{
USB_WRITE_FIFO_EP(POINT);
}
break;
}
//------------------------------------------------------------------------------
case AT91C_UDP_ISOERROR:
{
send_byte(0xF3);
STALL_CLEAR(POINT);
FORCESTALL_CLEAR(POINT);
break;
}
//------------------------------------------------------------------------------
case AT91C_UDP_RX_DATA_BK0:
case AT91C_UDP_RX_DATA_BK1:
{
send_byte(0xF4);
if (k) {k = 0; USB_READ_FIFO_EP((unsigned char *) pLine_Control, POINT); RX_DATA_BK_CLEAR(POINT); ZERO_PACKET();}
else {USB_READ_FIFO_EP(DATA, POINT); RX_DATA_BK_CLEAR(POINT);}
break;
}
default: break;
}
}
//==============================================================================
Этот обработчик написан для CDC конфигурации USB устройства (находится в стадии оптимизации).
Проблемы с приемом не возникали, но... Возникали проблемы с открытием порта. Открывался некорректно! Подвисал програмки для работы с COM портом. Потом разобрался сейчас не вспомню в чем проблема была.
Вспомнил в чем проблема. Проблема в корректной обработки запроса SET_LINE_CODING. Я с начала отправлял пустой пакет подтверждения после приема запроса, но потом оказалось пустой пакет надо отправлять после приема данных по запросу SET_LINE_CODING
Код
if (k) {k = 0; USB_READ_FIFO_EP((unsigned char *) pLine_Control, POINT); RX_DATA_BK_CLEAR(POINT); ZERO_PACKET();}
При этом бит DIR контрольной точки менять не нужно...