USB四种传输模式

更多参考可查阅 http://www.usb.org/developers/docs/


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所示。

 
(点击查看大图)图17-10  Bulk传输
 
图17-11  Bulk传输时的令牌

2.控制传输事务

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

 
图17-12  控制传输事务

3.中断传输事务

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

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

4.同步传输事务

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

 
图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字节),即使传输出错(可能是个别数据出错,对视频图像影响不大!)也保留数据,不需重传,尽量保证传输的实时性,减少数据丢失。

<think>好的,我现在需要详细解释USB3.0的四种传输模式。用户之前的问题是关于应用层解析,现在转向传输模式,所以要保持连贯。根据用户提供的引用资料,USB3.0兼容USB2.0,但传输方式可能有变化。首先,确认四种传输模式是控制、同步、中断和批量。但USB3.0是否有改动呢?比如,引用[2]提到USB2.0的同步传输之外都是Token + Data + Handshake,而USB3.0可能有增强。 引用[3]和[4]提到控制传输分为三个阶段,包括令牌、数据传送和握手。需要将这些阶段对应到USB3.0的结构中。另外,用户之前回答中提到USB3.0的应用层协议包括控制、批量、同步传输,但用户现在问的是四种模式,可能需要整合中断传输。 需要注意USB3.0是否保留了中断传输,或者是否有变化。根据引用[2],USB2.0有中断传输,而USB3.0可能继续支持,但可能优化了机制。例如,USB3.0引入SuperSpeed模式,可能对传输模式有调整。 需要确保每个传输模式的解释包含用途、协议结构、数据包示例以及实际应用场景。例如,控制传输用于设备枚举,批量传输用于大文件传输,同步传输用于实时数据,中断传输用于低延迟查询。 同时,用户提供的引用提到USB3.0的双总线设计,这可能影响传输模式的实现方式,比如同时使用USB2.0和USB3.0的传输路径。需要指出这点,但可能属于物理层,应用层可能不直接涉及。 最后,结合用户之前的回答中的示例代码,如使用CyAPI库,可以关联到不同传输模式在编程中的实现方式。例如,控制传输通过端点0,批量传输使用特定的端点。需要确保术语一致,比如端点、事务包等。 还要注意用户可能混淆了USB2.0和USB3.0的传输模式,需要明确USB3.0中的变化,比如增强的批量传输速率,或新增的流传输特性。此外,USB3.0可能引入了新的机制来提升同步传输的性能,如更高的带宽。 总结步骤: 1. 分别介绍四种传输模式:控制、同步、中断、批量。 2. 每种模式的结构、用途、协议流程。 3. 对比USB3.0与USB2.0的差异。 4. 提供实际应用例子和编程相关示例。 5. 确保引用正确来源,如引用[2][3][4]关于传输阶段的描述。 6. 结合之前的回答,保持数据解析和协议结构的一致性。</think>### USB3.0四种传输模式详解 USB3.0在保留USB2.0四种传输模式(控制、同步、中断、批量)的基础上,通过**双总线设计**和**SuperSpeed模式**显著提升了传输性能[^1]。以下是各模式的详细解析: --- #### 一、控制传输(Control Transfer) **用途** - 设备枚举(如获取设备描述符) - 配置端点(设置地址、选择接口) - 状态查询(如设备状态请求) **协议结构** 控制传输分为三个阶段,采用**三段式事务**(令牌包+数据包+握手包)[^4]: 1. **Setup阶段**:主机发送8字节请求(`bmRequestType`、`bRequest`等) 2. **Data阶段**(可选):传输数据(如描述符信息),方向由请求类型决定 3. **Status阶段**:设备返回操作结果(如ACK/NAK) **示例应用** ```python # 使用PyUSB获取设备描述符(控制传输示例) import usb.core dev = usb.core.find(idVendor=0x1234, idProduct=0x5678) desc = dev.ctrl_transfer(0x80, 0x06, 0x0100, 0, 18) # 获取设备描述符 ``` **USB3.0优化** - 独立控制管道优先级保障,避免高速数据传输阻塞配置请求[^1] --- #### 二、同步传输(Isochronous Transfer) **用途** - 实时数据传输(如摄像头视频流、音频设备) - **不保证数据完整性**,但严格保证带宽和延迟 **协议结构** $$ \text{同步事务} = \underbrace{\text{令牌包}}_{\text{IN/OUT}} + \underbrace{\text{数据包}}_{\text{固定长度}} $$ **无握手包**,直接丢弃错误数据[^2] **数据包示例** ``` | 帧头(0xA5) | 时间戳(32bit) | 视频数据块 (1024字节) | ``` **USB3.0优化** - **带宽提升**:SuperSpeed模式下单通道理论带宽达5Gbps - **多数据流支持**:通过Stream ID字段区分逻辑通道[^3] --- #### 三、中断传输(Interrupt Transfer) **用途** - 低延迟小数据量传输(如键盘按键事件、鼠标移动坐标) - 主机**周期性轮询**设备状态(而非设备主动中断) **协议结构** $$ \text{中断事务} = \underbrace{\text{令牌包}}_{\text{IN}} + \underbrace{\text{数据包}}_{\text{<=64字节}} + \underbrace{\text{握手包}}_{\text{ACK/NAK}} $$ **USB3.0优化** - **轮询间隔缩短**:最小间隔从USB2.0的1ms降至125μs - **动态负载调整**:根据数据量自动调整数据包大小[^4] --- #### 四、批量传输(Bulk Transfer) **用途** - 大容量非实时数据传输(如文件传输、打印机数据) - 高可靠性,**支持错误重传** **协议结构** $$ \text{批量事务} = \underbrace{\text{令牌包}}_{\text{IN/OUT}} + \underbrace{\text{数据包}}_{\text{可变长}} + \underbrace{\text{握手包}}_{\text{ACK/NAK/STALL}} $$ **USB3.0优化** - **流传输(Streams)**:允许单个端点关联多个数据流,提升并发能力 - **Scatter-Gather DMA**:减少CPU占用率[^3] ```python # 批量传输代码示例(使用libusb) import usb.util endpoint_out = dev[0][(0,0)][1] # 获取批量输出端点 data = b'Hello USB3.0' endpoint_out.write(data) # 发送数据 ``` --- ### 对比总结 | 传输类型 | 可靠性 | 实时性 | 典型应用 | USB3.0关键改进 | |------------|--------|----------|----------------------|------------------------| | 控制传输 | 高 | 低 | 设备配置 | 独立通道优先级保障 | | 同步传输 | 低 | 严格保证 | 摄像头/音频 | 带宽提升至5Gbps | | 中断传输 | 中 | 低延迟 | 键盘/鼠标 | 轮询间隔缩短至125μs | | 批量传输 | 高 | 无要求 | 文件传输/存储设备 | 流传输提升并发能力 | --- ### 常见问题 1. **USB3.0中断传输是否支持主动中断?** 不支持。USB协议中所有传输均由主机发起,设备通过**端点状态缓存**响应主机轮询。 2. **如何选择传输模式?** 根据数据类型决定: - 实时流媒体 → 同步传输 - 配置指令 → 控制传输 - 突发小数据 → 中断传输 - 大文件传输 → 批量传输 3. **USB3.0兼容模式传输如何工作?** 当连接USB2.0设备时,USB3.0控制器自动切换到USB2.0总线,沿用旧协议传输[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值