原创 [原创] USB入门系列之五 —— USB设备的插入检测机制

2007-9-2 23:30 6665 5 12 分类: 通信
 USB入门系列之五 —— USB设备的插入检测机制

    USB主机是如何检测到设备的插入的呢?首先,在USB集线器的每个下游端口的D+和D-上,


分别接了一个15K欧姆的下拉电阻到地。这样,在集线器的端口悬空时,就被这两个下拉电阻


拉到了低电平。而在USB设备端,在D+或者D-上接了1.5K欧姆上拉电阻。对于全速和高速设备,


上拉电阻是接在D+上;而低速设备则是上拉电阻接在D-上。这样,当设备插入到集线器时,


由1.5K的上拉电阻和15K的下拉电阻分压,结果就将差分数据线中的一条拉高了。集线器检测


到这个状态后,它就报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器),


这样就检测到设备的插入了。USB高速设备先是被识别为全速设备,然后通过HOST和DEVICE


两者之间的确认,再切换到高速模式的。在高速模式下,是电流传输模式,这时将D+上的


上拉电阻断开。
    一个简单的实验:只用一个上拉电阻接在USB的+5V和D+或者D-上,WINDOWS也会提示


发现新硬件,但是无法找到驱动程序。这时去设备管理器里面看,有显示未知USB设备,


并且其VID和PID为0。根据这个,我们可以简单的判断设备是否枚举成功。如下图所示,


分别是枚举不成功和枚举成功的图。


点击看大图


(来自USB小组专区:http://group.ednchina.com/93/
                       By computer00 @ 2007-09-03)

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

用户271389 2013-4-26 17:07

第二段的敏感列表不全啊,要把if里面的信号也加到列表里面!

用户1039678 2008-4-9 13:57

路过! 又懂了点!

用户106442 2008-1-9 18:52

學到,頂一個

用户134652 2008-1-4 17:04

builder 说的我也遇上了,使用3段式也是因为HDL的D是description 不是design的缘故,在IEEE 1364上没有说一定要用3段式,但是,写成1段式就不行,除非你骗过编译器(不是综合器),让它认为你写的不是状态机。(比如在Quartus II中把状态机的reg,直接assign到一个output上,大家可以试试哟)。

用户91078 2007-10-30 14:14

er,似乎那个简单的实验:那个上拉电阻接到5V去不是很好吧?

一般那个1.5k的都是接3.3V的。

ash_riple_768180695 2007-10-24 11:39

嘿嘿,我见过一种机器生成的代码,采用现态逻辑驱动同步输出,还能避免输出慢一拍的问题,过些天给大家传上来。不过这种方法适合机器生成,手工编写难度大,而且需要较复杂的思路。

另外,上面说的独立实现计数器的方法确实很好。代码清晰得多,也利于调试。

用户1019055 2007-10-23 18:47

以前看了不少关于如何写VDHL状态机的文章,都是提倡使用二段式或三段式的写法,都建议避免使用一段式的写法,但看了之后,都没什么体会。象我们写软件出身的,心理上总喜欢一段式的写法,觉得思路比较连贯,而且可以写在一个process里,“内聚性”比较高。软件工程师是最讨厌多个函数共用全局变量的了。
        但对于硬件开发,就不一样了。因为VHDL还是无法完全屏蔽掉硬件的物理特性,不好的布局,会使得写的逻辑错误执行。最近写的一个状态机,就遇到了这个麻烦。因为喜好的缘故,加上状态机里面有计数器,用组合逻辑写比较麻烦,于是我用了一段式的写法。结果实际运行的时候,发现状态机经常无故锁死,用逻辑分析仪看,发现陷入了非法的状态,而且when others语句也无法使状态机回到IDLE状态。开始怀疑逻辑上有错误,折腾几天后,把状态切换部分独立出来放在一个同步process里,问题解决了。虽然偶尔还会发现落入非法状态,但状态机会自动恢复到初始状态,不会锁死了,而程序逻辑没有做如何修改。看来以后还是得规规矩矩用二段或三段式的写法了。为了便于记忆,把二段、三段式的特点终结成几句话:
        二段式:状态切换用时序逻辑,次态输出和信号输出用组合逻辑。
        三段式:状态切换用时序逻辑,次态输出用组合逻辑,信号输出用时序逻辑。信号输出的process中,case语句用next state做条件,可以解决比组合逻辑输出慢一拍的问题。
有时候判断次态需要用到计数器怎么办呢(计数器是时序电路,用组合逻辑是实现不了的)?方法是独立实现一个计数器,而在组合逻辑里用使能信号(或清除、置位等)来控制它。

用户65769 2007-10-23 18:46

case语句用next state做条件,可以解决比组合逻辑输出慢一拍的问题

ash_riple_768180695 2007-10-21 16:40

第二个进程的敏感向量列表也不全,仿真时会有一些异常现象,比如该跳转时不跳转的问题。三段式的整体结构是对的,一些细节没处理好。

ash_riple_768180695 2007-10-21 16:38

第三个进程的case(next_state)有问题,next_state本身是组合逻辑,再用来驱动输出,即使输出最后采用了寄存器,关键路径仍然没有被切断。输出应该由current_state驱动为好,current_state是时序逻辑。

相关推荐阅读
computer00 2013-06-05 16:27
[招聘]Android系统开发工程师
任职要求: 1. 扎实的C/C++基础,熟悉嵌入式Linux和Android操作系统的软件开发; 2. 良好的沟通能力和逻辑思维能力; 3. 良好的英文文献阅读能力; 4. 具备...
computer00 2013-06-04 09:26
[招聘]Android应用开发工程师
任职要求: 1. 具备扎实的面向对象编程思想和JAVA编程基础; 2. 熟悉Eclipse+ADT开发环境,熟练掌握Android基本类库; 3. 熟悉网络应用和多媒体应用开发; ...
computer00 2012-09-26 13:15
圈圈的新浪官方围脖
http://weibo.com/computer00  ...
computer00 2012-09-26 13:12
欢迎大家去收听圈圈弹的曲子
http://www.tudou.com/home/_105209016  ...
computer00 2009-06-29 15:07
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)下载地址1:下载地址2: 勘误.pdf...
computer00 2009-06-25 11:23
一块磐正845GE主板PS2接口的修复
圈圈有一部台式机,某天开机时,发现键盘用不了了,停留在输入BIOS密码那里。主机自检通过,但是蜂鸣器却发出很微弱的、连续的声音,同时键盘的三个LED也没有出现象往常一样的闪烁一下。圈圈以为多日未用,积...
EE直播间
更多
我要评论
7
5
关闭 站长推荐上一条 /1 下一条