标签:
USB 协议
USB传输协议分析
关键字:
一 、数据格式【包】
总体的格式如下:
|
同步序列【SYNC】
|
包ID【PID】
|
包特定信息
|
CRC校验位
|
包结束标志【EOP】
|


信息包
1.1 、同步序列【SYNC】
所有的包都从同步序列(SYNC)字段开始的,它由8B组成【00000001】,他们在数据线上用NRZI码表示【由一个跳变来表示0】,所以这就提供了一个时钟来同步,信息包紧跟其后。
1.2 、信息包
信息包有:令牌包【SETUP】、数据包、握手包、专用包。
1.2.1 、令牌包【SETUP】


图 PID
|
PID 类型
|
PID 名
|
PID[3:0]
|
描述
|
|
标记/令牌
(Token)
|
输出(OUT)
输入(IN)
帧开始(SOF)
建立(SETUP)
|
0001B
1001B
0101B
1101B
|
在主机到功能部件的事务中有地址+端口号
在功能部件到主机的事务中有地址+端口号
下一个1ms时间片的开始标记和帧号【同步端点用来同步它的传输】
在主机到功能部件建立一个控制管道的事务中有地址+端口号
|

图 地址字段【ADDR】

图 端口字段【ENDP】
|
0[开始]
|
D0
|
D1
|
D2
|
D3
|
D4
|
D5
|
D6
|
D7
|
D8
|
1
|
图 帧字段
帧号字段是一个11位的字段,主机每过一帧就将其内容加一。帧号字段达到其最大值7FFH时归零,且它仅每个帧最初时刻在SOF标记中被发送。
1.2.2 、数据包

DATA如下

|
PID 类型
|
PID 名
|
PID[3:0]
|
描述
|
|
数据
(DATA)
|
数据0(DATA0)
数据1(DATA1)
|
0011B
1011B
|
偶数据包PID
奇数据包PID
|
1.2.3 、握手包
握手包仅由PID构成。

|
PID 类型
|
PID 名
|
PID[3:0]
|
描述
|
|
握手(Handshake)
|
确认(ACK)
不确认(NAK)
停止(STALL)
|
0010B
1010B
1110B
|
接收器收到无措数据包;
接收设备部不能接收数据,或发送设备不能发送数据【暂时的】。
端口挂起,或一个控制管道请求不被支持【永久的】。
|
1.2.4 、专用包
|
PID 类型
|
PID 名
|
PID[3:0]
|
描述
|
|
专用
(Special)
|
前同步(PRE)
|
1100B
|
主机发送的前同步字。打开到低速设备的下行总线通信。
|
二 、事务处理
2.1 、一次事务处理的过程
2.2 、事务处理种类
事务处理包括:SETUP事务、OUT事务、IN事务。
2.2.1 、IN事务

2.2.2 、OUT事务

2.2.3 、SETUP事务

三 、USB传输类型
3.1
、概述
USB有4种传输类型:批量传输(Bulk),控制传输(Control),中断传输(Interrupt)和同步传输(Isochronous)【事务是它们的基本单位】。
3.2批量传输【由 一个或多个IN/OUT事务 构成】
批量传输的特点是以错误检测和重试的方式保证主机和功能部件之间的数据的无错发送的能力。如图所示,批量传输是由标记【令牌】,数据和握手包构成的三时相的事务;在某些流控制和挂起条件下,数据时相被握手信号替换,从而产生了没有数据传输的两时相的事务。

图8-9 批处理事务格式
当主机准备好了接收批量传输数据的时候,它发出输入标记。功能部件端口通过返回数据包,或者如果不能返回数据,则返回NAK或STALL握手作为应答 :
l ACK:主机收到合法的的数据包;
l NAK:功能部件暂时不能返回数据;
l STALL:端口永久地被停止,需要USB系统软件干涉;
l 如果收到数据时主机检测到错误,它不返回握手包给功能部件。
当主机准备好了传送成批数据的时候,它首先发出一个后跟数据包的输出标记包。如果数据由功能部件无错地接收到,那么它将返回三个握手中的一个 :
l ACK:数据包无错地接收到,通知主机可以发送下一个包;
l NAK:数据被无错地收到,但主机应该重新发送数据因为数据功能部件处于妨碍它接受数据的暂时的条件(例如缓冲满)中;
l STALL:端口被停止,告诉主机不要重试传输,因为功能部件上有错误条件。
l 如果接收到的数据有CRC或者位填充错,那么不返回任何握手。
图8-10说明了时序位和数据PID在批量传输读和写中的用法。数据包同步经数据时序切换位(Sequence Toggle Bit)和DATA0/DATA1 PID的使用而达到。当端口经历配置事件(Configuration event)的时候,批量传输端口的切换时序被初始化为DATA0。端口上的数据切换不是作为短包传送或IRP撤消的直接结果而被初始化的。

图8-10 批处理读和写
主机总是通过配置事件初始化总线传送的第一个事务为DATA0 PID。第二的事务使用DATA1 PID,并且,剩余的后继数据传送轮流切换。数据包发送器根据ACK的接收情况来切换而接收器根据数据包的接收(receipt)和验收(acceptance)的情况切换。
3.3
、控制传送
控制传送最少有2个事务阶段:设置阶段、【可选】数据阶段、状态阶段。
3.3.1
、设置阶段里【由 SETUP事务 构成】
SETUP事务在格式上类似于OUT,但是使用的是SETUP而不是OUT的PID。设置阶段总是在SETUP事务的数据时相上使用DATA0 PID。收到SETUP的功能部件必须接受建立数据并用ACK应答,如果数据被损坏,则丢弃数据且不返回握手。

图8-11 控制SETUP事务
3.3.3
、可选数据阶段【由 一个以上IN或OUT事务 构成】
它遵守和批量传送相同的协议规则。所有的数据阶段里的事务都必须有相同的方向(即全部输入或者全部输出)。在数据时相中要发送的数据的数量和其方向在设置阶段里被指定。如果数据的数量超过了先前确定的数据包大小,数据在支持最大的包大小的多个事务中被发送(输入或者输出)。任何剩下的数据都作为剩余在最后的事务中被发送。

3.3.4
、状态阶段【由 IN或OUT事务 构成】
状态阶段是以相对前面的阶段的数据流方向的变化来刻划的,并且总是使用DATA1 PID。例如,如果数据阶段由输出事务构成的,状态是单一的输入事务。如果控制传送序列没有数据阶段,那么它由建立阶段和其后的由输入事务构成的状态阶段构成。图8-12说明了事务顺序,数据时序位的值和控制读写序列的数据PID类型。时序位显示在括号中。

图8-12 控制读写序列
当控制端口在控制传送的数据和状态阶段中发送STALL握手的时候,必须对以后所有对此端口访问返回STALL握手,直到收到建立PID为止。端口收到建立PID之后,不应返回STALL握手。
表8-5 状态阶段的响应
|
状态响应
|
控制写传送(在数据时相发送)
|
控制读传送(在握手时相发送)
|
|
功能部件完成
|
零长度的数据包
|
ACK握手
|
|
功能部件有一个错
|
STALL
握手
|
STALL握手
|
|
功能部件忙
|
NAK
握手
|
NAK握手
|
3.4
、中断传输【由 IN或OUT事务 构成】
一收到输入标记,功能部件便可返回数据,NAK或STALL。如果端口没有新的中断信息(即没有等待事务的中断)可供返回,功能部件在数据时相里返回NAK握手。如果中断端口的停止特征被设置了,功能部件将返回STALL握手。如果中断是等待事务的,功能部件象数据包那样返回中断信息。作为对数据包接收的反应,主机如果数据无错地被接受则发出ACK握手,或者如果数据包损坏则不返回握手。图8-13说明了中断事务格式。

图8-13 中断事务格式
当端口为实际的中断数据使用中断传送机制的时候,必须遵循数据切换协议。这使功能部件得知主机收到了数据,并且事件条件被清除。这种“确保的”事件传送允许功能部件只发送中断信息直到它被主机接收,而不是在USB系统软件清除中断条件之前,每次数据功能部件被选中时就必须要发送中断数据。
用于切换模式时,中断端口被端口上的任何配置事件初始化为DATA0 PID,其行为和图8-10所示的批处理一样。
另外, 中断端口可被用来为某些同步功能部件传达速率反馈信息。用于这种模式时,在每个数据包被送到主机之后,都不管握手包是否存在或类型如何,数据切换位都应该改变。只有中断输入端口支持这种能力。
3.5
、同步传输【由 同步事务 构成】
如图8-14所示,同步(ISO)传输有标记和数据时相,而没有握手时相。主机发出输入或输出标记,后跟着端口(输入)或主机(输出)传送数据的数据时相。ISO事务不支持握手时相或重试能力。

图8-14 同步事务格式
注解:设备或主机控制器都应该能接受DATA0和DATA1。设备或主机控制器应该只发送DATA0。
ISO事务不支持切换时序。
四、 USB请求
4.1 、概述
Usb通讯传输中 主机站主导地位,它发出usb请求 来向usb设备发布指令,而usb设备通过 描述符来说明其性质。
4.2 、Setup 数据包的格式【请求数据包】