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