反馈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:希望国产越做越好 谢谢反馈,无论你描述的问题是否与这个有关
但在这里清一下Busy标志位肯定是没错的
至于为什么会出现偶尔不发数据的现象还需要确认 本帖最后由 众哲之师 于 2023-11-30 17:53 编辑
拔插USB接口时不稳定,偶尔出现单片机不发数
<-- 你的测试环境时怎样的啊?程序框架上肯定是确保连接成功上下位机才会收发数据啊
<-- 另外,HID发送数据不能呢太快的,否则会卡死
USB中断读写FIFO数据过多可能会导致错过串口中断或者串口溢出
<-- 或者使串口的优先级高于 USB中断的优先级 实测过没有,还是只是推测,没有实测很容易误导人的
页:
[1]