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

来源:互联网 发布:java开发超市管理系统 编辑:程序博客网 时间:2024/04/30 14:49
本文介绍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并不是"包治百病"的。

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