zdg102 发表于 2023-4-18 20:34:54

反馈USB HID 例程中一个 BUG

问题现象是: 拔插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:希望国产越做越好

zhp 发表于 2023-4-19 08:54:23

谢谢反馈,无论你描述的问题是否与这个有关
但在这里清一下Busy标志位肯定是没错的
至于为什么会出现偶尔不发数据的现象还需要确认

众哲之师 发表于 2023-11-30 17:29:26

本帖最后由 众哲之师 于 2023-11-30 17:53 编辑

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

USB中断读写FIFO数据过多可能会导致错过串口中断或者串口溢出
<-- 或者使串口的优先级高于 USB中断的优先级

Snapdragon 发表于 2023-12-2 15:05:19

实测过没有,还是只是推测,没有实测很容易误导人的
页: [1]
查看完整版本: 反馈USB HID 例程中一个 BUG