GD32F450的USB通信改变端点的坑

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也不要改变,只要所有加起来,不超过就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值