我在 STM32L476 的`USBD_LL_Init()`内部调用`HAL_PCDEx_SetTxFiFo()`。我附上了 USBTreeView 读取到的描述符结果,重点信息如下:
我的复合设备包含多个接口:
1 个 HID 接口
1 个中断 IN 端点 0x83
1 个应用自定义接口
1 个 Bulk IN 端点 0x84
1 个 Bulk OUT 端点 0x04
1 个中断 IN 端点 0x85
1 个同步(ISO)IN 端点 0x86
IAD 关联两个 CDC 接口
1 个 CDC 控制接口
1 个中断 IN 端点 0x82
1 个 CDC 数据接口
1 个 Bulk IN 端点 0x81
1 个 Bulk OUT 端点 0x01
我把 IAD 和 CDC 放在描述符的最后,这样可以避免部分串口驱动识别异常。但端点和 TX 缓冲区初始化的调用逻辑我拿不准,不确定自己配置是否正确。
请教`HAL_PCDEx_SetTxFiFo()`的第二个入参:是去掉方向位(& ~0x80)后的端点 ID?
还是按照描述符、接口出现的先后顺序编号?
这个参数到底代表什么?能否跳过某些 FIFO 不配置?最多可以配置多少个,配置 6 个会不会超出限制?
如果删掉自定义应用相关端点,CDC 可以正常工作;一旦添加这组端点,`CDC_Transmit_FS()`就无法执行:
if (hcdc->TxState != 0){
return USBD_BUSY;
}
`TxState`***为忙。即便不加载任何 PC 端驱动、完全不操作其他端点,CDC 也会失效。我怀疑是`HAL_PCDEx_SetTxFiFo`的 TX 缓冲区配置错误。
我的配置代码:
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40); /* Default control EP */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40); /* CDC bulk EP */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x10); /* CDC interrupt EP */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 3, 0x10); /* HID interrupt EP */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 4, 0x40); /* App bulk EP */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 5, 0x40); /* App interrupt EP */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 6, 0x40); /* App isochronous EP */
可能是这里出错了。我不清楚这个编号如何和实际端点绑定,也不确定是否挤占了 RX FIFO 空间。我看到有资料说 F4 系列只支持 0~5 号 FIFO,不确定 L4 是否同样有这个限制?
|
|