USB之USB2.0 规范详解 第一部分

注意

  • 对于物理特性仅做简单说明
  • 主要是针对 USB 2.0 规范的前八章。后续见 第二部分

简介

  USB(Universal Serial Bus) 是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据。在USB 1.0和 USB 1.1 版本中,只支持1.5Mb/s 的低速(low-speed)模式和 12Mb/s 的全速(full-speed)模式,在USB 2.0中,又加入了480Mb/s的高速模式,USB 3.0(super speed),传输速率最大5Gbps。USB 2.0 被设计成为向下兼容的模式,当有全速(USB 1.1)或者低速(USB 1.0)设备连接到高速(USB 2.0)主机时,主机可以通过分离传输来支持它们。一条USB 总线上,可达到的最高传输速度等级由该总线上最慢的“设备”决定。

由于USB是主从模式的结构,设备与设备之间、主机与主机之间不能互连,为解决这个问题,扩大USB的应用范围,出现了USB规范的扩展部分USB OTG(ON The Go)。USB OTG 同一个设备,在不同的场合下可行在主机和从机之间切换。

  以下部分主要根据 USB 2.0 规范的第四章,USB 体系包括USB host(主机)USB device(设备)以及物理连接(USB interconnect)三个部分。其中,设备(USB device)又分为*USB functionUSB Hub

  • USB host: 任何USB系统中只有一个主机。 主机系统的USB接口被称为主机控制器。 主机控制器可以以硬件,固件或软件的组合来实现。 根集线器集成在主机系统内以提供一个或多个连接点。
  • USB device: 可以分为

    • USB Hub: USB HUB提供了一种低成本、低复杂度的USB接口扩展方法。HUB的上行PORT面向HOST,下行PORT面向设备(HUB或功能设备)。在下行PORT上,HUB提供了设备连接检测和设备移除检测的能力,并给各下行PORT供电。HUB可以单独使能各下行PORT。不同PORT可以工作在不同的速度等级(高速/全速/低速)。

      (1)一个 USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一个设备只占用一个地址,那么可最多支持127 个USB 设备。在实际的USB 体系中,如果要连接127 个USB设备,必须要使用USB HUB,而USB HUB 也是需要占用地址的,所以实际可支持的USB 功能设备的数量将小于127。
      (2)ROOT HUB 是一个特殊的USB HUB,它集成在主机控制器里,不占用地址。ROOT HUB 不但实现了普通USB HUB 的功能,还包括其他一些功能。
      (3)“复合设备(Compound Device)”可以占用多个地址。所谓复合设备其实就是把多个功能设备通过内置的USB HUB 组合而成的设备,比如带录音话筒的USB 摄像头等。

    • USB function: 能够通过总线传输或接收数据或控制信息的设备。主要有以下三类:

    • A human interface device such as a mouse, keyboard, tablet, or game controller
    • An imaging device such as a scanner, printer, or camera
    • A mass storage device such as a CD-ROM drive, floppy drive, or DVD drive
  • USB interconnect: USB设备连接到主机并与之通信的方式。主要由以下三部分:

    • Bus Topology: USB上的设备通过分层的星形拓扑物理连接到主机,如下图所示。 USB连接点由称为集线器的特殊类别的USB设备提供。 集线器提供的附加连接点称为端口。 主机包括称为根集线器的嵌入式集线器。 主机通过根集线器提供一个或多个连接点。 为主机提供附加功能的USB设备称为功能。 为了防止循环附件,USB层的星形拓扑结构上采用了分层排序。USB设备和主机之间的连接模型

      Bus Topology
      以HOST-ROOT HUB为起点,最多支持7 层(Tier),也就是说任何一个
      USB 系统中最多可以允许5个USB HUB 级联。一个复合设备(Compound Device)将同时占据两层或更多的层。

    • Inter-layer Relationships: 就功能堆栈而言,是系统中每层执行的USB任务。

    • Data Flow Models: 数据在生产者和消费者之间通过USB在系统中移动的方式。

      管道(Pipe)是主机和设备端点之间数据传输的模型,共有两种类型的管道:无格式的流管道(Stream Pipe)有格式的信息管道(Message Pipe)。任何USB 设备一旦上电就存在一个信息管道,即默认的控制管道,USB 主机通过该管道来获取设备的描述、配置、状态,并对设备进行配置。

    • USB Schedule: USB提供共享互连。 为了支持同步数据传输并消除仲裁开销,计划访问互连。

USB电器特性

  该部分主要针对USB 2.0规范的第六章和第七章。在USB 2.0系统中要求USB传输线使用屏蔽双绞线。USB 支持“总线供电”和“自供电”两种供电模式。在总线供电模式下,设备最多可以获得500mA 的电流。一条USB传输线分别由地线、电源线、D+和D-四条线构成,D+和D-是差分输入线。它使用的是3.3V的电压(与CMOS的5V电平不同),而电源线和地线可向设备提供 5V 电压,最大电流为500mA (可以在编程中设置)。
USB Cable

  • 差分信号1:D+>2.8V,D-<0.3V;
  • 差分信号0:D->2.8V,D+<0.3V。
  • J 状态和 K 状态
      低速下:D+ 为“0”,D- 为“1”是为“J”状态,“K”状态相反;
      全速下:D+ 为“1”,D- 为“0”是为“J”状态,“K”状态相反;
      高速同全速。
  • SE0 状态:D+为“0”,D- 为“0”
  • IDLE 状态
      低速下空闲状态为“K”状态;
      全速下空闲状态为“J”状态;
      高速下空闲状态为“SE0”状态。

针对低速 / 全速模式,有以下几个重要信号:

  • Reset 信号:主机在要和设备通信之前会发送Reset信号来把设备配置到默认的未配置状态。即 SE0 状态保持10ms。
  • Resume 信号:20ms的 K 状态 + 低速 EOP

    (1)主机在挂起设备后可通过翻转数据线上的极性并保持20ms来唤醒设备,并以低速EOP信号结尾。
    (2)带远程唤醒功能的设备还可自己发起该唤醒信号;前提是设备已进入idle状态至少5ms,然后发出唤醒K信号,维持1ms到15ms并由主机在1ms内接管来继续驱动唤醒信号
    Resume

  • Suspend信号:3ms以上的 J 状态

  • SOP 信号:从IDLE状态切换到 K 状态
  • EOP 信号:持续2位时间的SE0信号,后跟随1位时间的J状态

    SOP_EOP

  • SYNC 信号:3个 K、J 状态切换,后跟随2位时间的 K 状态(看到的波形变化是总线上发送0000 0001经过 NRZI 编码后的波形)
    SYNC

信号电平
信号电平
DC 电气特性
DC 电气特性

USB 通信协议

  以下部分主要根据 USB 2.0 规范的第八章。数据在USB线里传送是由低位到高位发送的。USB采用NRZI(非归零编码)对发送的数据包进行编码。即:输入数据0,编码成“电平翻转”;输入数据1,编码成“电平不变”。
  USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在USB总线上发送一个包时,传输设备就要进行位插入操作(即在数据流中每连续6个1后就插入一个0),从而强迫NRZI码发生变化。接收方解码NRZI码流,然后识别出填充位,并丢弃它们。这些是由专门硬件处理的。
NRZI

USB 数据格式

  USB数据是由二进制数字串构成的,首先数字串构成域(有七种)域再构成包包再构成事务(IN、OUT、SETUP)事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。下面介绍一下域、包和事务。
  USB协议规定了四种传输(transfer)类型:批量传输、同步传输、中断传输和控制传输。其中,批量传输、同步传输和中断传输每传输一次数据都是一个事务,控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
首先介绍几个关键字:

  • SOF: Start-of-(micro)Frame,是一个特殊的包,开始帧(SOF)数据包由主机以全速总线每1.00毫秒±0.0005毫秒和高速总线125微秒±0.0625微秒的标称速率发出。 SOF数据包由一个PID指示数据包类型,后面跟着一个11位帧数字段,如下图所示:
    SOF
      SOF令牌包括仅用于令牌的事务处理,其以对应于每个帧的开始的精确时间间隔来分配SOF标记和伴随帧号。 所有高速和全速功能(包括集线器)都会收到SOF数据包。 SOF令牌不会导致任何接收函数生成返回数据包; 因此,SOF交付给任何给定的功能不能得到保证。
  • EOF: End-of-(micro)Frame,是一种电平状态
  • SOP: Start-of-Packet,定义为从IDLE状态切换到K状态的电平变化
  • EOP: End-of-Packet,定义为持续2位时间的 SE0 信号,后跟随1位时间的J状态的电平变化
  • 端点(Endpoint): 位于USB设备或主机上的一个数据缓冲区,是USB设备中可以进行数据收发的最小单元,支持单向或者双向的数据传输,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)。设备支持端点的数量是有限制的,除默认端点外低速设备最多支持2组端点(2 个输入,2 个输出),高速和全速设备最多支持15组端点。按照USB协议栈的层次划分:
      一个Host可能有一个或者多个Device
      一个Device可能有一个或者多个Interface
      一个Interface可能有一个或者多个Endpoint
  • 帧: 时间概念,在USB中,高速USB 总线的帧周期为125us,全速以及低速 USB 总线的帧周期为 1ms,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份是一个USB的传输动作。
      帧的起始由一个特定的包(SOF 包)表示,帧尾为 EOF。EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。 具体见上一节的信号电平。
    Frame

注意:虽然高速USB总线和全速/低速USB总线的帧周期不一样,但是SOF包中帧编号的增加速度是一样的,因为在高速USB系统中,SOF包中帧编号实际上取得是计数器的高11位,最低三位作为微帧编号没有使用,因此其帧编号的增加周期也为 1mS。

域(Field)

  域一个包被分为不同域,域是USB数据最小的单位,由若干位组成(多少位由具体的域决定)。根据不同类型的包,所包含的域是不一样的。但都要以同步域SYNC开始紧跟一个包标识符PID,最终以包结束符EOP 来结束这个包。
Packet
- 同步域(SYNC): 所有的USB包都由SYNC开始,高速包的SYNC宽度为32bit,全速/低速包的SYNC段度为8bit。实际接收到的SYNC长度由于USB HUB的关系,可能会小于该值。八位的值固定为0000 0001,用于本地时钟与输入同步。
- 标识域(PID): PID是用来标识一个包的类型的。它共有8位,只使用4(PID0 ~ PID3),另外4位是PID0 ~ PID3的取反,用来校验PID。PID规定了四类包:令牌包数据包握手包特殊包。同类的包又各分为具体的四种包。
PID

仅在帧首传输一次SOF包

  • 地址域(ADDR): 地址共占11位,其中低7位是设备地址,高4位是端点地址。
    ADDR
    • 地址域: 七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。
    • 端点域(ENDP): 四位,由此可知一个USB设备端点数量最大为16个。
  • 帧号: 占11位,主机每发出一个帧,帧号都会自加1,当帧号达到0x7FF时,将归零重新开始计数。帧号域最大容量0x800,对于同步传输有重要意义。
  • 数据: 根据传输类型的不同,数据域的数据长度从0到1024字节不等。
    DATA
  • CRC: 对令牌包和数据包中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,CRC码的除法是模2运算,不同于10进制中的除法。
    • Token CRCs
        对于令牌(Token)使用5位CRC。涵盖了IN,SETUP和OUT令牌的ADDR和ENDP字段 或 SOF令牌的时间戳字段。 PING和SPLIT特殊令牌也包括一个五位CRC字段。生成多项式如下: G ( X ) = X 5 + X 2 + 1
        表示这个多项式的二进制位模式是00101B。 如果所有令牌比特都没有错误地被接收到,则接收器处的五比特残差将是01100B。
    • Data CRCs
        数据CRC是应用在数据包的数据字段上的16位多项式。 生成多项式是: G ( X ) = X 16 + X 15 + X 2 + 1
        表示这个多项式的二进制位模式是1000000000000101B。 如果接收到的所有数据和CRC位都没有错误,则16位残差将为1000000000001101B。

包(Packet)

  包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。
  包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。
  由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同包的域结构不同,介绍如下:

  • 令牌包: 分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放数据的)其中输入包、输出包和设置包的格式都是一样的:
    SYNC + PID + (ADDR + ENDP) + CRC5(五位的校验码)
    Token
    帧起始包的格式:
    SYNC + PID + 11位FRAM + CRC5(五位的校验码)
    SOF Packet
    • 输出(OUT)令牌包:用来通知设备将要输出一个数据包
    • 输入(IN)令牌包:用来通知设备返回一个数据包
    • 建立(SETUP)令牌包:只用在控制传输中,和输出令牌包作用一样,也是通知设备将要输出一个数据包。
    • 帧起始包:在每帧(或微帧)开始时发送,以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。
  • 数据包: 分为DATA0包和DATA1包。当USB发送数据的时候,如果一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0 包和DATA1 包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为 DATA0,格式如下:
    SYNC + PID + 0~1024字节 + CRC16
    Data Packet

    低速设备允许的最大数据有效载荷大小为8个字节。 全速设备的最大数据有效载荷大小为1023.高速设备的最大数据有效载荷大小为1024个字节。

  • 握手包: 握手包包括 ACK、NAK、STALL以及NYET 四种,其中

    • ACK 表示肯定的应答,成功的数据传输。对于IN事务,它将由host发出;对于OUT、SETUP和PING事务,它将由device发出。
    • NAK 表示否定的应答,失败的数据传输,要求重新传输。在数据阶段,对于IN事务,它将由device发出;在握手阶段,对于OUT和PING事务,它也将由device发出;host从不发送NAK包。
    • STALL表示功能错误或端点被设置了STALL属性。
    • NYET表示尚未准备好,要求等待。结构最为简单的包,格式如下:SYNC + PID
      Handshake Packet

事务(Transaction)

   在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction),分别有IN、OUT和SETUP三大事务。一个事务由一系统packet组成,具体由哪些packet组成,它取决于具体的事务。可能由如下包组成:

  • 一个token packet
  • 可选的data pcket
  • 可选的handshake packet
  • 可选的special packet

事务的三种类型如下(以下按三个阶段来说明一个事务):

IN事务

   表示USB主机从总线上的某个USB设备接收一个数据包的过程。
令牌包阶段——主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;
数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段)。

  • 【正常】的输入事务处理:设备往主机里面发出数据包(DATA0与DATA1交替)
    IN Normal
  • 【设备忙】时的输入事务处理:无法往主机发出数据包就发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续;
    IN Busy
  • 【设备出错】时的输入事务处理:发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。
    IN Error
    握手包阶段——主机正确接收到数据之后就会向设备发送ACK包。

OUT 事务

  输出事务处理:表示USB主机把一个数据包输出到总线上的某个USB设备接收的过程。
令牌包阶段——主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;
数据包阶段——比较简单,就是主机会往设备送数据,DATA0与DATA1交替
握手包阶段——设备根据情况会作出三种反应

  • 【正常】的输出事务处理:设备给主机返回ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息;
    OUT Normal
  • 【设备忙时】的输出事务处理:无法给主机返回ACK,就发送NAK无效包,通知主机再次发送数据
    OUT Busy
  • 【设备出错】的输出事务处理:发送错误包STALL包,事务提前结束,总线直接进入空闲状态
    OUT Error

SETUT 事务

令牌包阶段——主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;
数据包阶段——比较简单,就是主机往设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令。
握手包阶段——设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)。

  • 【正常】的设置事务处理
    SETUP Normal
  • 【设备忙时】的设置事务处理
    SETUP Busy
  • 【设备出错】的设置事务处理
    SETUP Error

传输(Transfers)

  以下部分主要根据 USB 2.0 规范的第五章和第八章 。USB系统中的数据传输,宏观看是在HOST和USB功能设备之间进行。微观看是在应用软件的Buffer和USB功能设备的端点之间进行。一般来说端点都有Buffer,可以认为USB通讯就是应用软件Buffer和设备端点Buffer之间的数据交换,交换的通道称为管道。通常需要多个管道来完成数据交换,因为同一管道只支持一种类型的数据传输。用在一起来对设备进行控制的若干管道称为设备的接口,这就是端点、管道和接口的关系。Host与Device之间的通信视图如下:
传输
  USB 采用“令牌包”-“数据包”-“握手包”的传输机制,在令牌包中指定数据包去向或者来源的设备地址和端点(Endpoint),从而保证了只有一个设备对被广播的数据包/令牌包作出响应。握手包表示了传输的成功与否。
  USB 采用轮询的广播机制传输数据,所有的传输都由主机发起,任何时刻整个 USB 体系内仅允许一个数据包的传输,即不同物理传输线上看到的数据包都是同一被广播的数据包。
  各种传输类型下,对于包长、速率限制如下:
SPEED
  传输由OUT、IN和SETUP事务构成,传输有四种类型,中断传输、批量传输、同步传输、控制传输,其中中断传输和批量传输的结构一样,同步传输有最简单的结构,而控制传输是最重要的也是最复杂的传输。

控制传输(Control Transfers)

  控制传输是一种可靠的双向传输,是最重要也是最复杂的。一次控制传输分为三(或两个)个阶段:建立(Setup)数据(DATA)(可能没有)以及状态(Status)。每个阶段都由一次或多次(数据阶段)事务传输组成(Transaction)。在USB设备初次接到主机后,主机通过控制传输来交换信息、设备地址和读取设备的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都要关心的问题。
  控制传输是双向的传输,必须有IN和OUT两个方向上的特定端点号的控制端点来完成两个方向上的控制传输

  • 建立阶段: 主机从USB设备获取配置信息,并设置设备的配置值。建立阶段的数据交换包含了SETUP令牌封包、紧随其后的DATA0数据封包以及ACK握手封包。它的作用是执行一个设置(概念含糊)的数据交换,并定义此控制传输的内容(即:在Data Stage中IN或OUT的data包个数,及发送方向,在Setup Stage已经被设定)。
      建立阶段,Device 只能返回ACK包,或者不返回任何包。
    SETUP
  • 数据阶段: ,数据过程是可选的。一个数据过程包含一笔或者多笔数据事务。数据过程的第一个数据包必须是DATA1包,然后每次正确传输一个数据包就在DATA0和DATA1之间交替。
    Ctrl RW
    根据数据阶段的数据传输的方向,控制传输又可分为3种类型:

    • 控制读取(读取USB描述符): 是将数据从设备读到主机上,读取的数据USB设备描述符。该过程如上图的【Control Read】所示。对每一个数据信息包而言,首先,主机会发送一个IN令牌信息包,表示要读数据进来。然后,设备将数据通过DATA1/DATA0数据信息包回传给主机。最后,主机将以下列的方式加以响应:当数据已经正确接收时,主机送出ACK令牌信息包;当主机正在忙碌时,发出NAK握手信息包;当发生了错误时,主机发出STALL握手信息包。
    • 控制写入(配置USB设备): 是将数据从主机传到设备上,所传的数据即为对USB设备的配置信息,该过程如上图的【Control Wirte】所示。对每一个数据信息包而言,主机将会送出一个OUT令牌信息包,表示数据要送出去。紧接着,主机将数据通过DATA1/DATA0数据信息包传递至设备。最后,设备将以下列方式加以响应:当数据已经正确接收时,设备送出ACK令牌信息包;当设备正在忙碌时,设备发出NAK握手信息包;当发生了错误时,设备发出STALL握手信息包。
    • 无数据控制: 如上图
  • 状态阶段: 用来表示整个传输的过程已完全结束。通过一次IN/OUT传输表明请求是否成功完成。
      状态阶段传输的方向必须与数据阶段的方向相反,即原来是IN令牌封包,这个阶段应为OUT令牌封包;反之,原来是OUT令牌封包,这个阶段应为IN令牌封包。
      对于【控制读取】而言,主机会送出OUT令牌封包,其后再跟着0长度的DATA1封包。而此时,设备也会做出相对应的动作,送ACK握手封包、NAK握手封包或STALL握手封包。
      相对地对于【控制写入】传输,主机会送出IN令牌封包,然后设备送出表示完成状态阶段的0长度的DATA1封包,主机再做出相对应的动作:送ACK握手封包、NAK握手封包或STALL握手封包。

  控制传输通过控制管道在应用软件和Device的控制端点之间进行,控制传输过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的数据含义。其他三种传输类型都没有格式定义。控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte,对于低速设备该值为8,全速设备可以是8或16或32或64
  最大包长度表征了一个端点单次接收/发送数据的能力,实际上反应的是该端点对应Buffer的大小。Buffer越大,单次可接收/发送的数据包越大,反之亦反。当通过一个端点进行数据传输时,若数据的大小超过该端点的最大包长度时,需要将数据分成若干个数据包传输。并保证除最后一个包外,所有的包长度均等于该最大包长度。这也就是说如果一个端点收到/发送了一个长度小于最大包长度的包,即意味着数据传输结束。

  控制传输在访问总线时也受到一些限制,如高速端点的控制传输不能占用超过 20%的微帧,全速和低速的则不能超过 10%。在一帧内如果有多余的未用时间,并且没有同步和中断传输,可以用来进行控制传输。

  与批量传输相比,在流程上并没有多大区别,区别只在于该事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。

中断传输(Interrupt Transfers)

  中断传输是一种轮询的传输方式,是一种单向的传输。HOST通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据。否则返回NAK,表示尚未准备好。中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。 高速中断传输不得占用超过 80%的微帧时间,全速和低速不得超过90%。 中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1 ~ 255mS。低速端点为10 ~ 255mS,高速端点为(2interval-1)*125uS,其中 interval 取 1到 16 之间的值。
  除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输。高速高带宽端点最多可以在一个微帧内进行三次中断事务传输,传输高达 3072 字节的数据。
  所谓单向传输,并不是说该传输只支持一个方向的传输。而是指在某个端点上该传输仅支持一个方向,或输出、或输入。如果需要在两个方向上进行某种单向传输,需要占用两个端点,分别配置成不同的方向。可以拥有相同的端点编号。
  中断传输由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输。
  中断传输在流程上除不支持PING之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。
  主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。同样中断传输也采用 PID 翻转的机制来保证收发端数据同步。
  中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从USB设备到主机。
  下图为中断传输的流程图。
INT Trans

DATA0或DATA1中的包含的是中断信息,而不是中断数据

批量传输(Bulk Transfers)

  批量传输由OUT事务和IN事务构成,是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。
  用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等
  批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USB HOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点必须支持PING操作,向主机报告端点的状态。NYET表示否定应答,没有准备好接收下一个数据包,ACK 表示肯定应答,已经准备好接收下一个数据包。
  它通过在硬件级执行“错误检测”和“重传”来确保host与device之间“准确无误”地传输数据,即可靠传输。它由三种包组成(即IN事务或OUT事务):

  • token
  • data
  • handshake

Bulk
  上图(USB2.0规范的8.5.2章节)中一个方框表示一个 Packet,灰色的包表示主机发出的包,白色的包表示Device发出的包。批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID按照 DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。若成功则将错误次数计数器清0,否则累加该计数器。

  • For IN Token (即:IN Transaction)
    • ACK: 表示host正确无误地接收到数据
    • NAK: 指示设备暂时不能返回或接收数据 (如:设备忙)
    • STALL:指示设备永远停止,需要host软件的干预 (如:设备出错)
  • For OUT Token (即:OUT Transaction)
    如果接收到的数据包有误,如:CRC错误,Device不发送任何handshake包
    • ACK: Device已经正确无误地接收到数据包,且通知Host可以按顺序发送下一个数据包
    • NAK: Device 已经正确无误地接收到数据包,且通知Host重传数据,由于Device临时状况(如buffer满)
    • STALL: 指示Device endpoint已经停止,且通知Host不再重传

  USB 允许连续 3次以下的传输错误,错误时会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。
  一次批量传输(Transfer)由 1 次到多次批量事务传输(Transaction)组成。

Bulk RW
  上图(USB2.0规范的8.5.2章节)为批量读写时数据位和PID的变化情况。主机总是使用配置事件将总线传输的第一个事务初始化为 DATA0 PID。 第二个事务使用 DATA1 PID,并且在批量传输的其余部分中交替使用 DATA0 和 DATA1 传输数据。翻转同步:发送端按照 DATA0-DATA1-DATA0-…的顺序发送数据包,只有成功的事务传输才会导致PID翻转,也就是说发送段只有在接收到ACK后才会翻转PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到的数据包不是按照此顺序翻转的,比如连续收到两个DATA0,那么接收端认为第二个DATA0是前一个DATA0的重传。

同步传输(Isochronous Transfers)

  同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。由OUT事务和IN事务构成。有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0。
它由两种包组成:

  • token
  • data

Isochronous Transfers
  同步传输不支持“handshake”和“重传能力”,所以它是不可靠传输。
  同步传输适用于必须以固定速率抵达或在指定时刻抵达,可以容忍偶尔错误的数据上。实时传输一般用于麦克风、喇叭、UVC Camera等设备。实时传输只需令牌与数据两个信息包阶段,没有握手包,故数据传错时不会重传。
  除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达 3072 字节的数据。全速同步传输不得占用超过 80%的帧时间,高速同步传输不得占用超过90%的微帧时间。同步端点的访问也和中断端点一样,有固定的时间间隔限制。
  同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级。

分离传输(Split Transaction)

  分离传输是在主机控制器和USB HUB之间的传输,它仅在主机控制器和HUB之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分离传输对于USB设备来说是透明的、不可见的。
  分离传输,顾名思义就是把一次完整的事务传输分成两个事务传输来完成。其出发点是高速传输和全速/低速传输的速度不相等,如果使用一次完整的事务来传输,势必会造成比较长的等待时间,从而降低了高速USB总线的利用率。通过将一次传输分成两次,将令牌(和数据)的传输与响应数据(和握手)的传输分开,这样就可以在中间插入其他高速传输,从而提高总线的利用率。

参考

  • Universal Serial Bus Specification Revision 2.0
  • 国嵌相关资料

附件

  1. Bus Hound监听的U盘的报文
  2. 国嵌资料USB部分

猜你喜欢

转载自blog.csdn.net/zcshoucsdn/article/details/79957404