This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:[常见问题解答] TMS320F28379D:使用 USB 库时出现问题

Guru**** 2524550 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/884172/tms320f28379d-faq-tms320f28379d-problems-with-usb-lib-using

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

您好!

问题:当 USB CDC 器件 中断程序被触发并且 获得 USB_EVENT_RX_Available 时。  

  USBDCDCRxPacketAvailable(&G_sCDCDevice)的返回值始终为0。

  我肯定会获得数据、因为我通过 USBBufferRead (const tUSBBuffer * psBuffer、uint8_t * pui8Data、uint32_t ui32Length)获得了正确的数据

   请帮助分析出错的地方。 谢谢你。

uint32_t RxHandler (void *pvCBData、uint32_t ui32Event、uint32_t ui32MsgValue、 void *pvMsgData)
   switch (ui32event)
   {
       //
       //已收到新的数据包。
       //
       案例 USB_EVENT_RX_Available:
       {
           uint32_t Rx_available = USBDCDCRxPacketAvailable (&g_sCDCDevice);
           中断;
       }
       案例 USB_EVENT_DATA_LEART剩余:
       {
           uint32_t Rx_available = USBDCDCRxPacketAvailable (&g_sCDCDevice);
      
           返回(0);
    }
       案例 USB_EVENT_Request_buffer:
       {
           返回(0);
       }
       //
       //我们不希望收到任何其它事件。  请忽略该节目
       //在版本编译中向上运行或在调试编译中挂起。
       //
       默认值:
#ifdef 调试
           while (1);
其他
           中断;
#endif
   }
   返回(0);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Chang、

    要进一步调试、您可以深入了解位于以下目录的 USB 库源代码。 您可以将项目导入到 CCS 中、我认为您甚至可以在其中放置断点、以便在运行时进一步调试'USBDCDCRxPacketAvailable'函数。 但是、您可能需要以不同的方式链接库以执行此操作。

    C:\ti\c2000Ware_2_01_00_00\libraries\communications\USB\f2837xd

    请参阅函数根据以下函数源代码返回0的可能方法。

    //
    //
    //! 确定数据包是否可用、如果可用、确定
    //的大小! 需要一个缓冲器来读取它。
    //!
    //! \param pvCDCDevice 是指向设备实例结构的指针、作为
    //! 由 USBDCDCInit()返回。
    //!
    //! 此函数可用于确定接收到的数据包是否仍然为
    //! 读取并允许应用程序确定
    //! 读取数据。
    //!
    //! 如果没有收到的数据包未处理或
    //! 数据包等待读取时的数据包大小。
    ////
    *****************
    uint32_t
    USBDCDCRxPacketAvailable (void *pvCDCDevice)
    {
    uint32_t ui32EPStatus、ui32Size;
    tCDCSerInstance *psInst;
    
    assert (pvCDCDevice);
    
    //
    //获取指向 CDC 器件实例数据指针的指针
    //
    psInst =&((tUSBDCDCDevice *) pvCDCDevice)->sPrivateData;
    
    //
    //如果接收当前被阻止,则返回0。
    //
    if (psInst->bRxBlocked || psInst->bControlBlocked)
    {
    返回(0);
    }
    
    //
    //相关端点 FIFO 是否有数据包等待我们?
    //
    ui32EPStatus = USBEndpointStatus (psInst->ui32USBBase、
    psInst->ui8BulkOUTEndpoint);
    
    if (ui32EPStatus 和 USB_DEV_RX_PKT_RDY)
    {
    //
    //是-数据包正在等待。 它有多大?
    //
    ui32Size = USBEndpointDataAvail (psInst->ui32USBBase、
    psInst->ui8BulkOUTEndpoint);
    
    return (ui32Size);
    }
    其他
    {
    //
    //没有等待接收的数据包。
    //
    返回(0);
    }
    } 

    最棒的

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Kevin ,

    谢谢、

    我在函数中放置了断点、 并且 USBEndpointStatus()从不返回 USB_DEV_RX_PKT_RDY。

    28379的 USB 向 PC COM 发送数据是由 USBDCDCPacketWrite()确定的。

     当 PC 通过 COM 将数据发送到28379时, 数据只能通过 USBBufferRead (const tUSBBuffer *psBuffer,uint8_t *pui8Data, uint32_t ui32Length)读出

    所以、 我想问题是虚拟串行端口用作 PC 上的 USB 通信、所以不会获得端点的结束状态。