打印

请教关于USB挂起问题

[复制链接]
11209|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tom_2_2|  楼主 | 2011-1-18 14:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
dqyubsh| | 2011-1-18 23:01 | 只看该作者
不知道你是如何判断没有进入挂起中断的,我的理解是,挂起时,进入低功耗状态,此时振荡器停止了,估计什么都测不到了。

使用特权

评论回复
板凳
tom_2_2|  楼主 | 2011-1-22 13:33 | 只看该作者
现在搞清了,没有操作的时候,USB总线上任然有1ms一个的SOF包,所以USB设备是不会挂起的!只有让主机停止发送SOF包,同时不操作,就有可能挂起!
  不知到主机上应该调用什么函数可以实现,cypress的USB开发包中的USBDevice->Suspend();这个函数不行,总线上还是有SOF包在发送,设备没有真正挂起!
  所谓的挂起真不知到该怎么做?(对了我用的cy7c68013a芯片 cyapi软件开发包!)

使用特权

评论回复
地板
dqyubsh| | 2011-1-22 14:16 | 只看该作者
判断一下USBDevice->Suspend()返回值,返回真正确,返回假失败。

手册上说,挂起有两种方法:一种是主机控制挂起(如你所说,3ms无USB活动,设备将产生SUSPEND中断),一种是设备自行挂起(向SUSPEND寄存器写任意值)。

FW.C里对这部分有处理,仔细看一下可加深了解。

不知道你刻意追求挂起的目的何在。一般缺省框架就够用了,不用特意理会挂起,如果希望更省电,有68014芯片,功耗更低。

使用特权

评论回复
5
tom_2_2|  楼主 | 2011-1-22 14:46 | 只看该作者
呵呵..。不是刚开始学嘛,开始感觉这个比较好弄,所以作为一个切入点。如果可以自由控制进入和退出挂起状态的话也有一定的实用价值!后来才发现每这么简单。
  你说的上面说的2方法我试过了,都没效果!USBDevice->Suspend()放回为TRUE的,上位机操作时,下位机没有任何响应的,从上位机表面上看是挂了!其实USB总线上依然有SOF包,设备也没有挂起,8051在运行!
  不过现在这个问题我用了一个不是办法的办法,接是上位机发一个控制命令,然后让8051直接把自己给挂了!呵呵....
  我感觉这样做不是好的办法所以,再向坛里的高手请教请教。希望这个问题能得到正解!

使用特权

评论回复
6
dqyubsh| | 2011-1-23 20:54 | 只看该作者
我试了一下,发送Suspend()之后硬件不再响应主机命令,但没有用示波器观察USB线上的包(麻烦);再发Resume()之后,设备才响应主机命令。

我想知道你咋测量的SOF,是不是看错了。

再有,你确认一下设备用哪个驱动程序,是CYUSB.SYS还是EZUSB.SYS,应该用CYUSB.SYS(或者Suite USB 3.4中的CYUSB.SYS),EZUSB.SYS的电源管理不完善,也许会出问题。

使用特权

评论回复
7
tom_2_2|  楼主 | 2011-1-24 10:02 | 只看该作者
关于测量就用示波器直接量USB总线D+或D-,可以看到1ms一间隔的波形(在上位机不发送USB命令时),这个我想就是SOF包吧!
  你说我用的驱动是CYUSB.SYS还是EZUSB.SYS,我还真不知道,请问从哪里看的?如果不是CYUSB.SYS要怎么该呢?

使用特权

评论回复
8
tom_2_2|  楼主 | 2011-1-24 10:13 | 只看该作者
6楼:  
我试了一下,发送Suspend()之后硬件不再响应主机命令,但没有用示波器观察USB线上的包(麻烦);再发Resume()之后,设备才响应主机命令。


我使用Suspend()函数之后的现象,是跟你一样的,也要再发Resume()之后,设备才响应主机命令。
所以说从上位机角度看,USB设备没响应,像是挂起一样,示波器实际一测量,USB总线上还是有SOF包的

其实你还可以做一个试验,验证一下!不是说挂起后,8051会进入节电模式,晶振什么都停止了嘛!所以8051是不运行的,但是我通过在单片机程序主循环里,加入了串口发送代码,让他不停的给(最好速度控制一下!)PC机发信息,来看8051有没有停止运行!我的结果是,上位机调用Suspend()函数后串口调试助手不断接收到51的数据!并没挂起!
  这个办法你可以试一试,不用示波器也行!

使用特权

评论回复
9
dqyubsh| | 2011-1-24 14:33 | 只看该作者
设备管理器——选中设备——右键点属性——驱动程序——查看“驱动程序文件”。

我用示波器看了一下,正常情况下,线上有大约125us的脉冲(USB是活动的,不能确定是什么脉冲。你说是SOF,手册第几章多少页写的?)。发送挂机之后,线上脉冲停止了。唤醒后该脉冲又出现。这个活动脉冲的频率远低于正常通讯的脉冲频率。

在挂起唤醒过程中,D+有跳变,我估计这个是手册上的“J”状态——唤醒命令。总体说,我的板子与手册无差别。

至于你试图用串口发送数据,这个本身就没有实际意义,哪有设备挂起之后还发数据的需求!可以测量一下CLKOUT管脚有无输出,或者直接量晶振,或者测量整个板子的电流,看是不是有功耗的降低。这些都应该是挂起进入低功耗的表现。

使用特权

评论回复
10
tom_2_2|  楼主 | 2011-1-24 16:24 | 只看该作者
我这里的串口是用来打印调试信息的!你想当8051挂起后挂起后,串口还会工作吗,显然不会!所以我可以通过看监控串口调试助手有无数据接收就可以直接判断8051有没有挂起啊!要是哪位同仁手头没有示波器,万用表,这办法很好啊!

使用特权

评论回复
11
tom_2_2|  楼主 | 2011-1-24 16:29 | 只看该作者
我这里的串口是用来打印调试信息的!你想当8051挂起后挂起后,串口还会工作吗,显然不会!所以我可以通过看监控串口调试助手有无数据接收就可以直接判断8051有没有挂起啊!要是哪位同仁手头没有示波器,万用表,这办法很好啊!

使用特权

评论回复
12
tom_2_2|  楼主 | 2011-1-24 16:30 | 只看该作者
file:///G:/SOF包.JPG

SOF包.JPG (171.38 KB )

SOF包.JPG

使用特权

评论回复
13
dqyubsh| | 2011-1-24 17:14 | 只看该作者
哈哈,你说的对,是SOF。查了一下手册,高速连接时,主机每125uS的间隔向设备发出SOF令牌包,以表示帧/微帧的开始。我不敢判定是什么包的原因在于,我的示波器100M,粗略地看了一下,只能看见一个脉冲,看不见内部的所有位。:'(
怪不得能做USB协议的示波器要求600M以上呢,哎。

使用特权

评论回复
14
darthing| | 2011-2-18 21:06 | 只看该作者
你研究过USBDevice->Suspend()挂起的问题?我现在也发愁这件事呢,c++的api库文件里没有cyfx2device这个类函数,C#的cyusb.dll里却有,console是用c#写的,点击hold就可以hold住,C++没提过这个函数,你这个问题解决了么?

使用特权

评论回复
15
yinyankang| | 2014-3-26 09:51 | 只看该作者
本帖最后由 yinyankang 于 2014-3-26 09:53 编辑

对于USB设备的挂起概念一直不清晰:
不了解是如何进入这种状态的,又是如何进入工作模式

使用特权

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

本版积分规则

40

主题

319

帖子

1

粉丝