关于Ch32F103 USB全速设备控制器(USBD)端口的问题

在使用usbd模拟xbox的过程中,使用大于等于4的endpoint会出现一些问题。我把问题简化成测试用例了,使用的是wch官方例程中的CH32F103EVT\EVT\EXAM\USB\USBD这个例程

测试1:

  直接使用例程,完全没问题ch372Succ.JPG可以看到,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);

结果如下:

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

stall.JPG

发现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重启,这是怎么回事呢?

xBox_endp5SendData.JPG

测试4

如果我初始化了endpoing 5,就会出现前面例子的stall的情况

现在感觉是端点号>=4的都有点问题

对USB全速主机设备控制器( USBHD )我也测试了,这个没问题。usbD有问题


这些测试用例,我是在官方的基础上改的,只改了描述符和USBD_Reset中的初始化代码



地址的设置:

/* 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个以上端点,需将EP_NUM改为15即可。

image.png

因双向端点1-5的模拟CH372设备程序比较大,如果需要可以留一下邮箱,程序通过邮箱发您测试一下。


只有登录才能回复,可以选择微信账号登录