USB传输的4种模式:

BULK:块数据传输

      追求数据完整性,CRC校验,故该种传输方式,虽然可以做大数据的传输,但是并不适合实时传输;

Interrupt:中断传输

也是实时传输,对数据准确性有一定保证;

ISO:同步传输

     追求实时性,无校验,允许有一定的误码率,一般用于实时传输比如视频会议,音频等;

control:控制数据传输

USB四种传输模式

当USB插入USB总线时,USB控制器会自动为该USB设备分配一个数字来标示这个设备。另外,在设备的每个端点都有一个数字来表明这个端点。
USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(Transaction),事务有四种类型,分别是Bulk Transaction、Control Transaction、Interrupt Transaction和Isochronous Transaction。每次事务都会分解成若干个数据包在USB总线上传输。每次传输必须历经两个或三个部分,第一部分是USB控制器向USB设备发出命令,第二部分是USB控制器和USB设备之间传递读写请求,其方向主要看第一部分的命令是读还是写,第二部分有时候可以没有。第三部分是握手信号。以下针对这四种传输,分别进行讲解。

1.Bulk传输事务

顾名思义,改种事务传输主要是大块的数据,传送这种事务的管道叫做Bulk管道。这种事务传输的时候分为三部分,如图17-10所示。第一部分是Host端发出一个Bulk的令牌请求,如果令牌是IN请求则是从Device到Host的请求,如果是OUT令牌,则是从Host到Device端的请求。
第二部分是传送数据的阶段,根据先前请求的令牌的类型,数据传输有可能是IN方向,也有可能是OUT方向。传输数据的时候用DATA0和DATA1令牌携带着数据交替传送。

第三部分是握手信号。如果数据是IN方向,握手信号应该是Host端发出,如果是OUT方向,握手信号应该是Device端发出。握手信号可以为ACK,表示正常响应,也可以是NAK表示没有正确传送。STALL表示出现主机不可预知的错误。
在第二部分,即传输数据包的时候,数据传送由DATA0和DATA1数据包交替发送。数据传输格式DATA1和DATA0,这两个是重复数据,确保在1数据丢失时0可以补上,不至于数据丢失。如图17-11所示。

默认情况下使用该USB设备 android_usb数据传输

 


(点击查看大图)图17-10  Bulk传输

默认情况下使用该USB设备 android_数据_02

 


图17-11  Bulk传输时的令牌

2.控制传输事务

控制传输是负责向USB设置一些控制信息,传送这种事务的管道是控制管道。在每个USB设备中都会有控制管道,也就是说控制管道在USB设备中是必须的。控制传输也分为三个阶段,即令牌阶段、数据传送阶段、握手阶段,如图17-12所示。

默认情况下使用该USB设备 android_usb数据传输_03

 


图17-12  控制传输事务

3.中断传输事务

在USB设备中,有种处理机制类似于PCI中断的机制,这就是中断事务。中断事务的数据量很小,一般用于通知Host某个事件的来临,例如USB鼠标,鼠标移动或者鼠标单击等操作都会通过中断管道来向Host传送事件。在中断事务中,也分为三个阶段,即令牌阶段、数据传输阶段、握手阶段,如图17-13所示。

默认情况下使用该USB设备 android_usb数据传输_04

 


(点击查看大图)图17-13  中断传输事务

4.同步传输事务

USB设备中还有一种事务叫同步传输事务,这种事务能保证传输的同步性。例如,在USB摄像头中传输视频数据的时候会采用这种事务,这种事务能保证每秒有固定的传输量,但与Bulk传输不同,它允许有一定的误码率,这样符合视频会议等传输的需求,因为视频会议首先要保证实时性,在一定条件下,允许有一定的误码率。同步传输事务有只有两个阶段,即令牌阶段、数据阶段,因为不关心数据的正确性,故没有握手阶段,如图17-14所示。

默认情况下使用该USB设备 android_数据丢失_05

 


图17-14  同步传输事务



1、数据丢失原因:


(1)主要原因是Windows不是实时系统,不能保证每次都是准时地完成BULK IN操作,特别是有其他进程运行时(如:笔记本的电源管理、实时杀毒等)。此外如果机器上有其他USB设备,也会造成USB带宽受限引起BULK 传输的实时性不能保证,造成数据丢失。


(2)BULK传输要进行CRC校验,一旦发现有错,数据作废,需要重传,但这是实时系统不允许的,当然也就造成数据丢失。


(3)Device的数据缓冲区容量不够大,以至于HOST稍有停顿,缓冲区就会溢出,造成数据丢失。


 (4) 如CY7C68013A数据手册46页图21所示, 在Slave FIFO Asynchronous Write模式, SLWR周期必须 >=120ns,即SLWR频率<=8.3MHz,否则会导致端点FIFO中的数据丢失。


2、解决办法:


(1)卸载主机中所有影响USB带宽和实时性的软件模块,特别是笔记本的电源管理和杀毒软件,拔掉(卸载)其它USB Devices。


(2)加大Device的发送Buffer(例如在数据源于端点之间加个大容量的FIFO,如:IDT72V2103等)和Host的接收Buffer容量, 加大HOST每次BULK传输的总字节数(可减少“微帧”间隔时间)。


(3)如果对个别数据出错(是出错,不是丢失!)的要求不是很严格(如用于观测的图像数据,个别数据出错看不出来,但丢失数据就有可能错行,彩色图像还会错色),可改用ISO方式(注意ISO每帧必须是1024字节),即使传输出错(可能是个别数据出错,对视频图像影响不大!)也保留数据,不需重传,尽量保证传输的实时性,减少数据丢失。