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