全面认识 USB 技术的精髓(一)


当 Intel 向业界宣布在 USB 2.0 协议中将 USB 的标准传输率提高到 480Mbps 的时候,你也许还在为 USB 是什么样的东西而困惑。本文力图从比较通俗的角度向你详细介绍 USB 接口和 USB 协议方面的知识。


   USB 是 Universal Serial Bus 的简称。它是一种可以同时处理计算机与具有 USB 接口的多种外设之间通信的电缆总线。这些连接到计算机上的外设共同分享 USB 的带宽。 USB 的分时处理机制真正在硬件的意义上实现了计算机外设的即插即用。


  如果留心一下当前市场上的电脑外设,大家会发现采用 USB 设备的产品正在逐渐增加。键盘、鼠标、 MODEM 、游戏杆、音箱、扫描仪等,以前插在串行、并行等外部扩展接口上的部件,甚至一些以前要连接到电脑内部扩展槽上的设备,都开始以 USB 接口的界面出现, USB 设备的发展势头正如日中天。


  一个基于计算机的 USB 系统可以在系统层次上被分为三个部分 : 即 USB 主机 (USB Host) 、 USB 器件 (USB Device) 和 USB 的连接。


  所谓 USB 连接实际上是指一种 USB 器件和 USB 主机进行通信的方法。它包括 :


● 总线的拓扑 ( 由一点分出多点的网络形式 ): 即外设和主机连接的模式;


● 各层之间的关系 : 即组成 USB 系统的各个部分在完成一个特定的 USB 任务时,各自之间的分工与合作;


● 数据流动的模式 : 即 USB 总线的数据传输方式;


●USB 的 “ 分时复用 ”: 因为 USB 提供的是一种共享连接方式,因而为了进行数据的同步传输,致使 USB 对数据的传输和处理必须采用分时处理的机制。


一、 USB 的总线拓扑


   USB 的总线拓扑如图 1 所示,在 USB 的树形拓扑中, USB 集线器 (HUB) 处于节点 (Node) 的中心位置。而每一个功能部件都和 USB 主机形成唯一的点对点连接, USB 的 HUB 为 USB 的功能部件连接到主机提供了扩展的接口。利用这种树形拓扑, USB 总线支持最多 127 个 USB 外设同时连接到主计算机系统。


图 1 USB 的总线拓扑示意图


  一个 USB 系统仅可以有一个主机,而为 USB 器件连接主机系统提供主机接口的部件被称为 USB 主机控制器。 USB 主机控制器是一个由硬件、软件和固件 (Firmware) 组成的复合体。一块具有 USB 接口的主板通常集成了一个称为 ROOT HUB 的部件,它为主机提供一到多个可以连接其它 USB 外设的 USB 扩展接口,我们通常在主板上见到的 USB 接口都是由 ROOT HUB 提供的。


   USB 器件可以分为两种 : 即 USB HUB 和 USB 功能器件 (Function Device) 。


  作为 USB 总线的扩展部件, USB HUB( 图 2) 必须满足以下特征 :


● 为自己和其它外设的连接提供可扩展的下行和上行 (Downstream and Upstream) 端口;


● 支持 USB 总线的电源管理机制;


● 支持总线传输失败的检测和恢复;


● 可以自动检测下行端口外设的连接和摘除,并向主机报告;


● 支持低速外设和高速外设的同时连接。


  从以上要求出发, USB HUB 在硬件上由两部分组成 :HUB 应答器 (HUB Repeater) 和 HUB 控制器 (HUB Controller) 。 HUB 应答器回应主机对 USB 外设的设置,以及对连接到它下行端口的 USB 功能部件的连接和摘除 (Attached and Detached) 的检测、分类,并将其端口信息传送给主机,它也负责如 “ 总线传输失败检测 ” 这样的错误处理;而 HUB 控制器则提供主机到 HUB 之间数据传输的物理机制。如同我们所熟知的大多数计算机外设一样, USB HUB 也有一个用来向主机表明自己身份的 “BIOS” 系统。这块位于 USB HUB 上的 ROM ,通过 USB 特征字使主机可以配置这个 USB HUB ,并监控它的每一个端口。


   USB 功能器件即可以为主机系统提供某种功能的 USB 器件,如一个 USB ISDN 的调制解调器、或是一只 USB 接口的数字摄像机、 USB 的键盘或鼠标等。


图 2 USB HUB 的结构


图 3 一个典型的 USB 功能器件结构框图


   USB 的功能器件作为 USB 外设 (USB Function) ,它必须保持和 USB 协议的完全兼容,并可以回应标准的 USB 操作。同样,用于表明自己身份的 “BIOS” 系统对于 USB 外设也是必不可少的,这在 USB 外设上被称为协议层。在物理机制上,一个 USB 外设可以由四部分构成 ( 图 3):


● 用于实现和 USB 协议兼容的 SIE 部分;


● 用于存储器件特征字、存储实现外设特殊功能程序及厂家信息的协议层 (ROM) ;


● 用于实现外设功能的传感器及对数据进行简单处理的 DSP 部分;


● 将外设连接到主机或 USB HUB 的接口部分。


  根据传输率的不同, USB 器件被分为高速和低速两种。低速外设的标准传输率为 1.5Mbps ,而高速外设的标准传输率为 12Mbps 。所有的 USB HUB 都为高速外设,而功能部件则可以根据外设的具体情况设计成不同的传输率,如用于视频、音频传输的外设大都采用 12Mbps 的传输率,而像键盘、鼠标这样的点输入设备则设计成低速外设。由于 USB 的数据传输采用数据包的形式,因而使得连接到主机的所有的 USB 外设可以同时工作而互不干扰。不幸的是,所有这些 USB 外设必须同时分享 USB 协议所规定的 USB 带宽 ( 这个带宽在 USB 1.0 协议中为 12Mbps) ,虽然 USB 的分时处理机制可以使有限的 USB 带宽在各设备之间动态地分配,但如果两台以上的高速外设同时使用这样的连接方法,就会使它们都无法享用到最高的 USB 带宽,从而降低了性能。这也正是 Intel 这样的巨头为什么要推出 USB 2.0 协议的原因 ( 在 USB 2.0 协议中 USB 的总线带宽一下子被提高到了 480Mbps) 。


  用于实现外设到主机或 USB HUB 连接的是 USB 线缆 ( 图 4) 。从严格意义上讲, USB 线缆应属于 USB 器件的接口部分。 USB 线缆由四根线组成,其中一根是电源线 VBus ,一根是地线 GND ,其余两根是用于差动信号传输的数据线 (D+ , D-) 。将数据流驱动成为差动信号来传输的方法可以有效提高信号的抗干扰能力 (EMI) 。在数据线末端设置结束电阻的思路是非常巧妙的,以至对于 HUB 来判别所连接的外设是高速外设或是低速外设,仅仅只需要检测在外设被初次连接时, D+ 或 D- 上的信号是高或是低即可。因为对于 USB 协议来讲,要求低速外设在其 D- 端并联一个 7.5kΩ 的接地电阻,而高速外设则在 D+ 端接同样的电阻。在加电时,根据低速外设的 D- 线和高速外设的 D+ 线所处的状态, HUB 就很容易判别器件的种类,从而为器件配置不同的信息。图 5 表明了一个典型的高速外设的连接状况。为提高数据传输的可靠性、系统的兼容性及标准化程度, USB 协议对用于 USB 的线缆提出了较为严格的要求。如用于高速传输的 USB 线缆,其最大长度不应超过 5 米,而用于低速传输的线缆则最大长度为两米,每根数据线的电阻应为标准的 90Ω 。


   USB 系统可以通过 USB 线缆为其外设提供不高于 +5V 、 500mA 的总线电源。那些完全依靠 USB 线缆来提供电源的器件被称为总线驱动器件 (Bus-powered device), 而自带电源的器件则被称为自驱动外设 (Self-powered device) 。需要注意的是,当一个外设初次连接时,器件的配置和分类并不使用外设自带的电源,而是通过 USB 线缆提供的电源来使外设处于 Powered 状态。


  无论在软件还是硬件层次上, USB 主机都处于 USB 系统的核心。主机系统 ( 图 6) 不仅包含了用于和 USB 外设进行通信的 USB 主机控制器及用于连接的 USB 接口 (SIE) ,更重要的是主机系统是 USB 系统软件和 USB 客户软件的载体。


总而言之, USB 主机软件系统可以分为三个部分 :


● 客户软件部分 (CSW) ,在逻辑上和外设的功能部件部分进行数据的交换;


●USB 系统软件部分 ( 即 HCDI) ,在逻辑和实际中作为 HCD 和 USBD 之间的接口;


●USB 主机控制器软件部分 ( 即 HCD 和 USBD) ,用于对外设和主机的所有 USB 有关部分的控制和管理,包括外设的 SIE 部分、 USB 数据发送接收器 (Transreceiver) 部分及外设的协议层等。


图 4 USB 线缆 图 5 高速外设的 USB 线缆和电阻的连接图 图 6 USB 主机系统的结构及各部分之间的关系


二、 USB 的 “ 分时复用 ” 和电源管理


  当一个 USB 外设初次接入一个 USB 系统时,主机就会为该 USB 外设分配一个唯一的 USB 地址,并作为该 USB 外设的唯一标识 (USB 系统最多可以分配这样的地址 127 个 ) ,这称为 USB 的总线列举 (Bus Enumeration) 。 USB 使用总线列举方法在计算机系统运行期间动态检测外设的连接和摘除,并动态地分配 USB 地址,从而在硬件意义上真正实现 “ 即插即用 ” 和 “ 热插拔 ” 。


  在所有的 USB 信道之间动态地分配带宽是 USB 总线的特征之一。当一台 USB 外设在连接 (Attached) 并配置 (Configuration) 以后,主机即会为该 USB 外设的信道分配 USB 带宽;而当该 USB 外设从 USB 系统中摘除 (Detached) 或是处于挂起 (Suspended) 状态时,则它所占用的 USB 带宽即会被释放,并为其它的 USB 外设所分享。这种 “ 分时复用 ”(Scheduling the USB) 的带宽分配机制大大地提高了 USB 带宽利用率。


  作为一种先进的总线方式, USB 提供了基于主机的电源管理系统。 USB 系统会在一台外设长时间 ( 这个时间一般在 3.0ms 以上 ) 处于非使用状态时自动将该设备挂起 (Suspend) ,当一台 USB 外设处于挂起状态时, USB 总线通过 USB 线缆为该设备仅仅提供 500μA 以下的电流,并把该外设所占用的 USB 带宽分配给其它的 USB 外设。 USB 的电源管理机制使它支持如远程唤醒这样的高级特性。当一台外设处于挂起状态 (Suspended Mode) 时,必须先通过主机使该设备 “ 唤醒 ”(Resume) ,然后才可以执行 USB 操作。


   USB 的这种智能电源管理机制,使得它特别适合如笔记本电脑之类的设备的应用。


三、 USB 的数据传输模式


图 7 帧开始数据包在 USB 数据传输中的分布
图 8 USB 的通信流及信道
图 9 同步字段
图 10 PID 字段


  我们知道, USB 总线是一种串行总线,即它的数据是一个 bit 一个 bit 来传送的。虽然 USB 总线是把这些 bit 形式的数据打成数据包来传送,但数据的同步也是必不可少的。 USB 1.0/1.1 协议规定, USB 的标准脉冲时钟为 12MHz ,而其总线时钟为 1ms ,即每隔 1ms , USB 器件应为 USB 线缆产生一个时钟脉冲序列。这个脉冲序列称为帧开始数据包 (SOF ,如图 7 所示 ) ,主机利用 SOF 来同步 USB 数据的发送和接收。由此可见,对于一个数据传输率为 12Mbps 的外设而言,它每一帧的长度为 12000bit ;而对于低速外设而言,它每一帧的长度仅有 1500bit 。 USB 总线并不关心外设的数据采集系统及其处理的速率,无论对于怎样的数据产生或是接收,它总是以外设所事先规定的 USB 标准传输率来传输数据。这就要求外设厂商必须在数据采集或接收系统和 USB 协议系统 (SIE) 之间,设置大小合适的先入先出模式 (FIFO) 来对数据进行缓存。


  在 USB 系统中,数据是通过 USB 线缆采用 USB 数据包从主机传送到外设或是从外设传送到主机的。在 USB 协议中,把基于外设的数据源和基于主机的数据接收软件 ( 或者方向相反 ) 之间的数据传输模式称为信道 (Pipe) 。信道分为流模式的信道 (Stream Pipe) 和消息模式的信道 (Message Pipe) 两种。信道和外设所定义的数据带宽、数据传输模式以及外设的功能部件的特性 ( 如缓存大小、数据传输的方向等 ) 相关。只要一个 USB 外设一经连接,就会在主机和外设之间建立信道。对于任何的 USB 外设,在它连接到一个 USB 系统中,并被 USB 主机经 USB 线缆加电使其处于 Powered 状态时,都会在 USB 主机和外设的协议层 (ROM) 之间首先建立一个称为 Endpoint 0 的消息信道,这个信道又称为控制信道,主要用于外设的配置 (Configuration) 、对外设所处状态的检测及控制命令的传送等。信道方式的结构使得 USB 系统支持一个外设拥有多个功能部件 ( 用 Endpoint 0 、 Endpoint 1...Endpoint n 这样的方法进行标识 ) ,这些功能部件可以同时地、以不同的数据传输方向在同一条 USB 线缆上进行数据传输而互不影响 ( 图 8) 。比如一个 USB 的 ISDN MODEM ,就可以同时拥有一个上传的信道和一个下载的信道,并能同时很好地工作。


  为实现多外设、多信道地同时工作, USB 总线使用数据包的方式来传输数据和控制信息。


   USB 数据传输中的每一个数据包都以一个同步字段开始 ( 图 9) ,它的最后两个 bit 作为 PID 字段开始的标志。紧跟在同步字段之后的一段 8bit 的脉冲序列称为 PID( 数据包标识字段,如图 10 所示 ) , PID 字段的前四位用来标记该数据包的类型,后四位则作为对前四位的校验。 PID 字段被分为标记 PID( 共有 IN 、 OUT 、 SETUP 或 SOF 四种 ) 、数据 PID(DATA0 或 DATA1) 、握手 PID(ACK 、 NAK 或 STALL) 及特殊 PID 等。主机根据 PID 字段的类型来判断一个数据包中所包含的数据类型,并执行相应的操作。


  当一个 USB 外设初次连接时, USB 系统会为这台外设分配唯一的 USB 地址,这个地址通过地址寄存器 (ADDR) 来标记,以保证数据包不会传送到别的 USB 外设。 7bit 的 ADDR 使得 USB 系统最大寻址为 127 台设备 (ADDR 字段,如图 11 所示 ) 。由于一台 USB 外设可能具有多个信道,因而在 ADDR 字段后会有一个附加的端点字段 (Endpoint Field ,简标为 ENDP) 来标记不同的信道 ( 图 12) 。所有的 USB 外设都必须支持 Endpoint 0 信道,用 0000 来标记。对于高速设备,可以最大支持 16 个信道,而低速设备在 Endpoint 0 之外仅能有一个信道。


  数据字段作为一次 USB 数据传输的中心目的,在一个 USB 数据包中可以包含 0 ~ 1203Byte 的数据 ( 图 13) 。而帧数量字段则包含在帧开始数据包中,对有的应用场合,可以用帧数量字段作为数据的同步信号。


  为保证控制、块传送及中断传送中数据包的正确性, CRC 校验字段被引用到如标记、数据、帧开始 (SOF) 这样的数据包中。 CRC 校验 ( 数据冗余校验 ) 可以给予数据以 100% 的正确性检验。


图 11 数据包的 ADDR 字段
图 12 端点 (Endpoint) 字段
图 13 USB 的数据字段




全面认识 USB 技术的精髓(二)


本文介绍 USB 总线的数据传输模式、 USB 数据包的格式,以及 USB 外设的组成与结构等内容。


一、 USB 数据包的格式


  在 USB 系统中,有四种形式的数据包 -- 标记数据包 (Token Packets) 、 DATA 数据包 (DATA Packets) 、帧开始数据包 (SOF Packets) 和握手数据包 (Handshake Packets) 。


   1. 标记数据包由 PID 、 ADDR 、 ENDP 和 CRC5 四个字段组成 ( 图 1) 。它因为 PID 字段的不同而分为输入类型 (IN) 、输出类型 (OUT) 和设置类型 (SETUP) 三种。标记数据包处于每一次 USB 传输的 DATA 数据包前面,以指明这次 USB 操作的类型 (PID 字段标记 ) 、操作的对象 ( 在 ADDR 和 ENDP 字段中指明 ) 等信息。 5bit 的 CRC 校验位用来确保标记数据包的正确性。


   2. 我们已经指出, USB 主机会每隔 1ms 在 USB 总线上产生一个 SOF 的 USB 帧同步信号, SOF 数据包包含了这个脉冲序列的实际内容 ( 图 2) ,它由 SOF 格式的 PID 字段、帧数量字段和 5bit 的 CRC 校验码组成。主机利用 SOF 数据包来同步数据的传送和接收。


   3. 用于传输真正数据的 DATA 数据包 ( 图 3) ,因为 PID 的不同可以分为 DATA0 和 DATA1 两种。 DATA0 为偶数据包, DATA1 为奇数据包。 DATA 数据包的奇偶性分类易于数据的双流水处理,而用于控制传输的 DATA 数据包总是以 DATA0 来传送数据。


   4. 握手数据包仅仅包含一个 PID 字段 ( 图 4) , ACK 形式的 PID 表明此次 USB 传输没有发生错误,数据已经成功的传输;而 NAK 形式的握手数据包则向主机表明此次 USB 传输因为 CRC 校验错误或别的原因而失败了,从而使得主机可以进行数据的重新传输; STALL 形式的回应向主机报告外设此刻正处于挂起状态而无法完成数据的传输。


  需要指出的是,每个数据包的结束都会有两个 bit 宽的 EOP 字段作为数据包结束的标志 ( 图 5) , EOP 在差模信号中表现为 D+ 和 D- 都处于 "0" 状态。对于高速 USB 外设而言,这个脉冲宽度在 160 ~ 175ns 之间,而低速设备则在 1.25 ~ 1.50μs 之间。无论其后是否有其它的数据包, USB 线缆都会在 EOP 字段后紧跟 1bit 的总线空闲位。 USB 主机或外设利用 EOP 来判断一个数据包的结束。


图 1 标记数据包的组成
图 2 SOF 数据包的格式

图 3 DATA 数据包的格式
图 4 握手数据包

图 5 EOP 字段在差模信号中的电压表现


二、 USB 总线的数据传输模式


  在前面我们已经提到,每一个 USB 信道对应着一个特定的 USB 传输模式,根据不同的需要, USB 外设可以为 USB 信道指定不同的 USB 传输模式。 USB 总线支持四种数据传输模式:


   1. 控制传输模式 ( 图 6) ,控制传输用于在外设初次连接时对器件进行配置;对外设的状态进行实时检测;对控制命令的传送等;也可以在器件配置完成后被客户软件用于其它目的。 Endpoint 0 信道只可以采用控制传送的方式。


   2. 块传送模式 ( 图 7) ,块传送用于进行批量的、非实时的数据传输。如一台 USB 扫描仪即可采用块传送的模式,以保证数据连续地、在硬件层次上的实时纠错地传送。采用块传送方式的信道所占用的 USB 带宽,在实时带宽分配中具有最高的优先级。


   3. 同步传输模式 ( 图 8) ,同步传输适用于那些要求数据连续地、实时地、以固定的数据传输率产生、传送并消耗的场合,如数字录像机等。为保证数据传输的实时性,同步传输不进行数据错误的重试,也不在硬件层次上回应一个握手数据包,这样有可能使数据流中存在数据错误的隐患。为保证在同步传输数据流中致命错误的几率小到可以容忍的程度,而数据传输的延迟又不会对外设的性能造成太大的影响,厂商必须为使用同步传输的信道选择一个合适的带宽 ( 即必须在速度和品质之间做出权衡 ) 。


   4. 中断传输模式 ( 图 9) ,对于那些小批量的、点式、非连续的数据传输应用的场合,如用于人机交互的鼠标、键盘、游戏杆等,中断传输的方式是最适合的。


图 7 块传送的流程

图 8 同步传输的流程
图 9 中断传输的流程


三、 USB 外设的组成与结构


  本文无意详细论述 USB 外设 ( 本部分所说的 USB 外设如无特别说明均指 USB 功能器件 ) 的设计细节,而只想介绍 USB 功能器件的一般组成,以此来帮助读者了解 USB 外设的基本软硬件构成,以便了解 USB 外设的工作过程和原理。


  组成外设的传感器件和 DSP 因为外设的具体应用各异而有所不同。如对于一台 CMOS 数字摄像机 ( 如 Creative 的 WebCam) ,它的 CMOS 光电耦合器及其 DSP 部分并不因为使用什么样的接口方式而有所改变 ( 如早期的电脑眼皆采用 ECP 的并口增强模式来进行图像数据的传输,而现在几乎都是 USB 接口 ) 。因而本文的重点是阐述 USB 外设接口的部分,即 USB Device Microcontroller(USB 器件微控制器 ) 。图 10 表明了一个 USB 外设总线接口的详细组成框图。


   USB 总线是以差模驱动的方式来进行数据传输的,但在数据包发送之前, USB 协议规定必须使用 NRZI 的编码方式来对数据进行编码。当然,在 USB 外设中,用于解码的器件对外设来说也是必不可少的。 NRZI 的编码协议其实很简单,它采用的是逢 "1" 保持,逢 "0" 跳变的原则 ( 图 11) ,而 NRZI 的解码则采用相反的操作。
为保证数据流中有足够的信号变化, USB 协议规定了 Bit stuffing( 加填充位 ) 的原则,即如果信号流中连续出现六位以上的数据 "1" ,则每隔六位,必须插入一个 "0" ,然后才进入 NRZI 编码。图 12 是一串原始数据及其加填充位后和 NRZI 编码后的数据格式对比。


图 10 USB 外设总线接口的详细组成框图

图 11 NRZI 数据编码

图 12 原始数据和加填充位后及 NRZI 编码后的数据格式对比


   SIE(Serial interface Engine) 是 USB 外设最重要的硬件组成部分之一,它主要由四部分组成:


   1. 硬件上用来完成 NRZI 编 / 解码和加 / 去填充位操作的, NRZI/Bit Buffing 和 NRZO/Bit Unstuffing 的部分 ;


   2. 硬件上产生数据的 CRC 校验码并对数据包进行 CRC 校验的 CRC check & Generator 部分;   


3. 用来将并行数据转化成 USB 串行数据的并 / 串转换部分 (Packet Encode) ,将主机发送的 USB 数据包转化成可以识别的并行数据的串 / 并转换部分 (Packet Decode);


   4. 检测和产生 SOP( 即每个数据包的同步字段 ) 和 EOP 信号的部分。


   USB 外设使用一片 ROM 来存储关于该外设工作的一些重要信息,这被称为 USB 的协议层 (Protocol Layer) ,它不仅存储了诸如厂家识别号、该外设所属的类型 ( 是 HUB 还是 Function ,是低速还是高速设备 ) 、电源管理等常规信息,更重要的是还存储了外设的设备类型、器件配置信息、功能部件的描述、接口信息等,其存储方式都采用特征字 (Descriptors) 的方式。 USB 主机通过在外设的协议层和主机之间建立 Endpoint 0 信道、采用控制传输的方式对这些信息进行存取。特征字采用 USB 协议所规定的结构和代码排列 ( 关于特征字的详细信息请参阅 USB 协议标准 ) 。厂家也可以在该 ROM 的剩余空间中存储特定的程序或信息,以帮助外设完成特定的工作。协议层是一台 USB 外设能够被主机正确识别和配置,并正常工作的前提。可以说,协议层是一台 USB 外设的固件 (Firmware) 中心。


  我们知道,数据采样率因采样精度和使用的不同场合而不同,如对于音频应用,就可以采用 22.05kHz 或 44.1kHz 的采样率,而这个时钟并不和 USB 标准时钟对应。因而在实际应用中,为保证采集到的数据无丢失地打包和传送,必须在 SIE 和数据采集部件 ( 对诸如音箱或打印机等外设则为数据消耗部件 ) 之间设立 FIFOs ,以便对数据进行缓存。对于采用块传送和同步传送的外设而言, FIFOs 的作用显得尤为重要。例如一台采用同步传输的 USB 数字摄像机 ( 现在市场上有很多这种类型的产品 ) ,我们假设它的 CCD 为 400×300 像素,那么为保证数据正确地压缩、传输和接收,直到以后的解压缩及处理,在动态采集中, FIFOs 至少要存储一帧图像,即要求 FIFOs 有 400×300=12KB 的容量。


  在 USB 外设中,用于实现和 USB 线缆无缝连接的 USB 传输接收部分 (Transreceiver) 是必不可少的,它不仅要在电气和物理层面上实现和 USB 线缆的连接,而且要完成对数据包的差模驱动或分离的操作。
以上我们简述了 USB 外设接口的硬件组成,那么在完成 USB 数据传输的过程中,这些硬件又是如何配合工作并和位于主机的软硬件交互,以完成数据传输的呢 ?


  前面已经提到, USB 总线采用总线列举的方法来标记和管理外设所处的状态,当一台 USB 外设初次连接到 USB 系统中后,通过 8 个步骤来完成它的初始化:


   1.USB 外设所连接的 HUB(ROOT HUB 或扩展 HUB) 检测到所连接的 USB 外设并自动通知主机,以及它的端口状态的变化,这时外设还处于禁止 (Disabled) 状态;


   2. 主机通过对 HUB 的查询以确认外设的连接;


   3. 现在,主机已经知道有一台新的 USB 外设连接到了 USB 系统中,然后,它激活 (Enabled) 这个 HUB 的端口,并向 HUB 发送一个复位 (Reset) 该端口的命令;


   4.HUB 将复位信号保持 10ms ,为连接到该端口的外设提供 100mA 的总线电流,这时该外设处于 Powered 状态,它的所有寄存器被清空并指向默认的地址;


   5. 在外设分配到唯一的 USB 地址以前,他的默认信道均使用主机的默认地址。然后主机通过读取外设协议层的特征字来了解该外设的默认信道所使用的实际的最大数据有效载荷宽度 ( 即外设在特征字中所定义的在 DATA0 数据包中数据字段的长度 ) 。


   6. 主机分配一个唯一的 USB 地址给该外设,并使它处于 Addressed 状态;


   7. 主机开始使用 Endpoint 0 信道读取外设 ROM 中所存储的器件配置特征字,这可能会花去几帧的时间;


   8. 基于器件配置特征字,主机为该外设指定一个配置值,这时,外设即处于配置 (Configured) 状态了,它所有的端点 (Endpoint) 这时也处于配置值所描述的状态。从外设的角度来看,这时该外设已处于准备使用的状态。


  在一台外设能被使用之前,它必须被配置。 " 配置 " 即主机根据外设的配置特征字来定义器件的配置寄存器,以便规定外设的所有 Endpoint 的工作环境。如某信道所采用的数据传输方式,该外设所属的器件 " 基类 (Class)" 、 " 派生类 (SubClass)" 和 C++ 等,从而通过基于主机的 USB 系统软件或客户软件对外设进行控制。
当一台 USB 外设配置好以后,即会进入到挂起 (Suspend) 状态,直到它开始被使用。


  必须指出的是,一台 USB 外设一旦配置好,它的每一个特定的信道只能使用一种数据传输方式。 Endpoint 0 信道只能采用控制传送的方式,主机通过 Endpoint 0 来传送标准的 USB 命令,完成诸如读取器件配置特征字、控制外设对数据的采集、处理和传送等任务,并可以通过 Endpoint 0 来检测和改变外设所处的状态 ( 如对外设的远端唤醒、挂起和恢复等 ) 。


  对于一台采用同步传输的数字摄像机来说,数据传输的过程如下:


1. 应用软件 (CSW) 在内存中开辟数据缓冲区,并通过标准 USB 命令字向外设发出数据请求 (IRPs) ;


2. 主机 USB 系统软件通过对该 IRPs 的翻译形成 Token 数据包发送到外设,这时主机进入等待状态;


3. 外设对数据包进行 NRZI 解码和 Bit Unstuffing 操作及 CRC 校验,确认后接收主机 PID 字段中所包含的命令并开始采集数据。


4. 采集到的并行数据首先进入 FIFOs ,并通过并 / 串转换部件形成串行脉冲;


5. 根据器件配置寄存器的要求对数据进行符合条件的分割,配置数据包的 PID 字段等以形成原始数据包。


6. 通过 CRC 校验产生器对每一个数据包生成 CRC 校验码字段, SOP & EOP 信号产生器为该数据包加入同步字段头和数据包结束符;


7. 数据包的 NRZI 编码和 Bit Stuffing 操作;


8. 使用收发器 (Transreceiver) 将数据流驱动到 USB 线缆上。


9. 主机控制器将 USB 数据转化成为普通的 " 纯 " 图像数据送到数据缓冲区以进行数据的进一步处理;如果是控制传输、块传输或中断传输方式,在数据被成功传送后,主机还会向外设发送 ACK 的握手数据包作为回应。
图 13 简单描绘了非同步数据传输的请求和传送过程 ( 在同步传输中没有 Handshake 部分 ) 。


图 13 非同步数据传输的请求和传送过程


四、结束语


  至此,我们已从几个方面较详细地介绍了 USB 系统的软硬件构成及 USB 的数据传输协议。 USB 可以说是开辟了计算机外设接口的新纪元。它把人们从繁杂的连线、不同的接口标准和恼人的中断冲突中解放出来;


  使 "PnP" 和 " 热插拔 " 这样的特性不再只是口号;它大大扩展了计算机可连接的外设数目;它的智能电源管理有效地降低了手持电脑的电源损耗 ……USB 正在成为市场的热点,越来越多的外设生产厂家将自己的产品转向 USB 接口。而 USB 2.0 协议的推出,无疑对 USB 技术的发展起到了推波助澜的作用。


  在如鼠标、键盘、手写板或是游戏杆等人机交互的应用场合;如扫描仪、数码相机、移动存贮设备、数字摄像机等数据输入应用场合,USB无疑是替代传统串/并口的最佳接口方式,它们使得USB的优点得到了充分发挥。但对诸如视频或音频输出这样的场合,USB也真的适用吗?我们知道,像Sound Blaster Live!这样的声卡正是因为它在硬件上实现了波表合成和EAX环境音效等高级特性,才使我们在几乎小于1%的资源占用率下就能听到"天籁之音",同时又能在美仑美奂的3D环境中飚车。然而USB也并非万能,例如我们看到在市场上热卖的"USB音箱"号称可以"省掉一块声卡!"。但由于USB接口并不对数据进行任何处理,因而数据处理的任务完全交给了CPU和软件,从而这种音箱造成了惊人的资源占用率,且从声音的表现上看也与声卡有着天壤之别。所以说,USB并不是"包治百病"的。