USB入门系列之六 —— USB设备的枚举过程

发布者:转眼人老最新更新时间:2016-04-18 来源: eefocus关键字:USB  枚举过程 手机看文章 扫描二维码
随时随地手机看文章
USB主机在检测到USB设备插入后,就要对设备进行枚举了。为什么要枚举呢?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。
    在说枚举之前,先大概说一下USB的一种传输模式——控制传输。这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输。控制传输分为三个过程:①建立过程。②可选的数据过程。③状态过程。建立(Setup)过程都是由USB主机发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。如果是控制输入传输,那么数据过程就是输入数据;如果是控制输出传输,那么数据过程是输出数据。如果在设置过程中,指定了数据长度为0,则没有数据过程。数据过程之后是状态过程。状态过程刚好与数据过程的数据传输方向相反:如果是控制输入传输,则状态过程是一个输出数据包;如果是控制输出传输,则状态过程是一个输入数据包。状态阶段用来确认所有的数据都已经正确传输。
    好了,下面我们来看看枚举的详细过程。
    首先,USB主机检测到USB设备插入后,就会先对设备复位。设备复位后,USB主机就会对地址为0的设备发送获取设备描述符的标准请求。所有的USB设备在总线复位后其地址都为0,这样主机就可以跟那些刚刚插入的设备通过地址0通信。主机在建立阶段发出获取设备描述符的输入请求,设备收到该请求后,在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述符后并且确认没有什么错误后(注意:有些USB设备的端点0大小不足18字节(但至少具有8字节),而标准的设备描述有18字节,在这种情况下,USB设备只能暂时按最大包将部分设备描述符返回,而主机在成功获取到前面一部分描述符后,就不会再请求剩下的设备描述符部分,而是进入设置地址阶段),就会返回一个0长度的状态数据包给设备。
    然后主机再对设备复位一下,接下来就会进入到设置地址阶段。这时USB主机发出一个设置地址的请求(建立过程,设置地址无数据过程),地址包含在建立包中,具体的地址USB主机会负责管理,它会分配一个唯一的地址给新的设备。USB设备在收到地址后,返回0长度的状态包,主机收到0长度的状态包之后,会返回一个ACK给设备。设备在收到这个ACK之后,就可以启用新的地址了。这样设备就分配到了一个唯一的设备地址,以后主机就通过它来进行访问该设备。
    然后主机再次获取设备描述符,这次跟第一次可能有点不一样,这次需要获取完全部的18个字节的设备描述符。当然,如果你的端点0缓冲大于18字节的话,那就跟第一次的情形一样了。
    接下来,主机就会获取配置描述符。配置描述符总共为9字节。主机在获取到配置描述符后,根据里面的配置集合总长度,再获取配置集合。配置集合包括配置描述符,接口描述符,端点描符等等。
    如果有字符串描述符的话,还要获取字符串描述符。另外HID设备还有HID描述符等。使用BUS HOUND以及通过串口返回信息,很容易看到具体的过程。总之是主机请求什么,你的程序就响应什么。

下面这些数据是使用BUS HOUND抓的,这个是在WIN2000下抓到的,如果在WINXP下,就看不到设置地址之前的数据。
写了注释下面的部分就是主机和设备之间的数据通信,而其它的则是主机跟根集线器之间的通信数据。

Device  Phase  Data                                                Description       Cmd.Phase.Ofs(rep)  Delta
------  -----  --------------------------------------------------  ----------------  ------------------  -----
  14.1  DI     02                                                  .                        1.1.0        3.4sc  
  14.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               2.1.0(2)      17us  
  14.0  DI     01 01 01 00                                         ....                     2.2.0         27us  
  14.0  CTL    23 01 10 00  01 00 00 00                            CLEAR FEATURE            4.1.0        110us  
  14.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               5.1.0(2)      56us  
  14.0  DI     01 01 00 00                                         ....                     5.2.0         14us  
  14.0  CTL    23 03 04 00  01 00 00 00                            SET FEATURE              7.1.0        109ms  
  14.1  DI     02                                                  .                        8.1.0         90ms  
  14.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS               9.1.0         23us  
  14.0  DI     03 01 10 00                                         ....                     9.2.0         22us  
  14.0  CTL    23 01 14 00  01 00 00 00                            CLEAR FEATURE           10.1.0          8us  
  14.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS              11.1.0         19ms  
  14.0  DI     03 01 00 00                                         ....                    11.2.0         34us
/////////////第一次获取设备描述符请求//////////////////////  
  14.0  CTL    80 06 00 01  00 00 40 00                            GET DESCRIPTOR          12.1.0        239us  
/////////////第一次返回设备描述符//////////////////////////
/////////////由于该端点缓冲只有16字节,因此只读到16字节///////////
  14.0  DI     12 01 10 01  00 00 00 10  65 10 36 21  01 00 00 00  ........e.6!....        12.2.0         67ms  
  14.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS              13.1.0         49us  
  14.0  DI     03 01 00 00                                         ....                    13.2.0         27us  
  14.0  CTL    23 03 04 00  01 00 00 00                            SET FEATURE             14.1.0         24us  
  14.1  DI     02                                                  .                       15.1.0        112ms  
  14.0  CTL    a3 00 00 00  01 00 04 00                            GET STATUS              16.1.0         21us  
  14.0  DI     03 01 10 00                                         ....                    16.2.0         25us  
  14.0  CTL    23 01 14 00  01 00 00 00                            CLEAR FEATURE           17.1.0          8us 
////////////////设置地址,地址为2///////////////////////////////// 
  14.0  CTL    00 05 02 00  00 00 00 00                            SET ADDRESS             18.1.0         19ms
///////////第二次获取设备描述符请求//////////////////////////////  
  14.0  CTL    80 06 00 01  00 00 12 00                            GET DESCRIPTOR          19.1.0         40ms 
////////////第二次返回了全部的18字节设备描述符////////////////// 
  14.0  DI     12 01 10 01  00 00 00 10  65 10 36 21  01 00 00 00  ........e.6!....        19.2.0         75ms  
               02 01                                               ..                      19.2.16 
////////////获取9字节的配置描述符/////////////////////////////             
  14.0  CTL    80 06 00 02  00 00 09 00                            GET DESCRIPTOR          20.1.0         44us  
////////////返回9字节的配置描述符/////////////////////////////
////////////可以看到配置描述符集合长度为0x20(即32)字节//////
  14.0  DI     09 02 20 00  01 01 00 80  dd                        .. ......               20.2.0         50ms  
  14.0  CTL    a3 00 00 00  02 00 04 00                            GET STATUS              21.1.0        214ms  
  14.0  DI     00 01 00 00                                         ....                    21.2.0         34us
//////////再一次获取设备描述符//////////////////////////////
  17.0  CTL    80 06 00 01  00 00 12 00                            GET DESCRIPTOR          22.1.0        3.8ms  
/////////返回设备描述符////////////////////////////////
  17.0  DI     12 01 10 01  00 00 00 10  65 10 36 21  01 00 00 00  ........e.6!....        22.2.0         67ms  
               02 01                                               ..                      22.2.16
//////////获取配置描述符///////////////////////              
  17.0  CTL    80 06 00 02  00 00 09 00                            GET DESCRIPTOR          23.1.0         28us  
///////////返回配置描述符///////////////////////
  17.0  DI     09 02 20 00  01 01 00 80  dd                        .. ......               23.2.0         50ms  
/////////获取0x20字节的配置描述符集合,包括配置描述符,接口描述符,端点描述符等/////////
  17.0  CTL    80 06 00 02  00 00 20 00                            GET DESCRIPTOR          24.1.0         30us
/////////返回了0x20字节的配置描述符集合/////////////  
  17.0  DI     09 02 20 00  01 01 00 80  dd 09 04 00  00 02 08 06  .. .............        24.2.0         83ms  
               50 00 07 05  82 02 40 00  00 07 05 02  02 40 00 00  P.....@......@..        24.2.16 
////////获取字符串描述符的语言ID///////////////            
  17.0  CTL    80 06 00 03  00 00 02 00                            GET DESCRIPTOR          25.1.0         29us 
///////设备返回语言ID,第一字节表示语言ID的长度/////////////// 
  17.0  DI     04 03                                               ..                      25.2.0         45ms  
////////根据长度获取4字节的字符串描述符的语言ID///////////////
  17.0  CTL    80 06 00 03  00 00 04 00                            GET DESCRIPTOR          26.1.0         17ms 
////////设备返回完整的语言ID//////////////// 
  17.0  DI     04 03 09 04                                         ....                    26.2.0         53ms  
/////////获取索引为2的字符串描述符///////////
  17.0  CTL    80 06 02 03  09 04 02 00                            GET DESCRIPTOR          27.1.0         27us  
//////////设备返回字符串描述符,第一字节为该字符串描述符的长度//////////
  17.0  DI     12 03                                               ..                      27.2.0         46ms  
/////////根据长度获取索引为2的字符串描述符///////////
  17.0  CTL    80 06 02 03  09 04 12 00                            GET DESCRIPTOR          28.1.0         23us  
/////////设备返回完整的0x12字节字符串描述符/////////
  17.0  DI     12 03 32 00  30 00 37 00  31 00 30 00  39 00 38 00  ..2.0.7.1.0.9.8.        28.2.0         70ms  
               32 00                                               2.                      28.2.16 
////////////////设置配置///////////////////////////////             
  17.0  CTL    00 09 01 00  00 00 00 00                            SET CONFIG              29.1.0         28us
////////////////设置接口////////////////////////////////  
  17.0  CTL    01 0b 00 00  00 00 00 00                            SET INTERFACE           30.1.0         22ms
//////////////获取最大逻辑单元/////////////////////////  
  17.0  CTL    a1 fe 00 00  00 00 01 00                            GET MAX LUN             31.1.0        158us  
  17.0  DI     00                                                  .                       31.2.0         53ms
///////////////USB大容量存储设备的命令块封包(CBW)////////  
  17.2  DO     55 53 42 43  c8 58 25 81  24 00 00 00  80 00 06 12  USBC.X%.$.......        32.1.0        3.0ms  
               00 00 00 24  00 00 00 00  00 00 00 00  00 00 00     ...$...........         32.1.16             


以下是我在做USB键盘时,通过串口发回的调试信息,从这也可以看到枚举的过程。

系统启动................................
断开USB连接........................
USBD12芯片初始化
   设置地址.....................
       地址为:  0
连接USB...............
USB总线复位................................
USB总线挂起................................
USB总线复位................................
USB总线挂起................................
USB总线复位................................
USB标准请求................................
    获取描述符................................
        获取设备描述符................................
USB总线复位................................
USB标准请求................................
   设置地址.....................
       地址为:  2
USB标准请求................................
    获取描述符................................
        获取设备描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取语言ID................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取设备序列号................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取语言ID................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取产品字符串................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取语言ID................................
USB标准请求................................
    获取描述符................................
        获取字符串描述符................................
            获取产品字符串................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取设备描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
        获取配置描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    获取描述符................................
USB标准请求................................
    设置配置................................
USB类请求................................
    设置空闲................................
USB标准请求................................
    获取描述符(从接口)..............................
        获取报告描述符................................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................
USB标准请求................................
    获取描述符(从接口)..............................

关键字:USB  枚举过程 引用地址:USB入门系列之六 —— USB设备的枚举过程

上一篇:USB入门系列之七 —USB的描述符及各种描述符之间的依赖关系
下一篇:USB入门系列之五 —— USB设备的插入检测机制

推荐阅读最新更新时间:2024-05-03 00:19

超低功耗AC适配器与智能USB充电控制器
你的手机、平板电脑是否充完电经常忘记拔出充电器?看着插座上一堆错综复杂的各式充电器想要抓狂?是时候告别这一切了!TI最新推出的低功耗AC适配器控制器UCC28700和智能USB充电端口控制器TPS2511,就能帮你开启懒人的理想生活。   智能手机和平板电脑等各种移动设备的丰富与流行,使得充电这件事变得越来越频繁,人们往往懒得拔下充电器以便下一次充电,于是待机功耗成为忽视的能耗。实际上,根据IMS Research的数据显示,2010年全球大约有12.5亿个手机适配器,占所有外部适配器市场的53%,显然,2012年对应的数据还会有所提升。假如能够有效降低这些适配器的空载损耗,那么也对于全球倡导的节能环保做出了积极有效的响应。
[电源管理]
超低功耗AC适配器与智能<font color='red'>USB</font>充电控制器
STM32组合设备实现USB转双串口
串口及其中断初始化 void USART1Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
[单片机]
诺基亚确认Nokia N1平板配USB Type-C 接口
    根据诺基亚官方更新的推文显示即将发售的Nokia N1平板确定将会采用USB Type-C 接口,在插入的时候不再需要确认正反面,同苹果的Lightning端口一样无论从哪个方面都能插入。 去年12月,USB 推广团队(USB 3.0 Promoter Group)已经公布了下一代 USB Type-C 连接器的渲染图,随后在今年8月开始已经准备好进行大规模量产。新版接口的亮点在于更加纤薄的设计、更快的传输速度(SuperSpeed USB 10 Gbps),更强悍的电力传输(最高100W)。 Nokia N1采用7.9英寸2048×1536分辨率的4:3比例IPS LED 324 PPI背光屏幕,
[手机便携]
PL2586_USB 2.0 HUB高速多口集线器扩展方案
PL2586是继MA8601新出的USB2.0工业级HUB芯片方案 它集成了符合USB-IF“电池充电规范修订版1.2”的功能,支持便携式设备的快速充电功能。此功能将PL2586转变为“通用充电解决方案”(UCS)兼容的基于电池的便携式设备的USB充电集线器,由GSMA推广。当在下游端口检测到符合B.C.标准的便携式设备时,PL2586中的专用端口可以处理充电请求。而且,在握手完成后,PL2586允许便携式设备达到900mA(高速);1.5A(低速/全速)来自充电下游端口(CDP)或1.5A来自专用充电端口(DCP)。 特点: 符合USB规范修订版2.0 上游端口支持高速(480MHz)和全速(12MHz)通信 可配置的4/3
[嵌入式]
PL2586_<font color='red'>USB</font> 2.0 HUB高速多口集线器扩展方案
USB-IF 宣布第一款获认证的USB3.0 芯片组
北京 – 2011 年 4 月 12 日 – USB 实施者论坛(简称 USB-IF)今天宣布第一款获认证的 SuperSpeed USB (USB 3.0) 芯片组。由 AMD 推出的 A75 与 A70M FCH 芯片组代表了在 制造商广泛采用 SuperSpeed USB 方面的重大里程碑,因为内建 USB 3.0 支持让设计者 能够在各自的系统中无缝集成 SuperSpeed USB。AMD A75 与 A70M FCH 芯片组所获的 认证向制造商和消费者保证,此款 SuperSpeed USB 芯片组合乎 USB 3.0 规格,并可按 该规格运行。 “SuperSpeed USB 生态系统的上升势头史无前例,而
[嵌入式]
有一种数据传输接口叫USB Type-C,你造吗?
在MWC2016世界移动通信大会上,来自全球的各大厂商纷纷展示了自家的新产品与新技术,其中LG发布的G5、乐视的乐Max pro等手机纷纷采用了USB Type-C数据接口,那么作为一个普通用户,不禁要问了,USB Type-C 是什么鬼?那今天小编就来给大家科普一下咯。 目前主流的手机数据传输接口分为三种,第一种是安卓的Micro-B,其大小为8.3mm× 2.5mm),第二种是iPhone的lingtning,大小为7.4mm×2.35mm,第三种就是最新的Type-C接口,大小约为8.3mm×2.5mm,以上三种长的就是下图酱紫滴,小伙伴们是不是熟悉那么一两种?     USB Type-C其实是USB接口的一种连
[嵌入式]
2000B系列经济型USB示波器的性能特点分析
产品简介: 价格超级棒的示波器 PicoScope2000B系列提供2和4通道型号的多种选择,加上具有2模拟+16数字通道的混合信号示波器型号。所有型号都包含频谱分析仪、函数发生器、任意波形发生器和串行总线分析仪,混合信号示波器还拥有逻辑分析仪。 PicoScope2000B系列新增效益包括深度缓存(最大128MS)、更高带宽(最大100MHz)和更快的波形刷新率,给你必要的性能轻松完成先进的波形分析,包括串行解码和绘制频率对时间的图形。 混合信号性能 PicoScope2000B系列混合信号示波器都有2模拟和16数字输入,让你同时观察你的数字和模拟信号。数字输入可独立显示或者任意编组显示。 强大、便携又超小 所有Pi
[测试测量]
USB海量存储类设备功能在ARM系统中的应用
技术发展到今天的信息时代,数据的存储和传输在嵌入式系统有了越来越重要的地位。而USB是目前设计成熟、应用广泛且使用极为简捷的技术,USB传输是一种高效方便的数据传输方式。基于上述原因,本文重点论述基于USB的海量存储(USB Mass Storage)设备功能在ARM嵌入式系统中设计和应用。使用该设备功能,上位机可以像读写普通U盘一样对于系统采集并存储在FLASH中的数据进行读写。 1 硬件方案 l.1 器件简介 S3C44B0X 是SAMSUNG公司出品的基于ARM7TDMI内核的RISC型微处理器,8 kB指令和数据共享的缓存,主频可达66 MHz,可以运行16位的Thumb指令和32位的ARM指令,且接口丰富,具有通用
[应用]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved