你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

USB 发送数据时出现迟滞现象

[复制链接]
STMCU小助手 发布时间:2022-7-29 16:48
1 问题描述
  @8 f+ R  k' d5 ]3 R客户反馈,使用 STM32F446 的高速 USB 外设,即 USB_OTG_HS 外设,且使用内置全速 PHY。客户的产品 USB 用做 device,自定义 HID 类,当连接带 UOS 操作系统的 HOST 时,会发现当前数据并没有成功发送,但是会发送上一次的数据,即发送数据出现”迟滞”现象。但在 Windows 下却没有出现此类问题。另外,客户同时还使用了STM32F446 上的 USB_OTG_FS 外设,且此外设做同样的事一切正常,目前此问题只出现在 USB_OTG_HS 外设上。  x& e, @, J; X- ^1 n7 X9 F
7 W  A" f& R: L: {& h5 s( G

5 y6 N2 s5 D  n$ d2 问题分析及解决方法
( `& E0 l8 H+ Y- |. r, x% }# I$ w刚开始猜测是长度问题,即发送最大包长需要再发送一次空包。但客户反馈他们的发送长度为 62 个字节。于是去客户现场使用 USB 协议分析仪采数分析,发现一切通信正常。# [) u$ A- v( m2 w) `) m3 o4 R
通过查看客户演示重现问题的过程,发现在正常时是一切 OK 的,只在进行 USB 拔插时才发送问题。应用程序不断发送数据的过程中拔掉 USB 线,然后再次插上,在此过程中应用程序一直尝试发送数据。当 USB 线重新连接上且重新枚举成功后,“迟滞”现象则重现了,即每次应用程序调用发送接口实现发送的是上一次尝试发送的内容。2 Z9 C" i% R3 p, d7 {! n- W0 R5 Y
调试客户的程序,发现当 USB 线拔掉后,应用程序还会往 USB IP 对应的发送 FIFO 内写入数据,这其实是不对的。$ P* C, k+ A4 _- u7 a; [0 u$ q$ t- q
按理 USB 线拔掉后 USB 的状态应该恢复到默认状态,即 pdev->dev_state=USBD_STATE_DEFAULT. 但实际上,通过调试发现此状态在 USB 线拔掉后是 suspend 状态。那么为什么会是这样的呢?于是立即想到 Vbus sensing 功能。
5 n5 ~& p. S; Z( H1 g' u4 p* ~, R7 C马上与客户硬件工程师核对,原来客户产品的 USB_OTG_HS 的 Vbus_sensing 脚是悬空的,并没有连接 Vbus,但是客户的 USB_OTG_FS 外设却又是连接了。于是客户的产品两个 USB 口,同样的工作,一个 USB 口 正常,另一个USB 口却会出现问题。. U0 ~0 ^% _" j
差异找到了,接下来就是分析由此如何造成问题的。! P* m# Y6 ~& r
由于 USB_OTG_HS 并没有真正实现 Vbus sensing 功能(因为没有硬件连接),于是当 USB 线断开时,应用程序并不能准确地检测到断开事件(Disconnected),只会出现 suspend,应用程序是无法直接的区分真正的 suspend 和USB 线断开连接的。当应用程序有数据需要通过 USB 口发送时,如果当前是 suspend 状态,那么它会首先唤醒 USB总线然后再发送数据:. O) t- [4 N9 G7 u" u
  1. if(hUsbDeviceHS.dev_state ==USBD_STATE_SUSPENDED)
    + h' j% O! K8 Z' f4 r
  2. {
    4 R- h  x0 n8 i9 G. Z
  3. __HAL_PCD_UNGATE_PHYCLOCK((PCD_HandleTypeDef*) hUsbDeviceHS.pData);3 A8 t4 R1 Y1 d/ {! U0 u/ B9 I
  4. HAL_PCD_ActivateRemoteWakeup((PCD_HandleTypeDef*) hUsbDeviceHS.pData);
    * z4 T. j1 ^- R2 G! F8 z
  5. HAL_Delay(20);
    + T3 t9 C  c: ?) Y
  6. HAL_PCD_DeActivateRemoteWakeup((PCD_HandleTypeDef*) hUsbDeviceHS.pData);  w4 L, r7 L; L. h6 [7 x
  7. (void)USBD_LL_Transmit(&hUsbDeviceHS, HID_EPIN_ADDR, gData, 4);
    " H( A  o( k) S  v. c4 s, c8 d
  8. }
复制代码

2 b2 o' ]  R- k4 `$ M, g* M$ D! T) \& u/ e
而这样发送远程唤醒信号时,device 本身会产生一个 resume 中断,于是在 resume 中断回调函数内:
  N3 Q7 h- z( b
  1. USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev)
    9 ~- |+ g& U% b7 c3 p& e" t. O
  2. {$ t% I3 |3 m3 [  p& D' w7 a" F
  3. if (pdev->dev_state == USBD_STATE_SUSPENDED)
    + B  d5 y5 W: c: Y
  4. {- p  @' w1 ?0 l" N& F0 N- C
  5. pdev->dev_state = pdev->dev_old_state;
    : `' p! _$ H( v4 `' z% @0 V5 u2 H
  6. }/ F) M9 N& X, G5 Z
  7. return USBD_OK;; k: `: V7 L* o; S
  8. }
复制代码
9 M. p2 d9 ?* G  s$ }6 \7 i  D; W4 o
1 s+ p" w, o; q
完整版请查看:附件
4 \3 e+ l9 s* y  h3 f
+ W6 V9 y4 f5 d0 |
8 Y9 i# g8 h& u  Q) l

LAT1016_USB发送数据时出现迟滞现象_v1.0.pdf

下载

311.84 KB, 下载次数: 9

赞 收藏 评论0 发布时间:2022-7-29 16:48

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版