您好!
我正在设计一个用作集线器的器件、将多个串行器件连接到计算机、用作 USB CDC 器件。 此器件使用 usblib 来创建具有所需 CDC 器件名称的复合器件。
它可以与多达3个器件完美配合、但当我尝试添加更多器件时、我面临以下问题:当我从主机接收数据并且我的底层器件发回一些响应时、主机从未收到过该数据。
调试应用程序我看到器件结构将 iCDCTxState 字段设置为 eCDCStateWaitData 并读取 usbcdc.c 我看到该字段应 通过 ProcessDataToHost()函数(由 HandleEndpoints()函数调用)设置为 eCDCStateIdle,但 HandleEndpoints()仅在从主机接收数据时调用。 但绝不在 从 USB 缓冲区调用 ScheduleNextTransmission ()之后。
CDC 器件的初始化方式相同:
int i; for(i = 0; i < nPorts; i++) { g_sCompDevice.psDevices[i].pvInstance = USBDCDCCompositeInit(0, &g_psCDCDevice[i], &g_psCompEntries[i]); USBBufferInit(&g_psTxBuffer[i]); USBBufferInit(&g_psRxBuffer[i]); } g_sCompDevice.ui32NumDevices = nPorts; pCompInst = USBDCompositeInit(0, (tUSBDCompositeDevice *)&g_sCompDevice, COMPOSITE_DCDC_SIZE * nPorts, g_pucDescriptorData);
这些结构被声明为:
extern tUSBBuffer g_psTxBuffer[MAX_SERIAL_DEVICES]; extern tUSBBuffer g_psRxBuffer[MAX_SERIAL_DEVICES]; extern tUSBDCDCDevice g_psCDCDevice[MAX_SERIAL_DEVICES]; extern uint8_t g_pui8USBTxBuffer[]; extern uint8_t g_pui8USBRxBuffer[]; extern uint32_t ControlHandler(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, void *pvMsgData); extern uint32_t RxHandlerCDC(void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgValue, void *pvMsgData); extern uint32_t TxHandlerCDC(void *pvlCBData, uint32_t ui32Event, uint32_t ui32MsgValue, void *pvMsgData); #define CDC_DEV_STRUCT(n) \ { \ USB_VID_TI_1CBE, \ USB_PID_SERIAL, \ 0, \ USB_CONF_ATTR_BUS_PWR, \ ControlHandler, \ (void *)&g_psCDCDevice[n], \ USBBufferEventCallback, \ (void *)&g_psRxBuffer[n], \ USBBufferEventCallback, \ (void *)&g_psTxBuffer[n], \ g_pui8StringDescriptorsCDC, \ NUM_STRING_DESCRIPTORS \ } tUSBDCDCDevice g_psCDCDevice[MAX_SERIAL_DEVICES] = { CDC_DEV_STRUCT(0), CDC_DEV_STRUCT(1), CDC_DEV_STRUCT(2), CDC_DEV_STRUCT(3), CDC_DEV_STRUCT(4), CDC_DEV_STRUCT(5), CDC_DEV_STRUCT(6), CDC_DEV_STRUCT(7), CDC_DEV_STRUCT(8), CDC_DEV_STRUCT(9), CDC_DEV_STRUCT(10), CDC_DEV_STRUCT(11), CDC_DEV_STRUCT(12), CDC_DEV_STRUCT(13), CDC_DEV_STRUCT(14), CDC_DEV_STRUCT(15) }; #define CDC_RX_BUFFER(n) \ { \ false, \ RxHandlerCDC, \ (void *)&g_psCDCDevice[n], \ USBDCDCPacketRead, \ USBDCDCRxPacketAvailable, \ (void *)&g_psCDCDevice[n], \ g_ppui8USBRxBuffer[n], \ UART_BUFFER_SIZE, \ } uint8_t g_ppui8USBRxBuffer[MAX_SERIAL_DEVICES][UART_BUFFER_SIZE]; tUSBBuffer g_psRxBuffer[MAX_SERIAL_DEVICES] = { CDC_RX_BUFFER(0), CDC_RX_BUFFER(1), CDC_RX_BUFFER(2), CDC_RX_BUFFER(3), CDC_RX_BUFFER(4), CDC_RX_BUFFER(5), CDC_RX_BUFFER(6), CDC_RX_BUFFER(7), CDC_RX_BUFFER(8), CDC_RX_BUFFER(9), CDC_RX_BUFFER(10), CDC_RX_BUFFER(11), CDC_RX_BUFFER(12), CDC_RX_BUFFER(13), CDC_RX_BUFFER(14), CDC_RX_BUFFER(15) }; #define CDC_TX_BUFFER(n) \ { \ true, \ TxHandlerCDC, \ (void *)&g_psCDCDevice[n], \ USBDCDCPacketWrite, \ USBDCDCTxPacketAvailable, \ (void *)&g_psCDCDevice[n], \ g_ppcUSBTxBuffer[n], \ UART_BUFFER_SIZE, \ } uint8_t g_ppcUSBTxBuffer[MAX_SERIAL_DEVICES][UART_BUFFER_SIZE]; tUSBBuffer g_psTxBuffer[MAX_SERIAL_DEVICES] = { CDC_TX_BUFFER(0), CDC_TX_BUFFER(1), CDC_TX_BUFFER(2), CDC_TX_BUFFER(3), CDC_TX_BUFFER(4), CDC_TX_BUFFER(5), CDC_TX_BUFFER(6), CDC_TX_BUFFER(7), CDC_TX_BUFFER(8), CDC_TX_BUFFER(9), CDC_TX_BUFFER(10), CDC_TX_BUFFER(11), CDC_TX_BUFFER(12), CDC_TX_BUFFER(13), CDC_TX_BUFFER(14), CDC_TX_BUFFER(15) };
端点数量是否有任何限制?