在使用usbd模拟xbox的过程中,使用大于等于4的endpoint会出现一些问题。我把问题简化成测试用例了,使用的是wch官方例程中的CH32F103EVT\EVT\EXAM\USB\USBD这个例程
测试1:
直接使用例程,完全没问题可以看到,setup过程正确的建立了。这个设备一共有0~4,5个端点。
但是在void USBD_Reset(void)这个函数中,只初始化了0~3这4个端点,4号endpoint没有初始化。在setup过程中也没用到它
测试2:
修改USBD_Reset(void)函数,增加对endpoint 5的初始化,
SetEPType(ENDP5, EP_INTERRUPT);
SetEPRxAddr(ENDP5, ENDP5_RXADDR);
SetEPRxCount(ENDP5, USBD_DATA_SIZE);
SetEPTxAddr(ENDP5, ENDP5_TXADDR);
SetEPTxCount(ENDP5, USBD_DATA_SIZE);
SetEPRxStatus(ENDP5, EP_RX_NAK);
SetEPTxStatus(ENDP5, EP_TX_NAK);
// SetEPRxStatus(ENDP4, EP_RX_DIS);
// SetEPTxStatus(ENDP4, EP_TX_DIS);
// SetEPRxStatus(ENDP4, EP_RX_VALID);
// SetEPTxStatus(ENDP4, EP_RX_VALID);
_ClearDTOG_RX(ENDP5);
_ClearDTOG_TX(ENDP5);
结果如下:
端点0 reset了
如果设置成这个样子:
SetEPType(ENDP5, EP_INTERRUPT);
SetEPRxAddr(ENDP5, ENDP5_RXADDR);
SetEPRxCount(ENDP5, USBD_DATA_SIZE);
SetEPTxAddr(ENDP5, ENDP5_TXADDR);
SetEPTxCount(ENDP5, USBD_DATA_SIZE);
// SetEPRxStatus(ENDP5, EP_RX_NAK);
// SetEPTxStatus(ENDP5, EP_TX_NAK);
// SetEPRxStatus(ENDP4, EP_RX_DIS);
// SetEPTxStatus(ENDP4, EP_TX_DIS);
SetEPRxStatus(ENDP4, EP_RX_VALID);
SetEPTxStatus(ENDP4, EP_RX_VALID);
_ClearDTOG_RX(ENDP5);
_ClearDTOG_TX(ENDP5);
发现endpoint 0 stall了
想问的就是:设置endpoint 5为什么会影响到endpoint 0的setup过程? 这个设备也完全用不到endpoint 5
测试3:
把例子的设备描述符和配置描述符改成xbox的,xbox会用到端点4,5. 在USBD_Reset(void)这个函数中我没有初始化endpoint 4,5.但是却发现endpoing 5会发数据给pc端。导致pc端不断的发送Clear_feature重启,这是怎么回事呢?
测试4
如果我初始化了endpoing 5,就会出现前面例子的stall的情况
现在感觉是端点号>=4的都有点问题
对USB全速主机设备控制器( USBHD )我也测试了,这个没问题。usbD有问题
这些测试用例,我是在官方的基础上改的,只改了描述符和USBD_Reset中的初始化代码