搜索
bottom↓
回复: 17

如何判断STM32 USB已经可用?

[复制链接]

出0入0汤圆

发表于 2019-7-9 20:03:22 | 显示全部楼层 |阅读模式
使用cubemx生成USB CDC VCP的代码,PC端win10,插拔USB口设备管理器里面COM都能很好的识别到。如果调用CDC_Transmit_FS也可以发送数据到串口助手显示。这些都是OK的。
不OK的地方是:如果调用CDC_Transmit_FS发送频率稍快,比如500ms(其实一点儿也不快)或更短周期,插拔USB口后PC端就识别不到COM口了。那么问题是如何来判断USB已经就绪?在usbd_conf.c里面的HAL_PCD_ConnectCallback函数里面置位标志的简单方法也不行。

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2019-7-9 21:11:18 | 显示全部楼层
USB对象结构体里有状态指示,正常配置后值为0x03.挂起后值为0x04。其意义可见其宏定义名称。

出0入0汤圆

 楼主| 发表于 2019-7-10 10:02:34 | 显示全部楼层
mii 发表于 2019-7-9 21:11
USB对象结构体里有状态指示,正常配置后值为0x03.挂起后值为0x04。其意义可见其宏定义名称。 ...

你说的是PCD_HandleTypeDef *hpcd       hpcd->State吗

出0入0汤圆

发表于 2019-7-11 09:56:05 | 显示全部楼层
onev 发表于 2019-7-10 10:02
你说的是PCD_HandleTypeDef *hpcd       hpcd->State吗

/* USB Device Core handle declaration. */
USBD_HandleTypeDef hUsbDeviceHS;

我用的是HS,你可以打到这个结构体所定义的对像,里面会有State

出0入0汤圆

 楼主| 发表于 2019-7-11 11:20:14 | 显示全部楼层
  1. /* USB Device handle structure */
  2. typedef struct _USBD_HandleTypeDef
  3. {
  4.   uint8_t                 id;
  5.   uint32_t                dev_config;
  6.   uint32_t                dev_default_config;
  7.   uint32_t                dev_config_status;
  8.   USBD_SpeedTypeDef       dev_speed;
  9.   USBD_EndpointTypeDef    ep_in[15];
  10.   USBD_EndpointTypeDef    ep_out[15];
  11.   uint32_t                ep0_state;
  12.   uint32_t                ep0_data_len;
  13.   uint8_t                 dev_state;
  14.   uint8_t                 dev_old_state;
  15.   uint8_t                 dev_address;
  16.   uint8_t                 dev_connection_status;
  17.   uint8_t                 dev_test_mode;
  18.   uint32_t                dev_remote_wakeup;

  19.   USBD_SetupReqTypedef    request;
  20.   USBD_DescriptorsTypeDef *pDesc;
  21.   USBD_ClassTypeDef       *pClass;
  22.   void                    *pClassData;
  23.   void                    *pUserData;
  24.   void                    *pData;
  25. } USBD_HandleTypeDef;
复制代码

出0入0汤圆

发表于 2019-7-11 17:53:14 | 显示全部楼层

  uint8_t                 dev_state;

出0入0汤圆

 楼主| 发表于 2019-7-11 21:19:01 | 显示全部楼层
mii 发表于 2019-7-11 17:53
uint8_t                 dev_state;

  1. if(hUsbDeviceFS.dev_state == USBD_STATE_CONFIGURED)
  2. {       
  3.         CDC_Transmit_FS(ch, sizeof(ch));       
  4. }
复制代码


你的意思是这样吗?

出0入0汤圆

发表于 2019-7-11 21:50:02 | 显示全部楼层
onev 发表于 2019-7-11 21:19
你的意思是这样吗?

yes,you are so smart

出0入0汤圆

发表于 2019-7-11 21:56:41 | 显示全部楼层
mii 发表于 2019-7-9 21:11
USB对象结构体里有状态指示,正常配置后值为0x03.挂起后值为0x04。其意义可见其宏定义名称。 ...

如果判断到USB无法打开端口,是否可以直接重新初始化USB,使其能打开端口?我现在都是重新插拔一次USB来解决的

出0入0汤圆

发表于 2019-7-11 22:03:38 | 显示全部楼层
bad_fpga 发表于 2019-7-11 21:56
如果判断到USB无法打开端口,是否可以直接重新初始化USB,使其能打开端口?我现在都是重新插拔一次USB来 ...

作为从机设备,我也无法解决这个问题。例如像U盘一样,我插上去枚举不成功,我也只能再插入一次。

我也遇到这类似问题,已经正常枚举了,然后线松了,USB就被挂起了(我看了状态是挂起),然后尝试去关闭,再重新初始化。还是不成功。

但还有一种想法我是没试过的,如果你用103系列,USB的PD+还是PD-需要上拉一个电阻,还需要 一个IO来控制告诉电脑是否有设备插入。因为我用F4系列,就没有这个电阻。

你有兴趣可以上网找一下资料,尝试一下在数据线上加个电阻控制一下,看能不能重新枚举。

出0入0汤圆

 楼主| 发表于 2019-7-12 09:32:53 | 显示全部楼层
mii 发表于 2019-7-11 21:50
yes,you are so smart

这个方法试过并不行

出0入0汤圆

发表于 2019-7-12 09:57:25 | 显示全部楼层
onev 发表于 2019-7-12 09:32
这个方法试过并不行

你可以尝试在其他电脑系统上再试试,通常不能再次枚举,都是运行在某地方卡死了。

你可以贴一下代码,以便分析

出0入0汤圆

 楼主| 发表于 2019-7-12 10:31:18 | 显示全部楼层
mii 发表于 2019-7-12 09:57
你可以尝试在其他电脑系统上再试试,通常不能再次枚举,都是运行在某地方卡死了。

你可以贴一下代码,以 ...

代码直接使用cubemx(v5.2.1)生成,试过STM32F407G-DISC1和NUCLEO-H743ZI都是一样的结果,HAL库分别是STM32Cube_FW_F4_V1.24.1和STM32Cube_FW_H7_V1.4.0。
如果不调用CDC_Transmit_FS函数,插拔后PC是能够很好的识别到COM口的,而且插拔后通过PC端串口助手向MCU发送数据也是OK的。
不插拔USB口调用CDC_Transmit_FS函数,PC端也是能很好的接收到数据的。
唯独调用CDC_Transmit_FS后如果插拔USB口,PC端就识别不到COM口了,直接就是

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2019-7-12 12:30:24 来自手机 | 显示全部楼层
我是100毫秒间隔发数据,每包70字节,就会发现丢一半数据

出0入0汤圆

 楼主| 发表于 2019-7-12 14:16:27 | 显示全部楼层
justdomyself 发表于 2019-7-12 12:30
我是100毫秒间隔发数据,每包70字节,就会发现丢一半数据

丢数据倒是没有,打成1ms的延时间隔也没有丢,就是死活不能在调用CDC_Transmit_FS的情况下热插拔

出0入8汤圆

发表于 2019-7-19 22:06:53 | 显示全部楼层
本帖最后由 justdomyself 于 2019-7-19 22:08 编辑
onev 发表于 2019-7-12 14:16
丢数据倒是没有,打成1ms的延时间隔也没有丢,就是死活不能在调用CDC_Transmit_FS的情况下热插拔 ...

我的是每2ms定时器中断一次,再加上系统时钟中断。不知道是不是这个的影响。

出0入0汤圆

发表于 2019-7-20 10:06:42 | 显示全部楼层
热插拔,需要上位机软件支持的。
热插拔一次,USB设备要重新枚举一次,热插拔之前有效的句柄,热插拔之后就不有效了,需要关闭后重新再打开一次。

出0入0汤圆

 楼主| 发表于 2019-7-20 16:19:49 | 显示全部楼层
wuzhujian 发表于 2019-7-20 10:06
热插拔,需要上位机软件支持的。
热插拔一次,USB设备要重新枚举一次,热插拔之前有效的句柄,热插拔之后就 ...

如果没有调用CDC_Transmit_FS 热插拔没有问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-9-19 09:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表