(Сначала тему сунул в USB, а потом понял что это все-таки ARM)
Такая проблема, есть USB девайс, у него прописан дескриптор на два CDC с помощью IAD (Composite Device)
Определяется нормально и дрова встают стандартные.
Использую библиотеку LPCUSB. Решил прогнать на первом CDC тест. Данные в OUT endpoint поступают нормально, отправляются по UART куда нужно. Обратно принимаются данные в буфер. Если буфер не пустой то USBHwNakIntEnable( INACK_BI ) в функции USBFrameHandler(). Первый пакет отправляется нормально, то есть вызывается USBHwNakIntEnable, далее вызывается BulkIn(), отправляются данные в USBHwEPWrite(), приходят на компьютер нормально. После этого, когда появились данные в буфере, вызывается второй раз BulkIn() - но данные на компьютер не приходят. Далее, если после этого появятся еще данные для отправки, начинает вызываться постоянно USBHwNakIntEnable() в USBHwNakIntEnable() (так данные есть, а их не считывают) а BulkIn() не вызывается! И все. Отрабатывает только первый пакет, дальнейшие пакеты не отправляются.
С USB недолго ковырялся совсем, еще не все усвоил, поэтому пользуюсь библиотекой LPCUSB из примеров. JTAG есть, но в Keil нет отладки USB, понять в чем проблема проблематично.
Вот функциональные куски кода, а вот ссылка на
LPCUSBКод
void USB_IRQHandler( void )
{
USBHwISR();
}
static void BulkOut( uint8_t bEP, uint8_t bEPStatus )
{
uint8_t len = 0;
len = USBHwEPRead(bEP, abBulkBuf, sizeof(abBulkBuf));
if( len )
uart_send( 0, abBulkBuf, len );
}
static void BulkIn( uint8_t bEP, uint8_t bEPStatus )
{
uint8_t len = 0;
test2 = 0;
if( uart_data_available_recv(0) == 0 )
{
// no more data, disable further NAK interrupts until next USB frame
USBHwNakIntEnable(0);
return;
}
len = uart_receive( 0, abBulkBuf, CDC1_BULK_OUT_EP_SIZE );
if( len )
USBHwEPWrite( bEP, abBulkBuf, len );
}
Код
int main( void )
{
SystemInit();
nvic_init( 0x00000000 );
NVIC_SetPriorityGrouping(0x06); // 0x05
....
USBInit();
// register descriptors
USBRegisterDescriptors( abDescriptors );
// register class request handler
USBRegisterRequestHandler( REQTYPE_TYPE_CLASS, HandleClassRequest, abClassReqData );
// register endpoint handlers
USBHwRegisterEPIntHandler( CDC1_INT_EP_NUM, NULL );
USBHwRegisterEPIntHandler( CDC1_BULK_IN_EP_NUM, BulkIn );
USBHwRegisterEPIntHandler( CDC1_BULK_OUT_EP_NUM, BulkOut );
USBHwRegisterEPIntHandler( CDC2_INT_EP_NUM, NULL );
USBHwRegisterEPIntHandler( CDC2_BULK_IN_EP_NUM, NULL );
USBHwRegisterEPIntHandler( CDC2_BULK_OUT_EP_NUM, NULL );
// register frame handler
USBHwRegisterFrameHandler( USBFrameHandler );
// enable bulk-in interrupts on NAKs
USBHwNakIntEnable( INACK_BI );
USBHwConnect(true);
while(1);
}
Сейчас посмотрел, перед первым USBHwEPWrite() функция USBHwEPGetStatus() показывает значение 0х10 (EP_STATUS_NACKED), а перед второй отправкой показывает 0x30 что не описано в библиотеке, сейчас попробую посмотреть в даташите может найду..
Нашел свою проблему в ветке
http://tech.dir.groups.yahoo.com/group/lpc2000/message/47881но как такового решения я не нашел там