[原创] 关于USB热插拔遇到的问题与解决方法

zhaojun_xf   2014-2-14 14:49 楼主
对于USB来说,我们都知道,其最大的特性就是支持热插拔。而对于STM32来说,从USB没有插入到插入是可以检查出来的;而从插入到扒出却无法检查出来。 在USB存在的情况下我们发送数据的没有问题的,如果在USB不存在的时候向USB发送数据是无法实现的,为此会遇到一系列问题。 为了保证代码的正常发送,一般来说,我们会通过标志进行判断,USB数据发送完成后程序会调用 EP1_IN_Callback()实现标志清除,只有USBSndMark为0时才表示数据发送完成,发送完成数据后,我们才可以发送下一帧数据,保证USB能够正确发送每一帧数据。
  1. /*******************************************************************************

  2. * Function Name : EP1_IN_Callback.
  3. * Description : EP1 IN Callback Routine.
  4. * Input : None.
  5. * Output : None.
  6. * Return : None.
  7. *******************************************************************************/
  8. void EP1_IN_Callback(void)
  9. {
  10. SetEPTxStatus(ENDP1, EP_TX_NAK);
  11. USBSndMark = 0;
  12. }

    /*******************************************************************************

  13. * Function Name : EP1_IN_SendDat.
  14. * Description : 数据发
  15. * Input : None.
  16. * Output : None.
  17. * Return : None.
  18. *******************************************************************************/
  19. void EP1_IN_SendDat(u8 *pDat, u16 len)
  20. {
  21. u16 timCnt = 0;
  22. while ((++timCnt < 4000) && (USBSndMark == 1)) ;
  23. if (USBSndMark == 0)
  24. {
  25. USBSndMark = 1;
  26. USB_SIL_Write(EP1_IN, pDat, len);
  27. }
  28. }
如果USB没有插入,而我们又不能判断,那么将会导致程序在while ((++timCnt < 4000) && (USBSndMark == 1)) 地方延时,导致程序的实时性大大折扣,效率低下。为了提高整个代码的运行效率,我们在没有USB的情况下就不发送数,有USB的情况下才需要发送数据,这时就必须了解什么时候USB存在,什么时候USB不存在。 对于USB的插入我们可以通过bDeviceState 变量获取,如果此变量为 CONFIGURED表示连接正常,可以通过USB发送数据;但是USB的扒出并不会清除变量bDeviceState,而是保持为CONFIGURED,为此我们根本无法判断USB是否扒出。可能有点人说还有其他方式可以知道USB扒出,这个我不否则,但我没有找到,最终想到最好的方法就是坚持USB电源,如果USB有电源,我们可以判断bDeviceState的值,但USB电源都没有了,
  1. if (GPIO_ReadInputDataBit(CDS_USBC_PORT, CDS_USBC_PIN))
  2. {
  3. if (bDeviceState == CONFIGURED)
  4. {
  5. EP1_IN_SendDat(tmpBuf, 64);
  6. }
  7. }
  8. else
  9. {
  10. bDeviceState = UNCONNECTED;
  11. }
那么一定被扒出了,这是就不需要发送数据到USB了。 本帖最后由 zhaojun_xf 于 2014-2-14 15:02 编辑

回复评论 (3)

通过上面的方法我们可以非常方便的实现USB插拔。
我的博客
点赞  2014-2-14 15:03
谢谢分享
淘宝:https://viiot.taobao.com/Q群243090717 多年专业物联网行业经验,个人承接各类物联网外包项目
点赞  2014-2-15 11:34
拔出检测可以通过外围电路实现啊
点赞  2014-2-16 11:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复