ch32v208 USBFS_Endp_DataUp 没有发送数据

    {
        //USB Mode
        USBFS_RCC_Init();
        USBFS_Device_Init(ENABLE);
        USB_Sleep_Wakeup_CFG();
    }

    while(1)
    {
        KeyValue[2] = 0x04;
        status = USBFS_Endp_DataUp(DEF_UEP1, KeyValue, sizeof(KeyValue), DEF_UEP_CPY_LOAD);
        Delay_Ms(10);
        KeyValue[2] = 0x00;
        status = USBFS_Endp_DataUp(DEF_UEP1, KeyValue, sizeof(KeyValue), DEF_UEP_CPY_LOAD);
        Delay_Ms(1000);
    }


我在尝试写一个hid的复合设备,目前识别没什么问题


但是并没有和期望的一样输入A键


从bus hound来看,似乎并没有每1秒传个包?

还是说我代码漏了什么东西?


1696483356247923.png

1696483356850600.png


你好,while1中,需要先等待枚举完成,否则会reset重新初始化端点,导致busy标志位清零,一直无法上传数据。

image.png


已经更新了代码,仍然并没有表现出预期的每一秒按一次A键,而是不规律的表现


所以我现在有一些不太理解这个逻辑结构了


比如说做一个TIM去扫描矩阵,如果有变化那么flag=1

while(1)中轮询usbfs_devenumstatus和flag,都为1就更新一次endpoint并清除flag


是要这样做么?


Screenshot 2023-10-30 232729.png


你好,例程里的USB键值只发送一个的话是keyboard1_Value[2]=0x04;多个键按下,则往后放。

例程里键盘上报的时间是10ms一次,这样写有小概率丢包。

USBFS_Endp_DataUp这个函数并不保证发送成功,如果上次的数据没有发送完成,则不会装载这次的数据,参考KB_Scan_Handle里的写法

image.png


我大概看了一遍代码 这样理解是不是正确


endpoint只在空的时候接受数据,不接受新的数据覆盖;

usb irq中上传endpoint数据后USBFS_Endp_Busy会被清零,才会接受新的数据


那么是不是我可以这么说,不使用USBFS_Endp_DataUp这个函数,或者说不使用USBFS_Endp_Busy这个flag去直接控制endpoint来完成USB传输


但是这并不能解释为什么10ms上报一次会有丢包,按理说这个时间是十分充足的


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