在使用usbd模擬xbox的過程中,使用大于等于4的endpoint會出現(xiàn)一些問題。我把問題簡化成測試用例了,使用的是wch官方例程中的CH32F103EVT\EVT\EXAM\USB\USBD這個例程
測試1:
? 直接使用例程,完全沒問題可以看到,setup過程正確的建立了。這個設備一共有0~4,5個端點。
但是在void USBD_Reset(void)這個函數(shù)中,只初始化了0~3這4個端點,4號endpoint沒有初始化。在setup過程中也沒用到它
測試2:
?修改USBD_Reset(void)函數(shù),增加對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);
發(fā)現(xiàn)endpoint 0 stall了
想問的就是:設置endpoint 5為什么會影響到endpoint 0的setup過程? 這個設備也完全用不到endpoint 5
測試3:
把例子的設備描述符和配置描述符改成xbox的,xbox會用到端點4,5. 在USBD_Reset(void)這個函數(shù)中我沒有初始化endpoint 4,5.但是卻發(fā)現(xiàn)endpoing 5會發(fā)數(shù)據(jù)給pc端。導致pc端不斷的發(fā)送Clear_feature重啟,這是怎么回事呢?
測試4
如果我初始化了endpoing 5,就會出現(xiàn)前面例子的stall的情況
現(xiàn)在感覺是端點號>=4的都有點問題
對USB全速主機設備控制器( USBHD )我也測試了,這個沒問題。usbD有問題
這些測試用例,我是在官方的基礎上改的,只改了描述符和USBD_Reset中的初始化代碼