原点

没啥说的!趁年轻,多分享点东西!

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)=X5+X2+1
        表示这个多项式的二进制位模式是00101B。 如果所有令牌比特都没有错误地被接收到,则接收器处的五比特残差将是01100B。
    • Data CRCs
        数据CRC是应用在数据包的数据字段上的16位多项式。 生成多项式是:G(X)=X16+X15+X2+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部分
阅读更多
文章标签: USB USB2.0
个人分类: USB
想对作者说点什么? 我来说一句

USB 2.0 协会规范

2014年11月21日 5.71MB 下载

USB2.0技术规范(中文).pdf

2017年02月05日 2.63MB 下载

USB2.0 PCB 布局布线规范

2013年10月15日 280KB 下载

USB2.0技术规范完整(中文)

2016年06月03日 1.62MB 下载

Bus Hound监听的U盘的报文

2018年04月19日 1.89MB 下载

USB 2.0与OTG规范及开发指南

2015年01月22日 44.82MB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭