關(guān)于Ch32F103 USB全速設(shè)備控制器(USBD)端口的問(wèn)題

在使用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)題ch372Succ.JPG可以看到,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é)果如下:

reset.JPG端點(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);

stall.JPG

發(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重啟,這是怎么回事呢?

xBox_endp5SendData.JPG

測(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中的初始化代碼



地址的設(shè)置:

/* EP1? */

/* tx buffer base address */

#define ENDP1_TXADDR? ? ? ? (0xC0)

#define ENDP2_TXADDR? ? ? ? (0x100)

#define ENDP2_RXADDR? ? ? ? (0x110)

#define ENDP3_RXADDR? ? ? ? (0x111)

#define ENDP4_RXADDR? ? ? ? (0x140) /////////

#define ENDP4_TXADDR? ? ? ? (0x180) /////////

#define ENDP5_RXADDR? ? ? ? (0x1C0) /////////

#define ENDP5_TXADDR? ? ? ? (0x200) /////////



您好,使用4個(gè)以上端點(diǎn),需將EP_NUM改為15即可。

image.png

因雙向端點(diǎn)1-5的模擬CH372設(shè)備程序比較大,如果需要可以留一下郵箱,程序通過(guò)郵箱發(fā)您測(cè)試一下。


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频