打印

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

[复制链接]
4124|21
手机看帖
扫描二维码
随时随地手机跟帖
沙发
icecut| | 2007-10-26 09:48 | 只看该作者

你遇到不可靠的状态吗?

使用特权

评论回复
板凳
mxh0506|  楼主 | 2007-10-29 17:25 | 只看该作者

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

使用特权

评论回复
地板
doob| | 2007-10-30 16:31 | 只看该作者

很不可靠啊!

使用特权

评论回复
5
mxh0506|  楼主 | 2007-10-30 16:42 | 只看该作者

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

否则很难在工业现场广泛使用

我现在还在找连接不可靠的原因

从现象上看,设备侧的内部状态都正常,只要拔/插一次USB电缆,强制其重新枚举就没事了.会不会是主机侧认为到设备的连接已经断掉了?

不知道加强上拉有没有用。

如果能从主机方以编程方式重新枚举的话就能证实这一点,在实际应用时也可以作为一种补救措施。正在找资料改PC机程序……

使用特权

评论回复
6
mxh0506|  楼主 | 2007-11-5 14:50 | 只看该作者

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

感兴趣的人不多啊
老外的网站上倒是有不少人在讨论

使用特权

评论回复
7
eastbest| | 2007-11-5 17:07 | 只看该作者

在device端做一个SOF检测

host 每一毫秒会发一个SOF,如果device在一段时间没有检测到SOF,则把D+的1k5 上拉电阻断开一会再接上,这样就相当于一次插拔动作了。

使用特权

评论回复
8
mxh0506|  楼主 | 2007-11-6 11:52 | 只看该作者

eastbest的建议不错,多谢!

看来是位高手,比我还早2年加入21IC
我一直在考虑如何从主机方解决,看来有点钻牛角尖了
这一想法来源于国外BBS上看到的一个贴子:
Some USB devices (like FTDI) have a special software call in their 
drivers, which mimics a plug/unplug action
不过实现起来有点难

以前也曾考虑过从设备方解决,不过也要主机方的程序配合.感觉主机上的程序如果无法感知USB拔出,不关闭驱动程序的话,即使重新插拔设备也不能顺利恢复连接

使用特权

评论回复
9
平常人| | 2007-11-6 12:44 | 只看该作者

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

如果你这时做插拔动作,主机如何进入休眠状态?

使用特权

评论回复
10
mxh0506|  楼主 | 2007-11-6 13:16 | 只看该作者

多谢平常人提醒

这确实是个问题

不过我想可以解决:
由于我的设备在工作状态下是不允许主机休眠的(数据采集系统,长时间休眠会引起缓冲区溢出丢数据)因此可以只在工作状态下检查SOF,一旦停止工作就不再检查SOF

我的主机程序是windows下的,USB设备被拔出可以用WM_DEVICECHANGE消息感知

这样不知会不会有问题

使用特权

评论回复
11
平常人| | 2007-11-6 15:51 | 只看该作者

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

主机通过这个端口不断地查询设备的状态,设备也会不断地收到主机的查询,任一方如果不能按时收到报告的状态或定时的查询,就要怀疑可能的连接故障了。

可以把这个专用的中断端口传送的状态信息称为“心跳”;心跳是不能停的,心跳停了肯定是哪里出问题了。

使用特权

评论回复
12
mxh0506|  楼主 | 2007-11-6 17:32 | 只看该作者

这个主意不错

我想是否可以把取数的命令兼用作"心跳"
这样可以减少一点开销

使用特权

评论回复
13
cool_coder| | 2012-8-27 17:24 | 只看该作者
3ms时间比较短,很容易产生误判吧?

使用特权

评论回复
14
insignal| | 2012-8-27 21:42 | 只看该作者
本帖最后由 insignal 于 2012-8-27 21:52 编辑

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

另外,usb应用在工业用途,usb的架构(必须是host+device)、电缆连接、传输都是很大的挑战。
各位如果在工业上有成功的案例,不妨和大家分享分享。

使用特权

评论回复
15
tchming| | 2012-8-28 08:31 | 只看该作者
插上之后没反应,确实够闹心的

使用特权

评论回复
16
cool_coder| | 2012-8-28 12:56 | 只看该作者
如何判断连接有问题也不容易啊。有时工作得好好的,突然干扰来了,就不响应了。这时候看设备管理器里的对应设备节点,仍然显示“设备正常运转”,应用程序根本得不到任何通知消息。
如果不能准确判断故障模式,后续的处理手段也就没有意义了。

使用特权

评论回复
17
insignal| | 2012-8-29 08:45 | 只看该作者
应用程序如果要判断设备是否还在工作,可以在应用程序和设备之间有一个 定期查询“心跳”的协议,不需要依赖于操作系统去判断。
根据应用需要,可以定期发一个查询包去看看设备是否有响应,没有响应说明设备有问题。

使用特权

评论回复
18
cool_coder| | 2012-8-29 10:04 | 只看该作者
关键是不止一种故障来源会导致“心跳”停止,而且没有“心跳”和没有其它的数据响应基本上是等价的。难的是如何“准确”判断故障源。如果对于成熟的商用芯片,用官方的驱动都不能正确报告错误,那么在应用层面又能做什么呢?或者我们自己开发电路和驱动,会比市场上的主流产品做得更好?是否每个项目都值得这么做?

使用特权

评论回复
19
insignal| | 2012-8-29 13:00 | 只看该作者
你的问题,我理解,应该是希望找到故障源,彻底解决故障,而不是通过pc端的应用软件来解决。
设备没有响应 我估计是设备端的问题

我建议你们用usb分析仪抓一下出故障时,usb总线上的数据
另外就是设备端最好有一个调试接口,比如在固件程序中加入往uart输出debug信息,这样也能加快找到bug

使用特权

评论回复
20
cool_coder| | 2012-8-29 15:48 | 只看该作者
非常感谢“insignal”提供的建议。是否可以再谈谈如何制造可控的条件,人为引发USB通讯故障?靠随机的干扰诱发故障,出现的几率太低了,几天也不见得能碰到一次。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

1601

帖子

2

粉丝