10251|3

4996

帖子

19

TA的资源

裸片初长成(初级)

楼主
 

关于USB热插拔遇到的问题与解决方法 [复制链接]

本帖最后由 zhaojun_xf 于 2014-2-14 15:02 编辑 对于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了。
此帖出自stm32/stm8论坛

最新回复

拔出检测可以通过外围电路实现啊  详情 回复 发表于 2014-2-16 11:32
点赞 关注(1)
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

沙发
 
通过上面的方法我们可以非常方便的实现USB插拔。
此帖出自stm32/stm8论坛
 
个人签名我的博客
 

回复

3238

帖子

5

TA的资源

五彩晶圆(中级)

板凳
 
谢谢分享
此帖出自stm32/stm8论坛
 
个人签名淘宝:https://viiot.taobao.com/Q群243090717
多年专业物联网行业经验,个人承接各类物联网外包项目
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

4
 
拔出检测可以通过外围电路实现啊
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表