USB入门系列之全系列.docx
- 文档编号:3753611
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:11
- 大小:88.32KB
USB入门系列之全系列.docx
《USB入门系列之全系列.docx》由会员分享,可在线阅读,更多相关《USB入门系列之全系列.docx(11页珍藏版)》请在冰豆网上搜索。
USB入门系列之全系列
USB入门系列之一——USB概述(引用)
∙USB是什么呢?
一说USB是YouSB的意思,即“你傻B”的意思。
另一种说法是USB其实是美国的弟弟,因为美国叫USA,USB当然是他的弟弟了。
那么USB到底是什么呢?
其实USB是通用串行总线(UniversalSerialBus)的简写,它已经有了10多年的历史了。
USB协议出现过的版本有USB1.0,USB1.1,USB2.0。
由于USB是主从模式,设备与设备之间、主机与主机之间不能互连,为了解决这个问题,扩大USB的使用范围,就出现了USBOTG(OnTheGo)。
USBOTG的做法是,同一个设备,在不同的场合下可以在主机或从机之间切换。
在USB1.0和USB1.1版本中,只支持1.5Mbps的低速(LowSpeed)模式和12Mbps的全速(HighSpeed)模式。
在USB2.0中,又加入了480Mbps的高速模式。
值得注意的是,USB2.0并不是高速设备的代名词,详述请看《误区》一文。
USB具有很多优点,例如即插即用,容易使用,方便携带,传输速度快,可扩展性强,标准统一,价格便宜等等。
目前流行的USB设备有移动硬盘,数码相机,MP3,U盘,USB鼠标、键盘、游戏杆,USBMIDI键盘,USB摄相头,USB打印机,USB扫描仪,USB声卡,USB话筒,USB网卡,USB显示器,USB电话,具有USB口的各种仪表仪器等等,只要是能跟电脑打交道的,就基本上可以通过USB来实现,足见USB功能的强大。
然而USB也有一些缺点,例如传输距离短,开发、调试较困难等等。
当然,它还有一个更大的缺点,那就是你发现要找出它的缺点很件很令
人头疼的事情。
要开发USB,一个网站是开发者必须要知道的,那就是小组:
要开发USB,看书是少不了的。
推荐一本叫做《计算机USB系统原理及其主/从机设计》(马伟编著,北京航天航空大学出版社)的书,我觉得这本书写得很不错,而且也不贵,只要29.5¥,如果你去网站购书的话,还可以打7.5折,只需22¥。
至于协议,我还是推荐大家看英文原版的,这样理解起来更准确。
当然现在也有好多协议翻译的书,大家可以在网上搜索一下。
也有很多电子版的,这样可以节省一些钱。
我们的口号是:
“现在USB技术已经很流行了,就像以前的串口一样。
以前的电子工程师不会搞串口通信就落伍了,而现在的电子工程师如果不会搞USB通信,那就落伍了。
电子工程师门,还等什么,赶紧加入小组来学习USB吧……”,恩,这个口号有点长,将就一下吧。
USB入门系列之二——USB的连接模型(引用)
USB是一种主从结构。
主机叫做Host,从机叫做Device(也叫做设备),集线器也被当作一种特殊的设备处理。
USB的数据交换只能发生在主机和设备之间,主机和主机,设备和设备之间不能互连。
为了在物理上区分主机和设备,使用了不同的插头和插座,这个在USB的连接器一节中会讲到。
所有的数据传输都由主机主动发起,而设备只是被动的负责应答。
例如,在读数据时,USB先发出读命令,设备收到该命令后,才返回数据。
在USBOTG中,一个设备可以在从机和主机之间切换,这样就可以实现设备与设备之间的连接,大大增加了USB的使用范围。
但这时依然没有脱离这种主从关系,两个设备之间必然有一个作为主机,另一个作为从机。
USBOTG增加了一种MINIUSB接头,比普通的4线USB多了一个ID表识线,用来表明它是主机还是设备,这个以后会讲到。
USB的拓扑结构为金字塔型。
由一个USB主控制器出发,下面接USB集线器,USB集线器将一个USB口扩展为多个USB口,多个USB口又可以通过集线器为更多个接口。
但USB协议中对集线器的层数是有限制的,USB1.1规定最多为4层,USB2.0规定最多为6层。
理论上,一个USB主控制器最多可接127个设备,这是由数据包中的7位地址位决定的,但是实际上不会接这么多的设备。
我们所说的一个USB主控制器可以连接多个USB设备,并不是直接简单的将多个设备并联或者串联,而是要由集线器负责端口扩展,才能连接更多的设备。
在我们的电脑上,也有一个(或者多个,视USB主控制器的个数而定)集线器,它叫做根集线器,直接连在USB主控制器上。
在设备管理器中,我们可以看到USB主控制器和根集线器。
如下图所示。
USB数据传输路径如下:
USB主控制器发出数据包,通过根集线器,再通过下面的集线器(如果有的话),再发给USB设备;设备返回数据,交给它上层的集线器,上层的集线器再交给更上层的集线器,直到USB主控制器为止。
而USB主控制器就可以跟CPU打交道了。
在标准的PC机上,USB主控制器是挂在PCI总线上的。
在Windows中,USB由各种驱动程序负责管理,最后由驱动程序产生功能设备(FDO),这就是我们所看到的实际设备了。
我们的应用程序就可以通过Windows提供的各种API进行访问USB设备了,例如CreateFile,ReadFile,DeviceIOControl等等。
USB入门系列之三——USB的电气特性(引用)
标准的USB使用4根线:
5V电源线(Vbus),差分数据线负(D-),差分数据线正(D+),地(Gnd)。
在USBOTG中,又增加了一种mini接口,使用的是5根线,比标准的USB多了一根身份识别(ID)线。
USB使用的是差分传输模式,有两根数据线,分别是D+和D-。
在USB的低速和全速模式中,采用的是电压传输模式。
而在高速模式下,则是电流传输模式。
关于具体的高低电平门限值,请参看USB协议。
为了防止出现长时间的0或者1(这样不利于时钟信号的提取),在发送数据前要经过位填充处理。
然后再将数据串行化,发送到数据线上,由两根数据线的差分值来表示0或者1。
而在接收端,则刚好是相反的过程。
接收端采样数据线,将数据并行化,并同时去掉未填充,然后解析数据。
通常,我们使用现成的USB芯片,像位填充,串行化这些芯片内部的硬件已经帮我们做好了,因此通常我们并不用关心这些细节。
在设备接收数据时,芯片的串行接口引擎(SIE)会接收属于自己地址的数据,并根据相应的端口号,放到相应的缓冲区内,并返回ACK给主机进行确认,然后产生中断请求,通知我们的程序,已经收到数据包了。
在我们还未处理完缓冲区的数据之前,如果再收到对该端点的输出请求,USB芯片将会使用NAK返回,告诉主机端点现在忙,主机检测到NAK后,过段时间会重试输出数据,直到超时为止;发送数据时,用户将数据写入USB芯片的缓冲区,并通知USB芯片缓冲区内数据可用,然后USB芯片检测到主机请求对应的端点输入时,它就会将数据返回,数据发送完毕并收到主机的ACK确认之后,产生中断请求通知应用程序数据已经发送完毕。
如果USB芯片已经收到了输入请求,但是用户程序还未填充好缓冲区,它也会用NAK返回,告诉主机数据还未准备好。
主机收到NAK后,过段时间会重试,直到超时为止。
在USB协议中规定,设备在未配置之前,可以从Vbus上最多获取100mA的电流;在配置之后,最多可从Vbus上获取500mA的电流。
Vbus是5V的电压,具体的参数请参看USB协议。
USB入门系列之四——USB的线缆以及插头、插座(引用)
∙USB是一个标准的协议,因此对线缆、插头、插座等有严格的规范要求。
在最初的标准里,USB接头有4条线:
电源,D-,D+,地线。
我们暂且把这样的
叫做标准的USB接头吧。
后来OTG出现了,又增加了miniUSB接头。
而miniUSB接头
则有5条线,多了一条ID线,用来标识身份用的。
标准USB口只有A型和B型。
其中每一型又分为插头和插座,例如A型插头,A型插座等。
我们平常电脑上用的那种插座叫做A型USB插座,而相应的插头,叫做A型插头,例如U盘上那种。
而像打印机上面那个插座,则是B型插座(比较四方的,没电脑上面那种扁),相应的插头,就是B型插头。
也许你见过一头方一头扁的USB延长线,没错了,扁的那头就叫做A型插头,而方的那头,就叫做B型插头,而相应的被插的那两个插座,就分别是A型插座和B型插座了。
A型插头是插不进B型插座的,反之亦然。
miniUSB也分为A型,B型,但增加了一个AB型(不是血型呀,别搞错了,没有O型^_^)。
既然它叫做miniUSB,那么当然它就是很小的了,主要是给便携式设备用的,例如MP3、手机、数码相机等。
USB是一主多从结构,即一个时刻只能有一
台主机。
像PC机就是一个主机,其它的只能是设备,因而两个设备之间是无法直接进行通信的。
而USBOTG(onthego)的出现,则解决了这个矛盾:
一个设备可以在某种场合下,改变身份,以主机的形式出现。
因而就出现了AB型的miniUSB插座,不管是A型miniUSB插头,还是B型miniUSB插头,都可以插进去,而靠里面多出的那条ID线来识别它的身份:
是主机还是从机。
这样两个USB设备就可以直接连接起来,进行数据传送了。
像我们MP3上用的那中miniUSB插座,就是B型的miniUSB插座(注意,有一类miniUSB插座,似乎不是USB规范里面的,因为miniUSB接头应该有5条线,而这种插座只有4条线)。
由于USB是支持热插拔的,因此它在接头的设计上也有相应的措施。
USB插头的地引脚
和电源引脚比较长,而两个数据引脚则比较短,这样在插入到插座中时,首先接通电源和地,然后再接通两个数据线。
这样就可以保证电源在数据线之前接通,防止闩锁发生。
至于USB电缆,通常我们不怎么关心,买现成的就行了,除非你是生产USB线
缆的。
在全速模式下需要使用带屏蔽的双绞电缆线,而低速模式模式则可以不使
用屏蔽和双绞。
此外,USB协议规定,USB低速电缆长度不得超过3米,而全速电缆
长度不得超过5米。
这是因为线缆传输有延迟,要保证能够正确响应,就不能延迟
太多。
USB标准规定了里面信号线的颜色,其中Vbus为红色,D-为白色,D+为绿色
,GND为黑色。
然而,我见过很多USB线缆并没有遵循标准,所以大家在使用时要
小心,用表测量一下比较可靠。
更详细的数据,例如封装尺寸等,请参看USB协议。
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小组专区:
USB入门系列之六——USB设备的枚举过程(引用)
∙USB主机在检测到USB设备插入后,就要对设备进行枚举了。
为什么要枚举呢?
枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。
调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。
在说枚举之前,先大概说说USB的一种传输模式——控制传输。
这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。
控制传输分为三个阶段:
①建立阶段。
②数据阶段。
③确认阶段。
建立(setup)阶段都是由USB主机发起,它是一个setup数据包,里面包含一些数据请求的命令以及一些数据。
如果建立阶段是输入请求,那么数据阶段就要输入数据;如果建立阶段是输出请求,那么数据阶段就要输出数据。
如果在数据阶段,即便不需要传送数据,也要发一个0长度的数据包。
数据阶段过后就是确认阶段。
确认阶段刚好跟数据阶段相反,如果是输入请求,则它是一个输出数据包;如果是输出请求,则它是一个输入数据包。
确认阶段用来确认数据的正确传输。
好了,下面我们来看看枚举的详细过程。
首先,USB主机检测到USB设备插入后,就会先对设备复位。
设备复位后,USB主机就会对地址为0的设备发送获取设备描述符的标准请求。
所有的USB设备在总线复位后其地址都为0,这样主机就可以跟那些刚刚插入的设备通过地址0通信。
主机在建立阶段发出获取设备描述符的输入请求,设备收到该请求后,在数据阶段将设备描述符返回给主机。
主机在成功获取到一个数据包的设备描述符后并且确认没有什么错误后(注意:
有些USB设备的端点0大小不足18字节(但至少具有8字节),而标准的设备描述有18字节,在这种情况下,USB设备只能暂时按最大包将部分设备描述符返回,而主机在成功获取到前面一部分描述符后,就不会再请求剩下的设备描述符部分,而是进入设置地址阶段),就会返回一个0长度的确认数据包给设备。
然后主机再对设备复位一下,接下来就会进入到设置地址阶段。
这时USB主机发出一个设置地址的请求,并在后面跟着一个0长度的数据输出包。
地址包含在建立包中,具体的地址USB主机会负责管理,它会分配一个唯一的地址给新的设备。
USB设备在收到地址后,返回0长度的应答包,设备在收到这个0长度应答包的ACK之后,就可以起用新的地址了。
这样设备就分配到了一个唯一的设备地址,以后主机就通过它来进行访问该设备。
然后主机再次获取设备描述符,这次跟第一次可能有点不一样,这次需要获取完全部的18个字节的设备描述符。
当然,如果你的端点0缓冲大于18字节的话,那就跟第一次的情形一样了。
接下来,主机就会获取配置描述符。
配置描述符总共为9字节。
主机在获取到配置描述符后,根据里面的配置集合总长度,再获取配置集合。
配置集合包括配置描述符,接口描述符,端点描符等等。
如果有字符串描述符的话,还要获取字符串描述符。
另外HID设备还有HID描述符等。
使用BUSHOUND以及通过串口返回信息,很容易看到具体的过程。
总之是主机请求什么,你的程序就响应什么。
下面这些数据是使用BUSHOUND抓的,这个是在WIN2000下抓到的,如果在WINXP下,就看不到设置地址之前的数据。
写了注释下面的部分就是主机和设备之间的数据通信,而其它的则是主机跟根集线器之间的通信数据。
Device Phase Data Description Cmd.Phase.Ofs(rep) Delta
------ ----- -------------------------------------------------- ---------------- ------------------ -----
14.1 DI 02 . 1.1.0 3.4sc
14.0 CTL a3000000 01000400 GETSTATUS 2.1.0
(2) 17us
14.0 DI 01010100 .... 2.2.0 27us
14.0 CTL 23011000 01000000 CLEARFEATURE 4.1.0 110us
14.0 CTL a3000000 01000400 GETSTATUS 5.1.0
(2) 56us
14.0 DI 01010000 .... 5.2.0 14us
14.0 CTL 23030400 01000000 SETFEATURE 7.1.0 109ms
14.1 DI 02 . 8.1.0 90ms
14.0 CTL a3000000 01000400 GETSTATUS 9.1.0 23us
14.0 DI 03011000 .... 9.2.0 22us
14.0 CTL 23011400 01000000 CLEARFEATURE 10.1.0 8us
14.0 CTL a3000000 01000400 GETSTATUS 11.1.0 19ms
14.0 DI 03010000 .... 11.2.0 34us
/////////////第一次获取设备描述符请求//////////////////////
14.0 CTL 80060001 00004000 GETDESCRIPTOR 12.1.0 239us
/////////////第一次返回设备描述符//////////////////////////
/////////////由于该端点缓冲只有16字节,因此只读到16字节///////////
14.0 DI 12011001 00000010 65103621 01000000 ........e.6!
.... 12.2.0 67ms
14.0 CTL a3000000 01000400 GETSTATUS 13.1.0 49us
14.0 DI 03010000 .... 13.2.0 27us
14.0 CTL 23030400 01000000 SETFEATURE 14.1.0 24us
14.1 DI 02 . 15.1.0 112ms
14.0 CTL a3000000 01000400 GETSTATUS 16.1.0 21us
14.0 DI 03011000 .... 16.2.0 25us
14.0 CTL 23011400 01000000 CLEARFEATURE 17.1.0 8us
////////////////设置地址,地址为2/////////////////////////////////
14.0 CTL 00050200 00000000 SETADDRESS 18.1.0 19ms
///////////第二次获取设备描述符请求//////////////////////////////
14.0 CTL 80060001 00001200 GETDESCRIPTOR 19.1.0 40ms
////////////第二次返回了全部的18字节设备描述符//////////////////
14.0 DI 12011001 00000010 65103621 01000000 ........e.6!
.... 19.2.0 75ms
0201 .. 19.2.16
//////////
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- USB 入门 系列
![提示](https://static.bdocx.com/images/bang_tan.gif)