一、概述
USB总线的数据流是USB主机和USB设备数据通信的基础。一般来说,一个完整的USB数据流包含3个阶段——令牌阶段、数据阶段、握手阶段。
- 令牌阶段:定义了传输类型,表征数据流的开始。
- 数据阶段:包含了本次传输的数据。数据量大小根据端点和传输类型而定,最大为1024Byte。
- 握手阶段:用于数据的接收方报告此次数据传输是否成功。
二、字段
在USB协议中,USB数据传输数据流是由一系列字段构成的。字段是USB数据流中的最小组成单元。字段有以下几种:
- 同步字段(SYNC):用于数据同步;
- 包标记字段(PID):指明信息包的类型,可以用于差错控制。
- 地址字段(ADDR):指明USB总线上的一个设备。
- 端点字段(ENDP):指明当前通信使用的USB端点。
- 帧号字段(NUM):指明当前帧的帧号。
- 数据字段(DATA):传输的数据。
- 校验字段(CRC):用于循环冗余校验。
1. 同步字段SYNC
由于USB Host和USB Device之间是两条串行信号线,没有同步时钟,因此容易造成数据错位,导致数据不同步。为此,在USB协议中使用同步字段进行所有信息包的同步。
- 低速/全速同步字段:同步字段长度为8bit,数据为80H。在数据总线上先发送低位,在发送高位,并采用NRZI编码形式,如图所示。
- 高速同步字段:同步字段长度为32bit,数据为80000000H,发送方式与低速/全速同步字段类似。
2. 包标识字段PID:
详情可查看:https://blog.csdn.net/haihui1996/article/details/104889037
包标识字段(PID)长度为8bit,由低4bit的类型字段和高4bit的校验字段组成。校验字段是类型字段的补码。
PID字段有如下4中类型信息包:
- 令牌包:PID[1:0] = 01B;
- 握手包:PID[1:0] = 10B;
- 数据包:PID[1:0] = 11B;
- 特殊包:PID[1:0] = 00B。
3. 地址字段:ADDR
地址字段的长度为7bit,共有128个地址值。其中0号地址是作为默认地址,用于USB上电时主机和设备的通信。当USB上电配置完成后,USB主机便重新为该USB设备分配一个USB地址(地址1到127)。因此USB主机最多只能有127个设备。
4. 端点字段:ENDP
端点字段的长度为4bit,共可以表示16个端点,但低于低速USB设备来说,协议只规定了3个端点,而对于高速/全速设备,则可以使用全部16个端点。这些设备中,端点0用于初期的配置,是USB设备必须的。
5. 帧号字段:NUM
帧号字段长度为11bit,最大值为07FFH。帧号字段中的值表示了当前帧或小帧的帧号,一般来说,每个帧或小帧发送时,帧号字段里的内容加1。
6. 数据字段:DATA
数据字段的最大长度为1024Byte,在数据传输时先传输低字节,每个字节先传输低位,实际数据字段的长度根据传输类型和程序的需要决定。
7. 校验字段:CRC
采用的是循环冗余校验,用于保证传输的可靠性。令牌包采用5bit的CRC,数据包采用16bit的CRC。
上图为一段USB设备上电的通信实例,是主机与设备建立连接的第一步:
- Host发送起始信号帧SOF,表示数据传输开始。
- 发送SETUP令牌包,表示USB Host开始配置Device,该令牌包使用默认地址(ADDR)0以及端点(ENDP)0,CRC长度为5bit;
- 发送数据包,DATA0为PID字段,用于标识数据编号,Data字段包含通信数据内容,最后为16bit的CRC校验码。
- Device接收到数据之后,向Host反馈ACK应答数据包。