0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_pJlTbmA9 来源:STM32单片机 作者:STM32单片机 2023-09-27 15:19 次阅读

问题描述

客户反馈,使用STM32F446的高速USB外设,即USB_OTG_HS外设,且使用内置全速PHY。客户的产品USB用做device,自定义HID类,当连接带UOS操作系统的HOST时,会发现当前数据并没有成功发送,但是会发送上一次的数据,即发送数据出现”迟滞”现象。但在Windows下却没有出现此类问题。另外,客户同时还使用了STM32F446上的USB_OTG_FS外设,且此外设做同样的事一切正常,目前此问题只出现在USB_OTG_HS外设上。

问题查找

刚开始猜测是长度问题,即发送最大包长需要再发送一次空包。但客户反馈他们的发送长度为62个字节。于是去客户现场使用USB协议分析仪采数分析,发现一切通信正常。

通过查看客户演示重现问题的过程,发现在正常时是一切OK的,只在进行USB拔插时才发送问题。应用程序不断发送数据的过程中拔掉USB线,然后再次插上,在此过程中应用程序一直尝试发送数据。当USB线重新连接上且重新枚举成功后,“迟滞”现象则重现了,即每次应用程序调用发送接口实现发送的是上一次尝试发送的内容。

调试客户的程序,发现当USB线拔掉后,应用程序还会往USB IP对应的发送FIFO内写入数据,这其实是不对的。按理USB线拔掉后USB的状态应该恢复到默认状态,

即pdev->dev_state=USBD_STATE_DEFAULT. 但实际上,通过调试发现此状态在USB线拔掉后是suspend状态。

那么为什么会是这样的呢?

于是立即想到Vbus sensing功能。马上与客户硬件工程师核对,原来客户产品的USB_OTG_HS的Vbus_sensing脚是悬空的,并没有连接Vbus,但是客户的USB_OTG_FS外设却又是连接了。于是客户的产品两个USB口,同样的工作,一个USB口 正常,另一个USB口却会出现问题。

问题分析

差异找到了,接下来就是分析由此如何造成问题的。

由于USB_OTG_HS并没有真正实现Vbus sensing功能(因为没有硬件连接),于是当USB线断开时,应用程序并不能准确地检测到断开事件(Disconnected),只会出现suspend,应用程序是无法直接的区分真正的suspend和USB线断开连接的。当应用程序有数据需要通过USB口发送时,如果当前是suspend状态,那么它会首先唤醒USB总线然后再发送数据:

wKgZomUD9KyANPBjAACsn3HAJuw283.jpg Figure1

而这样发送远程唤醒信号时,device本身会产生一个resume中断,于是在resume中断回调函数内:

wKgaomUD9K6ADFqNAACEkPrHpQ8150.jpg Figure 2

如上所示,程序会将dev_state错误地恢复到上一次状态,即正常状态USBD_STATE_CONFIGURED, 如此一来,程序就错误地往USB IP的内的发送FIFO写入数据了,即使此时由于USB线已经断开而导致无法真正发送成功,但USB IP的内置发送FIFO此时是有了数据的。

通过调试,查看OTG_DTXFSTS1寄存器相应端点1对应的发送FIFO的剩余空间可知,这个时候的发送FIFO的确实有数据的。接下来是USB线插上重新枚举,那么为什么USB重新枚举后还会再现问题呢?通过设置断点发现,在USB成功重新枚举过后,通过OTG_DTXFSTS1寄存器指示,发送FIFO内容并没有清空,于是在接下来发送数据时,永远都是实际上发送的是上一次写入到FIFO中的数据。

问题解决

▼于是解决方法就很容易找到了▼

在USB重新枚举过后在合适的地方将端点1对应的发送FIFO清空一下即可。

wKgZomUD9K-AS0fOAAAX9lrdlyk157.png Figure 3

问题总结

在客户的这个案子中,由于USB_OTG_FS连接了VBUS SENSING脚,当USB线拔掉后,会产生正确的disconnect中断,USB device的状态也会正确地切换到default状态,从而过滤掉应用程序想要发送的数据,因此并不会出现类似问题,因此,在客户的产品设计中,建议硬件千万不要忘了连接vbus引脚,即使在想省IO引脚的情况下,这样容易造成对软件的开发诸多不便.

在USB的状态处于非configured状态时,最好不要往发送FIFO写入数据,应用程序应该想办法将这些数据过滤掉。

来源:STM32单片机

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6006

    文章

    44030

    浏览量

    622108
  • 接口
    +关注

    关注

    33

    文章

    7749

    浏览量

    148743
  • usb
    usb
    +关注

    关注

    59

    文章

    7471

    浏览量

    259139
  • STM32
    +关注

    关注

    2243

    文章

    10683

    浏览量

    349284
收藏 人收藏

    评论

    相关推荐

    STM32 USB数据接收与数据发送

    PMA中读取出来,放到用户自己缓冲区中。接着设置端点接收状态有效,因为当接收数据后,端点就会被关闭。最后置位接收带数据标志。 发送比接收简单多了看看下面的代码就知道了。/*** @brief通过
    发表于 11-13 14:08

    stm32 L476 SPI读取nandflash数据通过USB CDC发送进到USB发送忙状态

    发送到上位机的时候总是发着发着就进到USB发送忙的状态,追踪了一下,在不使用SPI读取nandflash数据,直接循环发送数组中固定
    发表于 11-12 08:44

    GPRS发送数据重新严重丢失现象

    弱弱的问一下,我用GPRS发送数据,大概300字节左右,频率1Hz,但是就收的数据有严重的丢失现象,我想用把没有发出去的数据先存起来,等到能
    发表于 03-08 06:35

    GPRS数据发送出现丢包现象

    大家好,我STM32通过SIM900A的GPRS给服务器发数据,为什么会出现如下丢包现象,是不是GPRS发送会有一个缓存,每次发送完我要清一
    发表于 04-17 06:36

    SIM900A的GPRS数据发送出现没有send ok现象

    各位,目前在开发STM32+SIM900A,因为用的是UDP协议,发现一个问题:发送一组数据的时候,模块一般会回“send ok”,但是会出现没有send ok现象,一旦没有这个
    发表于 06-06 04:36

    can总线通信出现奇怪现象

    目前在测试 nxp芯片can总线通信功能时出现一奇怪现象,在波特率为20k时,节点a以15ms时间间隔连续发送64帧数据过程中节点b发送一帧
    发表于 08-17 21:11

    为什么MINI板LWIP+ENC28J60调试中发送数据出现堵塞现象

    我在用迷你板移植LWIP时作为RAW_TCP客户端的时候板子于上位机链接正常,按键KEY0键后前几条数据可以正常发送,后来就出现数据发送不出
    发表于 09-18 04:36

    请问为什么PDMA发送数据被替换的现象会发生?

    为什么PDMA发送数据被替换的现象会发生?
    发表于 12-21 06:46

    TMS320C6748:USB CPPI DMA发送多组数据缓存长度为4M的数据发送第2组数据时会出现死机的现象!!!!

    实现第一条数据长度为4M数据缓存时,可以直接进行发送,当第二次在发送4M数据时就会出现死机的
    发表于 08-06 16:46

    TMS320C6748:硬件USB 开启CPPI DMA,多次发送长度为4M的数据缓存,出现死机的现象!!!!!!

    实现第一条数据长度为4M数据缓存时,可以直接进行发送,当第二次在发送4M数据时就会出现死机的
    发表于 08-09 14:24

    CH582发送数据量大时,出现丢包现象的原因是什么?

    蓝牙每次只能发20字节左右的数据,连续发送几百字节,会出现丢包现象。加大连接间隔等参数,仍存在丢包;造成的原因有哪些?
    发表于 08-02 07:04

    为什么用DMA发送串口数据时会出现数据覆盖的现象呢?

    大神好。我在用DMA发送串口数据时会出现数据覆盖的现象我用这种方式打开并配置串口DAM:g_uart2obc = rt_device_fin
    发表于 01-10 18:18

    怎么避免无刷电机在工作的时候出现迟滞换向?

    怎么避免无刷电机在工作的时候出现迟滞换向
    发表于 10-10 06:25

    电站的出力特性和响应迟滞“拖尾现象”产生的原因

    风光储联合电站集合了风电、光伏和储能单元等不同种类电源,其有功协调控制是电站运行的关键技术。实际运行中出现了有功控制的响应迟滞拖尾现象,即电站有功指令下达后,各类型电源响应时间参差不齐,整体呈现
    发表于 01-02 14:43 11次下载
    电站的出力特性和响应<b class='flag-5'>迟滞</b>“拖尾<b class='flag-5'>现象</b>”产生的原因

    焊接时出现炸锡现象的原因有哪些?

    炸锡是PCBA加工制程中的一种焊接不良现象,也就是在加工中焊点锡膏产生炸裂从而导致焊点不完整、气孔、锡珠等现象,那么究竟是什么原因导致出现炸锡现象呢?接下来深圳佳金源锡膏厂带大家详细了
    的头像 发表于 03-15 16:44 611次阅读
    焊接时<b class='flag-5'>出现</b>炸锡<b class='flag-5'>现象</b>的原因有哪些?