一、协议简介
1.主要内容:
USB整体通信模型:星型拓扑(以USB主机为核心,建立USB主机与USB设备之间的数据通信),机械层,电气层;
USB数据通信协议:以差模串行信号为载体传送二进制代码来传输信号;数据包作为最基本的完整信息单元,包含了一系列数据信息;
软硬件结构:包括主机、Hub与设备架构;
主机与设备通信流程、步骤;
软硬件设计的方法等
2.结构概况
包:令牌包、握手包、数据包
域:同步序列域、包标识域、地址域、端点域、帧号域、数据域、CRC校验域
以包为基础,USB定义了四种传输类型:控制传输、中断传输、批量传输和同步传输
3.二进制数中位的发送顺序
大端:高地址存储低字节,低地址存储高字节
小端:小小大大
USB一般是首先发送LSB,然后发送近邻的下一位,最后发送MSB,即是大端发送
二、域
1、同步域SYNC
- 用于本地时钟与输入信号的同步,代表一个包的起始;
- 长度为8位,最后两个位为标志位,标明标志域PID的开始;
- 它的数值固定为00000001;
- 同步域位于每个包的最开始处
2、标识域PID
- 位于同步域的后面,作用时标明包的类型和格式,并作为包的检测手段的一种;
- 由于同步域是由硬件来处理的,所有USB软件机制最先收到并处理的是标识域;
- USB主机和设备都要首先对收到的标识域进行解码,如果出现错误或是该标识域指明的类型或方向不被支持,那么这个包就会被忽略;
- 标识域有4位标识符加上这四位的反码组成(由此知道USB可以定义的包的类型总共有16种);
3、地址域ADDR
- 存放设备在主机上的地址,具有唯一性,并且地址由主机分配
- 地址域由7位二进制位组成
- 明显,最大地址容量为128个,地址0000000命名为零地址,是任何一个设备第一次连接到主机时在主机配置、枚举前的缺省地址,因此也知道一个主机最多能连接127个设备的原因
4、端点域ENDP(也叫端点号)
- 从硬件的角度,端点其实就是一系列实际的物理数据缓冲区;
- 发送和接收的数据都放在这里;
- 每一种传输方式都有特定的端点;
- 端点一般都由USB接口芯片来提供;
- 端点域由四位二进制数组成,所有每个USB设备可以有16个端点,但是有特殊的情况,如低速设备只能有0和1两个端点;
- 除了0端点,其他端点都能定义为输入端点或输出端点,因此全速设备可以定义16+16=32个端点;
- 很多USB接口芯片已经确定了端点的数量和属性
5、帧号域
- USB协议中,1帧即是1ms;
- USB总线上,一帧是一个独立的单元,包含了一系列的总线动作;
- USB将1帧分为好几份,每一份是USB的一个传输动作;
- 帧号域由11位二进制数组成,所以帧号的最大值为0x7FF,到这个数后,下一个是回到0
6、数据域
- 数据长度为0-1023字节;
- 对于不同传输类型中,数据域的长度各不相同;
- 必须为整数个字节的数据;
7、校验域(循环冗余检验域)
- 用来对令牌包和数据包中的PID域进行校验的一种方法;
- 对于令牌包,USB采用5位的CRC校验法;
- 对于数据包,USB采用16位的CRC校验法;
三、包
数据包:USB 总线上数据传输的最小单位,包括SYNC、数据及EOP 三个部分。其中数据的格式针对不同的包有不同的格式。但都以8 位的PID 开始。PID 指定了数据包的类型(共16 种)。令牌包即指PID 为IN/OUT/SETUP 的包。
令牌包:指定数据包去向或者来源的设备地址和端点(Endpoint),从而保证了只有一个设备对被广播的数据包/令牌包作出响应。
握手包:表示了传输的成功与否。
四、四种传输类型
1、事务
在介绍USB传输类型之前,请允许我先简答介绍一下USB事务。
事务一般由令牌包、数据包(可选)、握手包组成。
- 令牌包:用来启动一个事务,总是由主机发送。
- 数据包:可以从主机到设备,也可以由设备到主机,方向由令牌包决定。
- 握手包:通常情况,数据的接收者发送握手包(ACK或者NAK)。
USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。下面简答介绍一下这四种传输类型及其注意事项。
2、控制传输
2.1. 控制传输分为三个过程:建立过程、数据过程(可选)、状态过程。
建立过程:
a. 主机发送令牌包:SETUP
b. 主机发送数据包:DATA0(8个字节,有确定的结构)
c. 设备返回握手包:ACK或不应答,注意:设备不能返回NAK或STALL,即设备必须接收建立事务的数据。
数据过程(可选):
一个数据过程可以包含多个数据事务,但所有数据事务必须是同一方向的。若数据方向发生了改变,则认为进入状态过程。数据过程的第一个数据包必须为DATA1,然后每次正确传输一个数据包后就在DATA0和DATA1之间交替。
状态过程:
状态过程只使用DATA1包,并且传输方向与数据过程相反。
2.2. 控制传输的应用场合:主要应用于设备的枚举过程和对数据准确性要求较高的场合。
3、同步传输
- 同步传输的应用场合:主要用在数据量大,对实时性要求较高的场合。如视频设备、音频设备等。
4、批量传输
- 批量传输使用批量传输事务,一次批量传输事务分为三个阶段:令牌包阶段、数据我阶段、握手包阶段。
- 批量传输分为批量读和批量写,批量读使用批量输入事务,批量写使用批量输出事务。注意:不论输入还是输出都是以主机为参考的。
- 批量传输的应用场合:主要用在数据量大、对数据实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等等。
批量输出流程:
1) 主机发送OUT令牌包。
说明:令牌包中包含设备地址、端点号。
2) 设备处理令牌包。
- 令牌包正确:设备等待接收数据包。
- 令牌包错误:设备既不接收、处理数据包,也不返回握手包,让主机等待超时。
注:令牌包的正确与否包括设备地址和端点号是否匹配。
3) 主机发送数据包,然后切换到接收模式,等待接收设备返回的握手包。
说明:数据包中包含一个DATA(具体是什么类型的DATA,取决于数据切换位)。
4) 设备处理数据包。
- 数据包正确,并有足够的空间保存数据:设备返回ACK握手包或NYET握手包(只有告诉模式才有NYET握手包,它表示本次数据接收成功,但是没有能力接收下一次传输)。
- 数据包正确,但是没有足够的空间保存数据:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输出事务。
- 数据包正确,但端点处于挂起状态:设备返回一个STALL握手包。
- 数据包错误:设备不返回任何握手包,让主机等待超时。
批量输入流程:
1) 主机发送IN令牌包,然后切换到接收数据状态,等待设备返回数据。
说明:令牌包中包含设备地址、端点号。
2) 设备处理令牌包。
- 令牌包正确,且有数据需要返回:设备将一个数据包放到总线上。
- 令牌包正确,但没有数据需要返回:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输入事务。
- 令牌包正确,但端点处于挂起状态:设备返回一个STALL握手包。
- 令牌包错误:设备不做任何响应,让主机等待超时。
3) 主机接收并处理数据包。
- 数据包正确:主机发送一个ACK握手包。
- 数据包错误:主机不做任何响应,让设备等待超时。
注:USB协议规定,不允许主机使用NAK握手包来拒绝接收数据包。
PING事务:
- PING事务只有令牌包和握手包。
- PING事务是USB2.0高速模式特有的,全速模式和低速模式没有。
- PING事务作用:主机探测设备是否有空间接收数据
5、中断传输
- 中断传输是一种保证查询频率的传输。
- 中断端点在端点描述符中报告它的查询间隔,主机会保证在不小于这个时间间隔的范围内安排一次传输。
- 中断传输可以用来不断检测某个状态,当条件满足后,再使用批量传输来传送大量的数据。
- 中断传输和批量传输的结构基本上一样(除了对端点查询策略)。
- 中断传输的应用场合:主要用在数据量小,但对时间要求严格的场合。如人机接口设备(HID)中的鼠标、键盘、轨迹球。
五、数据流模型
1.端点
- 实际上就是设备硬件上具有一定大小的数据缓冲区;
- 每个端点具有唯一的地址;
- 主机通过端点和设备进行通信;
- 分类:IN事务端点、OUT事务端点、SETUP事务端点;
- 除了端点0,其他端点必须在设备被主机配置后才可以使用;
2.管道
- 包括数据流管道(没有定义好的数据格式)和消息管道(有定义好的数据格式);
- 与端点0的特殊性相配合---控制管道,通过该管道,主机可以获取描述USB设备的完整信息
- 管道一般只有在设计PC端的驱动程序和用户程序的编写时需要涉及;
3.数据传输过程