《圈圈教你玩USB》 第一章 USB 概述及协议基础——看书笔记

1.1 USB是什么

1. USB是什么:
    USB是通用串行总线(Universan Serial Bus)的缩写。
2. USB出现的原因:
    1)支持热插拔,并且即插即用(PnP:Plug and Play);
    2)有很强的可扩展性,速度也很快。
3.USB协议版本:
    1.0、1.1、2.0等
4.通信结构:
    主从模式结构,设备与设备、主机与主机之间不能互连。
5.USB OTG(On The Go):
    同一个设备,在不同场合下可以在主机和从机之间切换。
    主从标志:USB OTG增加了一种MINI USB接头,比普通的4线USB多一根ID标识线,用来表明它是主机还是设备。

1.2 USB的特点

1. 速度:
    USB1.0和1.1版本中,只支持1.5Mb/s的低速(low-speed)模式和12Mb/s的全速(full-speed)模式。
    USB2.0中,又加入了速度更快(480Mb/s)的高速(high-speed)模式。
    USB3.0中,5.0Gb/s。
    注:USB2.0并不一定都是高速设备,因为USB2.0协议对设备的高速模式不是强制的,而是可选的。例如PDIUSBD12,符合USB2.0协议,但不支持 高速模式,只支持12Mb/s的全速模式。
2. 优点:
   即插即用、容易使用、方便携带、传输速度快、可扩展性强、标准统一、价格便宜等。
3. 缺点:
    传输距离短、开发调试难度大等。

1.3 USB的拓扑结构

1.USB拓扑结构的构成:
   1)USB的系统结构:
        主从模式,主机叫Host,从机叫Device(也叫作设备)。
   2)主控制器和根集线器:
        ① 通常所说的主机具有一个或者多个USB主控制器(host controller)和根集线器(root hub)。主控制器主要负责数据处
理,而根集线器则提供一个连接主控制器和设备之间的接口和通路。
           特殊的USB设备:USB集线器(USB hub),它可以对原有的USB口在数量上进行扩展,就可以获得更多的USB口。
            注:集线器只能扩展出更多的USB口,而不能扩展出更多的带宽。带宽是共享一个USB主控制器的。
       ② 通常,PC上有多个USB主控制器和多个USB口。每个主控制器下有一个根集线器,根集线器通常具有一个或多个
USB口。当有多个不同的USB设备都需要较大的数据带宽时,可以考虑将它们分别接到不同的主控制器的根集线器上,
以避免带宽不足。
        ③ 电脑端的设备管理器中的主控制器和集线器如下图所示:
             
2. USB的拓扑结构:
     1)拓扑结构简介:
        ① 塔顶为USB主控制器和根集线器,下面接USB集线器。
        ② USB集线器将一个USB口扩展为多个USB口,多个USB口又可以通过集线器扩展出更多的USB接口。
            USB协议中对集线器的层数的限制:USB1.1最多4层,USB2.0最多6层。
            USB协议中对设备数量的限制:一个USB主控制器最多可接127个设备,这是因为协议规定每个USB设备具有一个
7位的地址(取值范围 为0~127,而地址0是保留给未初始化的设备使用的)。实际上不会连接127个设备。USB主控制
器要连接多个设备时,需要由集线器负责 端口扩展,而不是简单地将多个设备并联或串联。PC端也有一个或多个集
线器,它就是前面提到的根集线器,直接连在USB主控制器上。
     2)数据传输过程:
        ① 首先,由USB主控制器发出命令和数据,通过根集线器,再通过下面的集线器(如果有)发送给USB设备;
        ② 设备对接收到的数据进行处理后,返回一些信息或数据,它首先到达其上一层的集线器,上层的集线器再交给更
层的集线器,一直到 USB主控制器为止;最终,USB主控制器将数据交给计算机的CPU处理。
        ③ 在标准的PC上,USB主控制器是挂载在PCI总线上的。

1.4 USB的电器特性

1.5 USB的电缆、插头及插座

1.6 USB的插入检测机制

1.7 USB的描述符及其之间的关系

1. USB描述符的作用
   告诉USB主机,USB设备的功能及行为。
   描述符中记录了设备的类型、厂商ID和产品ID(通常依靠它们来加载对应的驱动程序)、端点的情况、版本号等众多信息。
2. 标准描述符
    USB1.1协议定义的:① 设备描述符 ② 配置描述符 ③ 接口描述符 ④ 端点描述符 ⑤ 字符串描述符
    USB2.0协议增加的:⑥ 设备质量描述符 ⑦ 其它速度配置描述符
3. 特殊描述符
    类特殊描述符:① HID描述符 ② 音频接口描述符
    厂商自定义的描述符等。
4. USB描述符之间的层级关系
设备描述符里决定 -> 设备有几种配置描述符;
每种配置描述符里决定 -> 该配置有几个接口;
每个接口描述符里定义 -> 该接口有几个端点;(如果有类特殊描述符,跟在接口描述符之后)
端点描述符里定义了端点的大小和类型等。
5. 主机获取描述符的顺序(从上到下)
    ① 设备描述符;
    ② 配置描述符;
    ③ 配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符;(主机根据配置描述符中配置集合的总长度,一次将它们读回)
    ④ 字符串描述符。(主机通过发送获取字符串描述符的请求、描述符的索引号、语言ID来单独获取对应的字符串描述符)
6. 描述符主要记录的信息
序号 描述符 主要记录的信息
1 设备描述符 设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商ID(VID)和产品ID(PID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等
2 配置描述符 配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。
3 接口描述符 接口的编号、接口的端点数目、接口所使用的类、子类、协议等
4 端点描述符 端点号及方向、端点传输类型、最大包长度、查询时间间隔等
5 字符串描述符 方便人们阅读的信息,它不是必需的
7. USB 设备个属性的关系 和 设备各属性 VS 教室     

   USB设备:鼠标      教室
序号 属性 作用 属性 作用
1 设备地址:8888 找到设备 8号楼 找到楼
2 端点:0、1 找到端点 808教室 找到教室
3 配置(抽象概念,方便管理端点) 管理一个或多个不同的功能 教学楼的作用 用于期末考试(一个功能)平时上课(多个功能)
4 接口(抽象概念,方便管理端点) 管理端点功能 教室的作用 考试或“上课和教师休息”
① 一个设备可以有多个配置,但同一个时刻只能有一个配置有效,当我们需要不同功能时,只需要选择不同配置即可;
② 每个配置下可以有一个或多个接口;
③ 每个接口下可以有一个或多个端点;
④ 同一个端点号不能出现在同一个配置下两个或多个不同的接口中;但是可以用在不同的配置中。
USB复合设备:
具有多个接口并由接口实现功能的设备,例如一个USB音频设备,它具有 一个音频控制接口、一个到多个音频流或MIDI流接口。
        在主机端会把USB复合设备的每一个接口当作一个功能设备看待。
单一的设备:一个设备下只有一个配置描述符、一个接口描述符,像常见的USB鼠标、U盘等。
总结:端点构成接口、接口构成配置、配置构成设备。
描述符的重要性:
    如果一个设备的各种描述符成功返回了,则可以说已经成功了大半。相反,只要描述符出现一点问题,哪怕只有一个
bit的错误,都可能造成 设备无法识别或无法正常工作。

1.8 USB设备的枚举过程

1. 何时进行枚举:
    USB主机检测到USB设备插入后,就要对设备进行枚举。
2. 枚举的目的:
    USB主机从设备读取各种描述符信息,根据这些信息加载合适的驱动程序,从而知道如何与设备通信。调试USB设备 大部分 都是USB的枚举过程。
3. USB的传输模式:控制传输:
    ① 控制传输的重要性 
保证数据的重要性,在设备枚举过程中使用。
    ② 控制传输的过程
        建立(setup)过程:由USB发起,开始于一个SETUP令牌包,后面紧跟一个DATA0数据包,如果指定了数据长度为
非0,接着就是数据过程;
        可选的数据过程:如果是控制读传输:输入数据,如果是控制写传输:输出数据,之后就是状态过程;
        状态过程:如果是控制读传输:一个输出数据包,如果是控制写传输:一个输入数据包;
                        注:a.与数据过程的数据传输方向相反。
                              b.状态过程的作用:用来确定所有的数据是否都已经正确传输完成了。
4. 枚举的详细过程:
① USB主机检测到USB插入后,就会先对设备复位。USB设备在总线复位后其地址为0。这样主机就可以通过地址0和
那些刚刚插入的设备通信。
        USB主机向地址为0的设备的端点0发送获取设备描述符的标准请求(这是一个控制传输的建立过程)。
        设备收到该请求后,会按照主机请求的参数,在数据过程中将设备描述符返回给主机。
        主机成功获取到一个数据包的设备描述符并确认没有错误后,就返回一个长度0的确认数据包(状态过程)给设备,从
而进入接下来的设置地址阶段。
        注:第一次获取设备描述符时,只需要返回一次数据即可,不要再等主机继续获取剩余数据(如果还有),因为主机不
会这 么干的。 因为, 第一次主机只会读取一个数据包的设备描述符,当主机成功获取到设备描述符的前8个字节后(
USB协议规 定端点0最大包长至少要有8 字节),它就知道端点0的 最大包长度了,因为端点0最大包长度刚好在设备
描述符的第八字节处。 标准的设备描述符有18字节,有些USB设备的 端点0大小不足18字 节(但至少具有8字节),
在这种   情况下, USB主机也是只 发送一次数据输入请求,多余的数据将不会再次请求。因此如果当 设备端点0大小
不足18字节时,就 需要注意这个问题。
    ② 主机对设备又一次复位。进入设置地址阶段。
         USB主机向地址为0的设备的端点0发出一个设置地址的请求(控制传输的建立过程),新的设备地址包含在建立过程
的数据包中。  USB设备收到这个建立过程后,直接进入 状态过程 ,因为这个控制传输没有数据过程。  设备等待主机
请求状态的返回(一个输入 令牌包),收到 输入令牌包后,设备就返回 0长度的状态 数据包
         如果主机已确认该状态数据包已经正确收到,就发送应答包ACK给设备。
         设备在收到这个ACK之后,就要启用新的设备地址了。
         这样设备就分配到了一个唯一的设备地址,以后主机就通过它来访问该设备。
        注:USB接口芯片D12,会自动等待状态过程主机的ACK之后才启用新地址,所以要在返回0长度的状态包之前,将
地址写到 D12芯片的地址寄存器中。
     ③ 主机再次获取设备描述符。
            这次跟第一次有点不一样:
           首先,主机不再使用地址0来访问设备,而是新的设备地址;
           另外,这次需要获取全部的18字节的设备描述符。如果端点0最大包长小于18字节,则会有多次请求数据输入(即
发送多个IN令牌包)。
     ④ 主机获取配置描述符。
            配置描述符共9字节。主机在获取到配置描述符后,根据配置描述符中所描述的配置集合总长度,获取配置集合。
            获取配置描述符集合和获取配置描述符的请求差不多,只是指定的长度不一样。有些主机不单独获取配置描述符,
而是直接 使用最大长度来 获取配置描述符的集合,因为设备 实际返回的数据可以少于指定的字节数。
            配置集合包括:配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符等。
            注:接口、类特殊和端点描述符不能单独获取,必须跟随配置描述符以一个集合的方式一并返回。
      ⑤ 字符串描述符(可有可无)、报告描述符(在HID设备中)。

1.9 USB的包结构及传输过程

1.9.1 USB的包结构及包的分类

1. USB是串行总线,数据时从最低位(LSB)到最高位(MSB)以此发送的。一个包,又被分成了很多个域(field),而LSB、MSB就是以域为单位来划分的。
2. USB总线上的数据传输方式:
   ①  以包为基本单位;
   ② 一个包被分成不同的域,根据不同类型的包,所包含的域不同;
   ③ 不同包的共同特点:以同步域开始,紧跟着一个包标识符(PID),最终以包结束符EOP来结束这个包。
       同步域:
            作用:a、告诉USB的串行接口引擎数据要开始传输了,请做好准备;
                      b、用来同步主机端和设备端的数据时钟。
             如何起作用的:
                      同步域时以一串0开始的,而0在USB总线上就被编码为电平翻转,结果就是每个数据位都发生电平变化,
这让串行数据引擎很容易就能 恢复采样时的时钟信号。
                      对于全速设备和低速设备,同步域使用的是0000 0001(二进制数,总线上的发送顺序);对高速设备,同
步域使用的是31个0,后面跟着 1个1(注,这是对发送端的要求, 接收端解码时,0的个数可以少于这个数)。
                      下图是全速设备或低速USB数据包的同步域经过NRZI编码后的波形。这个波形有7次电平翻转,即对应着
7个0,最后一个电平不翻转, 即对应着1个1。
                              
                       当串行接口引擎检测到一个位的数据未发生翻转后(即收到数据1),就认为包标识符(PID)开始了。上图的
PID0 和PID1,就是包标识符的 最低两位。
        包标识符:
            作用:用来标识一个包的类型。
            USB协议中4种包的类型:
                     
                     注:① 标识符总共有8位,其中USB协议使用的只有4位(PID0~PID3),另外4位(PID4~PID7)时PID0~PID3的
取反,用来验 证PID。
                            ② 大类靠PID0~PID1区分,小类靠PID2~PID3区分。
                            ③ *号时USB2.0中有,在USB1.1中没有的。
       包结束符:对于高速设备和全速/低速设备也是不一样的。
                a、全速/低速设备:
                            EOP内容:一个大约2个数据位宽度的单端0(SE0)信号。
                            SE0的意思:D+和D-同时保持低电平。由于USB使用的是差分数据线,通常是一高一低的,而SE0不
是一种都为 低的特殊状态。
                            SE0的作用:用来表示一些特殊的意义,例如包结束、复位信号等。前面提到的额USB集线器对USB
设备 进行复位的 操作,就是通过将总线设置为 SE0状态大约10ms来实现的。
                  b、对于高速设备
                             EOP内容:故意的位填充错误。
                             区分包结束和位填充错误的方法:用CRC校验,如果正确,说明这个位填充错误是EOP,否则说明
是传输出错。

1.9.2 令牌包

1.令牌包的作用:用来启动一次传输
2.令牌包的分类及各自的作用
   1) 输出令牌包(OUT)
         通知设备将要输出一个数据包;
   2)输入令牌包(IN)
         通知设备返回一个数据包;
   3) 建立令牌包(SETUP)
         只用在控制传输中,它跟输出令牌包的作用一样,也是通知设备将要输出一个数据包。
         两者区别在于:SETUP令牌包后只使用DATA0数据包,且只能发到设备的控制端点,且设备必须接收,而
     OUT令牌包没有这些限制。
   4) 帧起始包(SOF)
         引导数据发送。
         在每帧(或微帧)开始时发送,它以广播的形式发送,所有的USB全速设备和高速设备都可以接收到SOF包。
         USB全速设备每毫秒产生一个帧,而高速设备每125us产生一个微帧。USB主机会对当前帧号进行计数,在
每次帧/微帧开始时通过SOF 发送帧号。SOF中帧号是11位的。
         在4个令牌包中只有SOF后面不跟数据传输,其他的都有数据传输。
3. 令牌包的结构
    1)OUT、IN、SETUP令牌包
         
     2)SOF令牌包
         
     3)结构分析:
        ① 每个令牌包,最后都有一个CRC5的校验,它只校验PID之后的数据,不包括PID本身,因为PID本身已经
有4个取反的位进行校验了。
        ② OUT、IN、SETUP令牌包具有相同的结构:同步域+包标识符+地址域+端点域+CRC5校验域和包结束。
            地址域:要访问的设备的地址;
            端点域:要访问的端点号;
            CRC5校验:只计算地址域和端点域。

1.9.3 数据包

1. 数据包的作用:用来传递数据。
2. 数据包的分类及各自的作用
    USB1.1中 DATA0包、DATA1包;
    USB2.0中新增 DATA2、DATA3,主要用在高速分裂事务和高速宽带同步传输中。
    不同类型数据包作用:当握手包出错时纠错。
    例子:DATA0和DATA1包的切换
            主机和设备都会维护自己的一个数据包类型切换机制:当数据包成功发送或接收时,数据包类型切换。当检测到
对方所使用的数据 包类型 不对时,USB系统认为这发生了一个错误,并试图从错误中恢复。
            数据包类型不匹配主要发生在握手包被损坏的情形。当一端已经正确接收到数据并返回确认信号时,确认信号
却在传输过程中被损 坏。这 时,另一端就无法知道刚刚发送的数据是否已经成功,这时只好保持自己的数据包的
类型不变。如果对方下次使用的数据 包类型跟自己的不一 样,则说明它刚刚已经成功接收到数据包了(因为它已经
做了数据包切换,只有正确接收才会如此);如果对方下次 使用的数据包类型跟自己的一 致,则说明对方没有切换
数据包类型,即刚刚的数据包没有发送成功,这是上一次的重试操作。
3. 数据包的结构
    
     数据包都具有相同的结构:一个同步域+PID+N字节的数据+CRC16校验+EOP。

1.9.4 握手包

1. 握手包的作用:用来表示一个传输是否被对方确认。
2. 握手包的分类和各自的作用:
    ACK:表示正确接收数据,且有足够的空间来容纳数据。
              主机和设备都可以用ACK来确认,而NAK、STALL、NYET只有设备能够返回,主机不能使用这些握手包。
    NAK:表示没有数据需要返回,或数据正确接收,但没有足够的空间来容纳。
              当主机收到NAK时,知道设备还未准备好,主机会在以后合适的时机进行重试传输。
    STALL:表示设备无法执行这个请求,或端点已被挂起了,它表示一种错误状态。
               设备返回STALL后,需要主机进行干预才能解除这种STALL状态。
    NYET:表示设备本次数据成功接收,但没有足够的空间接收下一次数据。
               主机在下次输出数据时,将先使用PING令牌包来试探设备是否有空间接收数据,以避免不必要的带宽浪费。
                只用在USB2.0的高速设备输出事务中。
    注:返回NAK并不表示数据出错,只是说明设备暂时没有数据传输或暂时没有能力接收数据。当USB主机或设备
检测到数据出错时 (如CRC校验错、 PID校验错、位填充错等),将什么也不反回。此时等待接收握手包的一方就
会收不到握手包而等待超时。
3. 握手包的结构

1.9.5 特殊包

1. 特殊包的作用:在一些特殊场合使用。
2. 特殊包的分类和各自的作用:
       令牌包: 
        1)PRE:通知集线器打开其低速端口的一种前导包。
                只使用在全速模式中。因为平时为了防止全速信号使低速设备误动作,集线器没有将全速信号传送给低速设备。
只有当收到PRE 令牌包时, 才打开其低速端口。PRE令牌包与握手包的结构一样,只有同步域、PID和EOP。当需要
传送低速事务时,主机首先发送一 个PRE令牌包(以全 速模式发送)。对全速设备来说,会忽略这个令牌包。集线器在
收到这个令牌包后,打开其连接的低速设备的端口。 接着,主机就会以低速模式 给低速设备发送令牌包、数据包等。
        2)PING:与OUT令牌包具有一样的结构,但是PING令牌包后并不发送数据,而是等待设备返回ACK或NAK,以判
设备是否能够传 送数据。
                在USB1.1中没有没有PING令牌包。只有在USB2.0高速环境中才会使用PING令牌包,它只被使用在批量传输和
控制传输的输出事 务中。直接 使用OUT令牌包发送数据时,不管设备是否有空间接收数据,都会在OUT令牌包之后跟
着发送一个数据包,如果设备没有空 间接收数据,旧返回  一个NAK。这样会浪费总线带宽,白白传送了数据。在高速
设备中增加了这个PING机制,主机先用PING令牌包试 试设备是否有空间接收数据,而 不是事先把数据发送出去。
                在全速模式下,有时会遇到传输速度低的现象:下位机程序慢了一点点处理完数据,结果传输速度却下降了很
多。 这就是前面所说 的OUT过程直 接发送数据导致的,即虽然程序只慢了一点,但却丢弃了整个数据包。
        3)SPLIT:高速事务分裂令牌包,用来通知集线器将高速数据包转化为全速或低速数据包发送给其下面的端口。
        握手包:
          ERR:在分裂事务中表示错误使用。

1.9.6 如何处理数据包

1. 怎么处理各种包和传输过程
    使用现成的USB接口芯片,很多过程芯片已经处理好了,不用太关心这些细节,只要知道有这么一个过程就行了。
2. 芯片会做的工作
    1)CRC校验、位填充、PID识别、数据包切换、握手等协议的处理;
    2)当USB接口芯片正确接收到数据时,如果有有空间保存,则它将数据保存并返回ACK,同时,设置一个标志表示
已经正确收到数据;如果 没有空间保存 数据,则自动回返回NAK。
    3)当收到输入请求时,如果数据需要发送,则发送数据,并等待接收ACK。只有当数据成功发送出去(即接收到应答
信号ACK)之后,它才设置 标志,表示数 据已成功发送;如果无数据需要发送,则它自动返回NAK。
3. 我们需要做的工作
因为 在USB接口芯片中通过一些标志可以知道是哪些端点接收或成功发送了数据,所以通常只需要根据芯片提供的
一些标志,准备要发送的数据 到端点,或 者从端点读取接收到的数据即可。
    注:所要发送和接收的数据是指数据包中的数据,至于同步域、包标识、地址、端点、CRC等时看不到的,在Bus 
Hound中抓到的数据也是如此, 仅是数据包; 并且Bus hound中只能看到成功传输的数据,即只有ACK确认过的数据包。

1.10 USB的四钟传输类型

1. 传输数据的要求 
    ① 不能随便地使用包来传输数据;
    ② 要按照一定的关系把这些不同的包组织成事务(transaction)才能传输数据。

1.10.1 USB事务

1. 事务的构成:由两个或三个包组成;
2. 组成事务的包及其作用:
    1)令牌包:用来启动一个事务,总是由主机发送;
    2)数据包:传送数据,主机和设备间互相都能发送,方向由令牌包指定;
    3)握手包:表示数据是否接受好。发起者通常为数据接受者,当数据正确接收后发送。设备也可以用NAK来表示数据未准备好。
3. USB传输类型及其传输事务数量的区别
    1)批量传输:每次传输一个事务
    2)等时传输(同步传输):每次传输一个事务
    3)中断传输:每次传输一个事务
    4)控制传输:包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。

1.10.2 批量传输

1. 批量传输的作用:
    使用批量事务(bulk transaction)传输数据。
2. 批量事务的组成:
    一次批量事务有三个阶段:令牌包阶段、数据包阶段、握手包阶段。
    批量传输分为批量读和批量写,批量读使用批量输入事务,批量写使用批量输出事务。
3. 批量传输的使用场景:
    批量传输没有规定数据包中数据的意义和结构,具体数据结构有设备自己定义。批量传输常用在数据量大、对数据的实时性要求不高的场合,例如
USB打印机、 扫描仪、大容量存储设备等。
4. 批量传输的过程:
    批量输出事务:
        1)主机
               先发出一个OUT令牌包,这个令牌包包含了设备地址、端点号。
               再发送一个DATA包(具体什么类型的DATA包,要看数据切换位),这时地址和端点匹配的设备就会收下这个数据包。
               然后,主机切换到接收模式,等待设备返回握手包。
        2)设备
                如果解码令牌包、数据包都准确,且有足够的缓冲区来保存数据后,就会使用ACK握手包或者NYET握手包来应
答主机(只有高速模式才有NYET 握手包,它 表示本次数据成功接收,但是没有能力接收下一次传输)。
                如果没有足够的缓冲区来保存数据,那么它就会返回一个NAK握手包,告诉主机目前没有缓冲区可用,主机会在
稍后的时间重试该批量输出事务。
                如果设备检测到数据正确,但是端点处于挂起状态,则返回一个STALL握手包。
                如果设备检测到有错误(例如校验错误、位填充错误等),则不做任何响应,让主机等待超时。
    批量输入事务:
        1)主机
                先发出一个IN令牌包,令牌包包含设备地址和端点号。
                然后,主机切换到接收模式,等待设备返回数据。
                如果主机接收到设备发送的数据包并解码正确后,使用ACK握手包应答设备。
                如果主机检测到错误,则不做任何响应,设备会检测到超时。
                USB协议规定,不允许主机使用NAK握手包来拒绝接收数据,因为之前是主句主动要设备发送数据的。
                主机在接收到NAK握手包后,知道设备暂时没有数据返回,主机会在稍后的时间里重试该输入事务。
        2)设备
                如果设备检测到错误,那么不做任何响应,主机等待超时。
                如果此时有地址和端点匹配的设备,并且没有检测到错误,则该设备要做出响应:
                    如果设备有数据需要返回,则它把一个数据包放到总线上(具体的数据包类型要看数据切换位);
                    如果设备没有数据需要返回,则它直接使用NAK握手包来响应主机;
                    如果该端点处于挂起状态,则它会返回一个STALL握手包。
    高速输出:
        在USB2.0高速设备中增加了一个PING令牌包,它不发出数据,直接等待设备的握手包。因此PING事务中只有令牌包和握手包。
5. 批量事务流程示意图
      
   流程图讲解:
        1) 平时无数据传输时,总线处于空闲状态。
        2) 当需要传输一次事务时,主机发送一个令牌包。它可以是OUT、IN或PING令牌包。其中PING令牌包是USB2.0
高速模式输出特有的, 全速模式和低速模式 没有这个令牌包。
        3) 如果设备解码令牌包错误,则直接进入空闲状态。
        4) 令牌阶段之后是数据阶段或握手阶段。
            IN令牌包
                   对于批量输入事务,则由设备返回数据,或者返回应答包:NAK握手包或者STALL握手包。这有设备的状态来决定。
            OUT令牌包
                   对于批量输出事务,则主机在令牌包后面在发送一个数据包。
            PING令牌包
                   用来探测设备是否有空间接收数据,它没有数据阶段,只有握手阶段,设备根据实际的情况返回握手包。
                   ACK握手包表示有空间接收数据;NAK握手包表示无空间接收;STALL表示端点挂起。
        5) 最后是握手包阶段
                批量输入事务:
                   如果主机接收设备返回的数据正确,则由主机返回ACK握手包;
                   否则数据错误,主机什么也不返回。主机必须要能够接收数据,不能用NAK回应设备。
                批量输出事务:
                   如果设备能够接收数据,则返回ACK;
                   如果设备没有空间接收数据包,则返回NAK握手包;
                   如果设备端点挂起,则返回STALL握手包;
                   如果设备检测到传输错误,则什么都不回应,直接进入空闲状态。
6. 一个传输正确的批量事务数据包(传送2字节数据)
    批量输入事务:
                 
    批量输出事务:
                    

1.10.3 中断传输

1. 中断传输的实质:
    是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。
2. 中断传输的应用场合:
    通常用在数据量不大,但是对时间要求较严格的设备中,例如人机接口设备(HID)中的鼠标、键盘、轨迹球等。
    也可以用来不断检测某个状态,当条件满足后再使用批量传输来传送大量的数据。
3. 中断事务的流程示意图:
    中断传输使用中断事务(interrupt transaction),流程图如下,和批量事务差不多。
                
    除了对端点查询的策略上不一样之外,中断传输和批量传输的结构基本上是一样的,只是中断传输中没有PING和NYET两种包。

1.10.4 等时传输

1. 等时传输(同步传输)的应用场合:
    用在数据量大、实时性要求高的场合,例如音频设备、视频设备等。这些设备对数据延时很敏感。
2. 没有应答包的原因:
    对音频或视频设备来说,对数据的100%正确要求不高,少量数据的错误还是能容忍的,主要的是要保证不能停顿,
所以等时传输时不保证数据 100%正确的。当数据错误时,并不进行重传操作。因此等时传输没有应答包。
    数据是否正确可以由数据包的CRC校验来确认。至于出错的数据如何处理,由软件来决定。
3. 等时事务的流程图:
    等时传输使用等时事务(isochronous transaction)来传输数据。
             

1.10.5 控制传输

1. 控制传输的分类:
    建立过程、可选的数据过程、状态过程。
2. 控制过程复杂的原因:
    它要保证数据传输的完整性。设备枚举过程中各种描述符的获取以及设置地址、设置配置等,都是通过控制传输来实现的。
3. 控制过程的详细介绍:
1)建立过程:
    ① 使用一个建立事务。
    ② 建立事务是一个输出数据过程,与批量传输的输出事务相比,有几处不同:
        首先,令牌包不一样,建立过程使用SETUP令牌包;
        其次,数据包类型不一样,SETUP只能使用DATA0包;
        最后,握手包不一样,设备只能使用ACK来应答(除非出错了,不应答),而不能使用NAK或者STALL来应答,即设备必须接收建立事务的数据。
    ③ 建立事务流程图:
                
2)数据过程:
    ① 可选的,即一个控制传输可能没有数据过程。
    ② 如果有,一个数据过程可以包含一笔或多笔数据事务。
    ③ 控制传输所使用的数据事务与批量传输中的批量事务是一样的。
    ④ 在数据过程中,所有的数据事务必须是同一传输方向的。一旦方向发生改变,就会认为进入了状态过程。
           控制读传输中,数据过程中的所有数据事务都是输入的;
           控制写传输中,数据过程中的所有数据事务都是输出的。
    ⑤ 数据过程的第一个数据包必须是DATA1包,然后每次正确传输一个数据包后,就在DATA0和DATA1之间交替。
3)状态过程:
    ① 也是一笔批量事务。
    ② 它的传输方向刚好和数据阶段相反。即,
            控制读传输中,数据过程中的所有数据事务都是输出的;
            控制写传输中,数据过程中的所有数据事务都是输入的。
    ③ 状态过程只使用DATA1包。

4. 三种控制传输的实例:
         
注:关于USB协议中定义的控制传输所使用的各种标准请求的数据结构和请求命令,将会在后面的实例中具体、详细地分析。

1.10.6 端点类型与传输类型的关系

1. 端点名称定义:
    ① 一个具体的端点,只能在一种传输模式下工作。
    ② 通常,我们把工作在什么模式下的端点,就叫做什么端点。例如,控制端点、批量端点等。
2. 端点0的作用:
    ① 端点0是每个USB设备都必须具备的默认控制端点,它一上电就存在并且可用。
    ② 设备的各种描述符和主机发送的一些命令,都是通过端点0传输的。
    ③ 其他端点都是可选的,需要根据具体设备来决定。
    ④ 非0端点只有在Set Config之后才能使用。

1.10.7 传输类型与端点支持的最大包长

每个端点描述符中都规定了端点所支持的最大数据包长。主机每次发送数据都不能超过端点的最大包长。
序号 传输模式 低速模式 高速模式 全速模式
1 控制传输的端点 固定为8字节 固定为64字节 可在8、16、32、64字节中选择
2 等时传输的端点 不支持 最大为1024字节 最大为1023字节
3 中断传输的端点 最大为8字节 最大为1024字节 最大为64字节
4 批量传输的端点 不支持 固定为512字节 可在8、16、32、64字节中选择

1.11本章小结

    简单介绍了必要的一些USB的基本概念,包括电气特性、数据包结构等知识。





































第一章 USB概述协议基础 1 1.1 USB是什么 1 1.2 USB的特点 1 1.3 USB的拓扑结构 2 1.4 USB的电气特性 5 1.5 USB的线缆以及插头、插座 5 1.6 USB的插入检测机制 7 1.7 USB的描述符及其之间的关系 9 1.8 USB设备的枚举过程 10 1.9 USB的包结构及传输过程 11 1.9.1 USB包的结构及包的分类 11 1.9.2 令牌包 13 1.9.3 数据包 14 1.9.4 握手包 14 1.9.5 特殊包 15 1.9.6 如何处理数据包 15 1.10 USB的四种传输类型 16 1.10.1 USB事务 16 1.10.2 批量传输 16 1.10.3 中断传输 18 1.10.4 等时传输(同步传输) 19 1.10.5 控制传输 20 1.10.6 端点类型与传输类型的关系 21 1.10.7 传输类型与端点支持的最大包长 21 1.11 本章小结 21 第二章 硬件系统设计 1 2.1 方案以及芯片的选定 1 2.2 D12引脚功能说明 2 2.3 D12与89S52的连接 4 2.4 串口部分电路 6 2.5 按键部分 7 2.6 指示灯部分 7 2.7 IDE接口部分 8 2.8 单片机部分 8 2.9 元件安装 8 2.10 电路调试 11 2.11 测试程序的编写和调试 12 2.11.1 建立一个工程 12 2.11.2 为工程添加源文件 14 2.11.3 KEIL工具栏及仿真介绍 15 2.11.4 按键驱动的编写 18 2.11.5 串口驱动的编写 24 2.11.6 PDIUSBD12读写函数及读ID的实现 28 2.12 本章小结 33 第三章 USB鼠标的实现 1 3.1 USB鼠标工程的建立 1 3.2 USB的断开与连接 1 3.3 USB中断的处理 4 3.4 读取从主机发送到端点0的数据 6 3.5 USB标准请求 12 3.5.1 USB标准设备请求的结构 13 3.5.2 GET_DESCRIPTOR请求 15 3.5.3 SET_ADDRESS请求 16 3.5.6 SET_CONFIGURATION请求 16 3.6 设备描述符的实现 17 3.7 设备描述符的返回 20 3.8 设置地址请求的处理 30 3.9 配置描述符集合的结构 32 3.9.1 配置描述符的结构 32 3.9.2 接口描述符的结构 33 3.9.3 端点描述符的结构 33 3.9.4 HID描述符的结构 34 3.10 配置描述符集合的实现以及返回 35 3.11 字符串及语言ID请求的实现 39 3.12 设置配置请求的实现 45 3.13 报告描述符的结构及实现 48 3.14 报告的返回 54 3.15 Bus Hound工具的简介 57 3.16 本章小结 59 第四章 USB键盘的实现 1 4.1 USB键盘工程的建立 1 4.2 设备描述符的实现 1 4.4 配置描述符集合的实现 2 4.4.1 配置描述符 3 4.4.2 接口描述符 3 4.4.3 HID描述符 3 4.4.4 端点描述 3 4.5 字符串描述符 6 4.6 报告描述符 6 4.7 输入和输出报告的实现 10 4.8 USB键盘实例的测试 13 4.9 再谈USB HID的报告描述符 14 4.10 带鼠标功能的USB键盘(方法一) 16 4.11 带鼠标功能的键盘(方法二) 22 4.12 多媒体USB键盘 29 4.13 本章小结 34 第五章 用户自定义的USB HID设备 1 5.1 MyUsbHid工程的建立 1 5.2 描述符的修改 1 5.3 报告的实现 3 5.4 对用户自定义的USB HID设备的访问 5 5.5 访问HID设备时所用到的相关函数 5 5.5.1 获取HID设备的接口类GUID的函数 5 5.5.2 获取指定类的所有设备信息集合的函数 6 5.5.3 从设备信息集合中获取一个设备接口信息的函数 6 5.5.4 获取指定设备接口详细信息的函数 7 5.5.5 打开设备的函数 8 5.5.6 获取HID设备属性的函数 8 5.5.7 从设备读取数据的函数 9 5.5.8 往设备写数据的函数 9 5.5.9 通过控制端点0读取报告的函数 10 5.5.10 通过控制端点0发送报告的函数 10 5.5.11 关闭设备的函数 10 5.5.12 需要包含的库文件 11 5.6 访问USB HID设备的上位机软件的实现 11 5
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值