Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPCUSB Отправляется только первый пакет
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
segment
(Сначала тему сунул в 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
но как такового решения я не нашел там
segment
Блин, не знаю что делать уже( Есть у кого какие мысли? Или может кто-нибудь использует несколько CDC в своих проектах?

Еще тему почитал http://www.embeddedrelated.com/groups/lpc2000/show/35810.php , проблема тоже похожа на мою. Есть вероятность что это изза драйвера usbser.sys, но как это поправить хз
segment
Вот еще одна ветка с моей проблемой http://fossplanet.com/hardware.arm.at91sam...9/msg00022.html
Походу можно попробовать поиграться с endpointами
segment
Никто с USB разве не работал?

Забыл сказать, проблема горит, на этой неделе нужно преодолеть этот барьер.
segment
Ап. Тема еще актуальна
segment
Подскажите форум, где есть люди, которые могут помочь
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.