找回密码
 立即注册
查看: 556|回复: 3

反馈USB HID 例程中一个 BUG

[复制链接]

该用户从未签到

6

主题

15

回帖

134

积分

注册会员

积分
134
发表于 2023-4-18 20:34:54 | 显示全部楼层 |阅读模式
问题现象是: 拔插USB接口时不稳定,偶尔出现单片机不发数据。   具体原理不清楚,最后推测问题出在 usb_reset  函数中  UsbInBusy 没有清 0!

void usb_reset()
{
    usb_write_reg(FADDR, 0x00);
    DeviceState = DEVSTATE_DEFAULT;
    Ep0State.bState = EPSTATE_IDLE;

#ifdef EN_EP1IN
    usb_write_reg(INDEX, 1);
    usb_write_reg(INCSR1, INCLRDT | INFLUSH);
#endif
#ifdef EN_EP2IN
    usb_write_reg(INDEX, 2);
    usb_write_reg(INCSR1, INCLRDT | INFLUSH);
#endif
#ifdef EN_EP3IN
    usb_write_reg(INDEX, 3);
    usb_write_reg(INCSR1, INCLRDT | INFLUSH);
#endif
#ifdef EN_EP4IN
    usb_write_reg(INDEX, 4);
    usb_write_reg(INCSR1, INCLRDT | INFLUSH);
#endif
#ifdef EN_EP5IN
    usb_write_reg(INDEX, 5);
    usb_write_reg(INCSR1, INCLRDT | INFLUSH);
#endif
#ifdef EN_EP1OUT
    usb_write_reg(INDEX, 1);
    usb_write_reg(OUTCSR1, OUTCLRDT | OUTFLUSH);
#endif
#ifdef EN_EP2OUT
    usb_write_reg(INDEX, 2);
    usb_write_reg(OUTCSR1, OUTCLRDT | OUTFLUSH);
#endif
#ifdef EN_EP3OUT
    usb_write_reg(INDEX, 3);
    usb_write_reg(OUTCSR1, OUTCLRDT | OUTFLUSH);
#endif
#ifdef EN_EP4OUT
    usb_write_reg(INDEX, 4);
    usb_write_reg(OUTCSR1, OUTCLRDT | OUTFLUSH);
#endif
#ifdef EN_EP5OUT
    usb_write_reg(INDEX, 5);
    usb_write_reg(OUTCSR1, OUTCLRDT | OUTFLUSH);
#endif
    usb_write_reg(INDEX, 0);
  UsbInBusy = 0; // 这个地方需要将繁忙状态清零 !!!!!!!!!!!!
}

另外,涉及到串口的,  USB 中断中读写 FIFO 数据较多时(比如64字节), 可能会导致错过串口中断,或者串口溢出。

PS:希望国产越做越好
回复 送花

使用道具 举报

  • TA的每日心情
    开心
    2024-5-11 09:06
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    724

    回帖

    2584

    积分

    超级版主

    积分
    2584
    发表于 2023-4-19 08:54:23 | 显示全部楼层
    谢谢反馈,无论你描述的问题是否与这个有关
    但在这里清一下Busy标志位肯定是没错的
    至于为什么会出现偶尔不发数据的现象还需要确认
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    2024-4-7 20:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    5

    主题

    14

    回帖

    141

    积分

    注册会员

    积分
    141
    发表于 2023-11-30 17:29:26 | 显示全部楼层
    本帖最后由 众哲之师 于 2023-11-30 17:53 编辑

    拔插USB接口时不稳定,偶尔出现单片机不发数
    <-- 你的测试环境时怎样的啊?程序框架上肯定是确保连接成功上下位机才会收发数据啊
    <-- 另外,HID发送数据不能呢太快的,否则会卡死

    USB中断读写FIFO数据过多可能会导致错过串口中断或者串口溢出
    <-- 或者使串口的优先级高于 USB中断的优先级
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    3 小时前
  • 签到天数: 128 天

    [LV.7]常住居民III

    3

    主题

    217

    回帖

    628

    积分

    高级会员

    积分
    628
    发表于 2023-12-2 15:05:19 | 显示全部楼层
    实测过没有,还是只是推测,没有实测很容易误导人的
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-22 13:12 , Processed in 0.056619 second(s), 41 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表