GD32F450的USB通信中改变端点的坑
这几天需要在 GD32F450开发板上编写一个使用USB Full-speed的小应用,以前写的USB通信程序是High-speed的,这是前提,不是重点。重点是当我想当然的定义好了USE_USBFS之后,以为可以正常通信时,发现从主机到设备可以正常通信,但从设备到主机怎么也不通,还原USE_USHS后恢复正常。
然后,在USE_USBHS模式下将原有的EP2_OUT,EP2_IN,改成EP3_OUT,EP1_IN后,发现跟USE_USBFS一样,主机到设备可以正常通信,但从设备到主机怎么也不通。百思不得其解。
经过不懈的查找,最后在驱动中的usb_conf.h中发现下面一段。
#ifdef USBFS_CORE // 320Bytes
#define RX_FIFO_FS_SIZE 128
#define TX0_FIFO_FS_SIZE 64
#define TX1_FIFO_FS_SIZE 128
#define TX2_FIFO_FS_SIZE 0
#define TX3_FIFO_FS_SIZE 0
#define USBFS_LOW_PWR_MGMT_SUPPORT
// #define USBFS_SOF_OUTPUT_ENABLED
#endif /* USBFS_CORE */
#ifdef USBHS_CORE // 1024Bytes
#define RX_FIFO_HS_SIZE 512
#define TX0_FIFO_HS_SIZE 64
#define TX1_FIFO_HS_SIZE 0
#define TX2_FIFO_HS_SIZE 448
#define TX3_FIFO_HS_SIZE 0
#define TX4_FIFO_HS_SIZE 0
#define TX5_FIFO_HS_SIZE 0
#ifdef USE_ULPI_PHY
#define USB_ULPI_PHY_ENABLED
#endif
#ifdef USE_EMBEDDED_PHY
#define USB_EMBEDDED_PHY_ENABLED
#endif
#define USBHS_INTERNAL_DMA_ENABLED
#define USBHS_DEDICATED_EP1_ENABLED
#define USBHS_LOW_PWR_MGMT_SUPPORT
#define USBHS_SOF_OUTPUT_ENABLED
#endif /* USBHS_CORE */
其中描述的很清楚,在USBHS_COR模式下TX1_FIFO_HS_SIZE大小为零,对应EP1_IN,所以主机接收不到数据,只有EP2_IN正常,USBFS_CORE模式下也是一样的道理。从程序推断所有EP_OUT共用一个FIFO不受影响,而EP_IN分开设置的,用哪个就要设好哪个的大小。
将所需要的端点FIFO调整大小后,一切都正常了。值得注意的是,其中的320Bytes,1024Bytes是硬件支持的总大小,不可改变,RX_FIFO_HS_SIZE和TX0_FIFO_HS_SIZE也不要改变,只要所有加起来,不超过就可以了。