реклама на сайте
подробности

 
 
> LPCUSB Отправляется только первый пакет, 2x CDC, USBFrameHandler, USBHwNakIntEnable
segment
сообщение Jun 11 2010, 13:55
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



(Сначала тему сунул в 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
но как такового решения я не нашел там
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 02:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01353 секунд с 7
ELECTRONIX ©2004-2016