工程师笔记 |USB发送数据时出现迟滞现象

发布时间:2023-02-03  

问题描述

客户反馈,使用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总线然后再发送数据:


Figure1


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


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清空一下即可。


Figure 3


问题总结

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


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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    Type-C,属于USB3.0下一代接口,其亮点在于更加纤薄的设计、更快的传输速度(最高可达10Gbps)、更强的电力传输(最高100W),此外USB-C接口还支持双面插入,正反面随便插,相比USB2.0......
    硬盘等存储设备进行数据交换,及手机、平板等设备进行充电; 1) 支持USB3.0协议,数据传输速度支持5Gbps; 2) 兼容USB2.0协议,数据传输速度支持480Mbps; 3) 支持USB存储设备U盘、读卡......
    USB3.0接口和USB2.0接口在功耗等方面的比较;相对比较USB3.0接口比USB2.0接口好的地方,有几个因素是我们无法回避的,即带宽、功耗、总线利用率、物理总线、传输速度。具体内容如下: 1......
    量智能手机和携带式多媒体播放器的出现,更好的带宽和传输速率成为必要条件。 480Mbps的传输速率可能不快,更何况没有USB2.0接口设备能做到理论上的最高速率。在实际应用中,做到320Mbps的平均速度是非常好的。 其实USB3.0......
    分为A、B两个部分。它可以与目前USB2.0和USB3.0兼容,而B部分则是USB3.0扩展。 USB3.0连接器与USB2.0连接器的物理接口大小相同,但为提高传输速度,增加了四个插针到9个而非原来的5个......
    硕盟USB3.0 转RJ45千兆免驱网卡;产品介绍 硕盟SM-A44是一款USB3.0转RJ45千兆网口转换器。这是一种高性能和低开销的解决方案。转换USB端口到10 / 100/ 1000M以太网端口可以让您的笔记本......
    port 支持USB3.0协议,数据传输速度最高支持5Gbps; 兼容USB2.0协议,数据传输速度最高支持480Mbps; 支持USB存储设备U盘、读卡器等数据交换; 支持USB通讯设备、手机......
    1080 @60Hz. 4. USB3.0端口,可以插入U盘、鼠标、键盘、移动硬盘等存储设备进行数据交换,及手机、平板等设备进行充电; 1)支持USB3.0协议,数据传输速度最高支持5Gbps;2......
    器的规格也早已从1.1升级到现在使用的2.0标准,相信在不远的将来,相信USB3.0的最新一代标准更高速更完美的USB3.0规范会走进千家万户。 USB1.1的极限数据传输速度是12Mbps,USB2.0......
    电脑的专业人士希望有一个即插即用的扩展坞,能够在不需要安装驱动软件的情况下释放笔记本电脑的全部潜力,"Kensington 高级副总裁兼总经理 Giovanni Sena 解释说。"SD5000T5 是一个全方位的解决方案,提供超快的数据传输速度......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>