您好!
我正在设计一个用作集线器的器件、将多个串行器件连接到计算机、用作 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)
};
端点数量是否有任何限制?