有没有人注意到USB连接的可靠性问题

[复制链接]
5543|21
 楼主| mxh0506 发表于 2007-10-25 14:34 | 显示全部楼层 |阅读模式
搜了一下,好象还没讨论过<br />有没有高手愿意讨论一下呢?
icecut 发表于 2007-10-26 09:48 | 显示全部楼层

你遇到不可靠的状态吗?

  
 楼主| mxh0506 发表于 2007-10-29 17:25 | 显示全部楼层

相信不止我一人遇到过吧?

  
doob 发表于 2007-10-30 16:31 | 显示全部楼层

很不可靠啊!

  
 楼主| mxh0506 发表于 2007-10-30 16:42 | 显示全部楼层

关键是有没有办法提高它的可靠性

否则很难在工业现场广泛使用<br /><br />我现在还在找连接不可靠的原因<br /><br />从现象上看,设备侧的内部状态都正常,只要拔/插一次USB电缆,强制其重新枚举就没事了.会不会是主机侧认为到设备的连接已经断掉了?<br /><br />不知道加强上拉有没有用。<br /><br />如果能从主机方以编程方式重新枚举的话就能证实这一点,在实际应用时也可以作为一种补救措施。正在找资料改PC机程序……
 楼主| mxh0506 发表于 2007-11-5 14:50 | 显示全部楼层

看来这是个比较冷门的话题

感兴趣的人不多啊<br />老外的网站上倒是有不少人在讨论
eastbest 发表于 2007-11-5 17:07 | 显示全部楼层

在device端做一个SOF检测

host&nbsp;每一毫秒会发一个SOF,如果device在一段时间没有检测到SOF,则把D+的1k5&nbsp;上拉电阻断开一会再接上,这样就相当于一次插拔动作了。
 楼主| mxh0506 发表于 2007-11-6 11:52 | 显示全部楼层

eastbest的建议不错,多谢!

看来是位高手,比我还早2年加入21IC<br />我一直在考虑如何从主机方解决,看来有点钻牛角尖了<br />这一想法来源于国外BBS上看到的一个贴子:<br />Some&nbsp;USB&nbsp;devices&nbsp;(like&nbsp;FTDI)&nbsp;have&nbsp;a&nbsp;special&nbsp;software&nbsp;call&nbsp;in&nbsp;their&nbsp;<br />drivers,&nbsp;which&nbsp;mimics&nbsp;a&nbsp;plug/unplug&nbsp;action<br />不过实现起来有点难<br /><br />以前也曾考虑过从设备方解决,不过也要主机方的程序配合.感觉主机上的程序如果无法感知USB拔出,不关闭驱动程序的话,即使重新插拔设备也不能顺利恢复连接<br />
平常人 发表于 2007-11-6 12:44 | 显示全部楼层

设备方连续3ms没有收到SOF表示需进入Standby状态

如果你这时做插拔动作,主机如何进入休眠状态?<br />
 楼主| mxh0506 发表于 2007-11-6 13:16 | 显示全部楼层

多谢平常人提醒

这确实是个问题<br /><br />不过我想可以解决:<br />由于我的设备在工作状态下是不允许主机休眠的(数据采集系统,长时间休眠会引起缓冲区溢出丢数据)因此可以只在工作状态下检查SOF,一旦停止工作就不再检查SOF<br /><br />我的主机程序是windows下的,USB设备被拔出可以用<font color=#FF0040>WM_DEVICECHANGE</font>消息感知<br /><br />这样不知会不会有问题
平常人 发表于 2007-11-6 15:51 | 显示全部楼层

如果是这样,不如增加定义一个专用的中断端口

主机通过这个端口不断地查询设备的状态,设备也会不断地收到主机的查询,任一方如果不能按时收到报告的状态或定时的查询,就要怀疑可能的连接故障了。<br /><br />可以把这个专用的中断端口传送的状态信息称为“心跳”;心跳是不能停的,心跳停了肯定是哪里出问题了。
 楼主| mxh0506 发表于 2007-11-6 17:32 | 显示全部楼层

这个主意不错

我想是否可以把取数的命令兼用作&quot;心跳&quot;<br />这样可以减少一点开销
cool_coder 发表于 2012-8-27 17:24 | 显示全部楼层
3ms时间比较短,很容易产生误判吧?
insignal 发表于 2012-8-27 21:42 | 显示全部楼层
本帖最后由 insignal 于 2012-8-27 21:52 编辑

主机端也可以实现plug/unplug
一个是通过编写底层的驱动来实现,这个比较困难
另一个就是控制device的电源,如果device没有响应则断开电源,重新上电。这个比较简单。在usb线上做个简单的控制就可以。原来我们在做usb设备的批量生产时,就采用过这种生产工装,简单可靠,减少人工参与,大大减低生产成本。

另外,usb应用在工业用途,usb的架构(必须是host+device)、电缆连接、传输都是很大的挑战。
各位如果在工业上有成功的案例,不妨和大家分享分享。
tchming 发表于 2012-8-28 08:31 | 显示全部楼层
插上之后没反应,确实够闹心的
cool_coder 发表于 2012-8-28 12:56 | 显示全部楼层
如何判断连接有问题也不容易啊。有时工作得好好的,突然干扰来了,就不响应了。这时候看设备管理器里的对应设备节点,仍然显示“设备正常运转”,应用程序根本得不到任何通知消息。
如果不能准确判断故障模式,后续的处理手段也就没有意义了。
insignal 发表于 2012-8-29 08:45 | 显示全部楼层
应用程序如果要判断设备是否还在工作,可以在应用程序和设备之间有一个 定期查询“心跳”的协议,不需要依赖于操作系统去判断。
根据应用需要,可以定期发一个查询包去看看设备是否有响应,没有响应说明设备有问题。
cool_coder 发表于 2012-8-29 10:04 | 显示全部楼层
关键是不止一种故障来源会导致“心跳”停止,而且没有“心跳”和没有其它的数据响应基本上是等价的。难的是如何“准确”判断故障源。如果对于成熟的商用芯片,用官方的驱动都不能正确报告错误,那么在应用层面又能做什么呢?或者我们自己开发电路和驱动,会比市场上的主流产品做得更好?是否每个项目都值得这么做?
insignal 发表于 2012-8-29 13:00 | 显示全部楼层
你的问题,我理解,应该是希望找到故障源,彻底解决故障,而不是通过pc端的应用软件来解决。
设备没有响应 我估计是设备端的问题

我建议你们用usb分析仪抓一下出故障时,usb总线上的数据
另外就是设备端最好有一个调试接口,比如在固件程序中加入往uart输出debug信息,这样也能加快找到bug
cool_coder 发表于 2012-8-29 15:48 | 显示全部楼层
非常感谢“insignal”提供的建议。是否可以再谈谈如何制造可控的条件,人为引发USB通讯故障?靠随机的干扰诱发故障,出现的几率太低了,几天也不见得能碰到一次。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

1601

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部