传输方式
在USB的数据传送的方式下,有四种的传输方式:控制(Control)同步(isochronous)中断 (interrupt)大量(bulk)。如果你是从硬件开始来设计整个的系统,你还要正确选择传送的方式,而作为一个驱动程序的书写者,就只需要弄清楚他是采用的什么工作方式就行了。
通常所有的传送方式下的主动权都在PC边,也就是host边。
控制(Control)方式传送:控制传送是双向传送,数据量通常较小。USB系统软件用来主要进行查询、配置和给USB设备发送通用的命令。控制传送方式可以包括8、16、32和64字节的数据,这依赖于设备和传输速度。控制传输典型地用在主计算机和USB外设之间的端点(Endpoint)0之间的传输,但是指定供应商的控制传输可能用到其它的端点。
同步(isochronous)方式传送:同步传输提供了确定的带宽和间隔时间(latency)。它被用于时间严格并具有较强容错性的流数据传输,或者用于要求恒定的数据传送率的即时应用中。例如执行即时通话的网络电话应用时,使用同步传输模式是很好的选择。同步数据要求确定的带宽值和确定的最大传送次数。对于同步传送来说,即时的数据传递比完美的精度和数据的完整性更重要一些。
中断 (interrupt)方式传送:中断方式传输主要用于定时查询设备是否有中断数据要传送。设备的端点模式器的结构决定了它的查询频率,从1到255ms 之间。这种传输方式典型的应用在少量的分散的、不可预测数据的传输。键盘、操纵杆和鼠标就属于这一类型。中断方式传送是单向的并且对于host来说只有输入的方式。
大量(bulk)传送:主要应用在数据大量传送传送和接受数据上,同时又没有带宽和间隔时间要求的情况下,要求保证传输。打印机和扫描仪属于这种类型。这种类型的设备适合于传输非常慢和大量被延迟的传输,可以等到所有其它类型的数据的传送完成之后再传送和接收数据。
USB 将其有效的带宽分成各个不同的桢(frame),每桢通常是1ms时间长。每个设备每桢只能传送一个同步的传送包。在完成了系统的配置信息和连接之后, USB的host就会对不同的传送点和传送方式做一个统筹安排,用来适应整个的USB的带宽。通常情况下,同步方式和中断方式的传送会占据整个带宽的 90%,剩下的就安排给控制方式传送数据。
USB的低层结构
USB设备
USB的设备可以接在PC上的任意的USB接口上。而使用HUB还可以扩展使更多的USB设备连接到系统中,USB的HUB有一个上行的端口(到host),有多个的下行端口(连接其它的设备),从而可以使整个的系统可以扩展的连接127个外设,其中HUB也酸外设。对于USB系统来说,USB的host永远是PC边,所有的其他连接到host都称为设备,在设备与设备之间是无法实现直线通信的,只有通过host的管理与调节才能够实现数据的互相传送.在系统中,通常会有一个根HUB,这个HUB一般有两个下行的端口。
一个PC可以拥有一个或多个的USBhost控制器。一般有两种类型的控制器:UHCI(USBhost控制器接口),OHCI(开放的host控制器接口)。Windows的USB类驱动程序对于每一种的控制器类型都有一种miniclass驱动程序来支持。
USB的物理信号
USB 的电缆有四根线,两根传送的是5V的电源,有一些直接和电源HUB相连的设备可以直接利用它来供电。另外的两根是数据线,数据线是单工的,在整个的一个系统中的数据速率是一定的,要么是高速,要么是低速,没有一个可以中间变速的设备来实现数据码流的变速.在这一点上,USB和1394有明显的差别。
USB的总线可以在不使用的时候被挂起,这样一来就可以节约能源。
在有些时候的总线还有可能挡机(stall),比如说象数据传送的时候突然被打断,这个时候通过host的重新配置可以实现总线的重新工作。
低层协议
USB的物理协议规定了大多数的在总线上的数据格式,通常一个全速的数据桢可以最多有的1500bytes,而对于低速的桢最多有187bytes。
桢通常是用来分配带宽给不同的数据传送方式。同时由于桢结构的规律性,桢的这种特性也可以用来做同步信号来使用。
一个最小的USB的数据块叫做包(packet),包包括同步信号,包标识(packetID),CRC和传送的数据。PacketID共有以下十种:
token:OUTINSOFSETUP
data:DATA0DATA1
handshake:ACKNAKSTALL
special:PRE
Transactions(数据交换)
一个transaction是在host和设备(device)之间的不连续相互数据交换,通常由host开始交换,交换的开始是由Token的包开始的,接下来是双方向上的数据包,在数据包传送完之后,就会由设备(device)返回一个握手(handshake)包。USB系统通过IN,OUT,和 SETUP的包来指定USB地址和endpoint(最多是128个,0通常被用来用做缺省的传送配置信息的),并且这些被指定的设备必须通过上面形式的包来回应这种形式的指定。每个SETUP的包包含8个byte的数据,数据用来指示传送的数据类型。对于DATA数据包来说,设置两种类型的数据包是为了能够在传送数据的时候做到更加的精确。ACKhandshake的包用来指示数据传送的正确性,而STALLhandshake则表示数据包在传送的过程中出了故障,并且请示host重新发数据或者清除这次传送。PRE格式的包主要是用在在一个USB的系统中如果存在不同速率的设备的时候,将不同于总线速度的设备中就会回应一个PRE的包从而会忽略该设备。
各种不同类型的包的大小是不同的,DATA的数据包最大是1023bytes.
StartofFrame(SOF)
SOF是host用来指示frame的开头的。SOF的包包括11个bit的桢序号,从0到0X7FF(i.e.USBD_ISO_START_FRAME_RANGE-1),SOF对于所有的高速设备来说是有效的。
Power
每个设备可以从总线上获得100mA的电流,如果特殊的向系统申请,最多可以获得500mA的电流,在挂机的状态下,电流只有500uA