USB 数据流(令牌、数据、握手)
USB总线上传递的数据流是USB主机和USB设备通讯的基础。
USB数据流包括3个阶段:
- 令牌阶段 :定义了本次传输的类型,表示一次传输的开始。令牌阶段由同步字段,令牌包和EOP组成。
- 数据阶段 :包括了本次传输的数据。数据的大小根据端点大小和传输类型决定,一般最大的数据量为1024字节。数据阶段由同步字段,令牌包和EOP组成。
- 握手阶段: 握手阶段用于发送本次数据传输是否成功的报告,由接收方发送。握手阶段由同步字段,握手包和EOP组成。
从以上可以看到,各个阶段都有帧头同步字段和帧尾EOP,是数据传输的起始和结束,而中间传输的的有效USB数据。
同步字段:
- 对于低速和全速来说,同步字段长为8位,数据为0x80。
- 对于高速来说,同步字段为32位,数据为0x80000000.
包标识PID
包标识PID由8位组成,低4位是类型字段,高4位为低四位的补码。
PID | 含义 | 说明 |
---|---|---|
0001 | 令牌OUT | 主机发送数据到USB设备 |
1001 | 令牌IN | 主机接收从USB设备发出的数据 |
0101 | 令牌SOF | 此时作为一个帧或者小帧的开始信息 |
1101 | 令牌SETUP | 主机向USB设备发送配置信息 |
0010 | 握手ACK | 数据正确接收 |
1010 | 握手NAK | 数据未正确接收 |
1110 | 握手STALL | 使用的端点被挂起 |
0110 | 握手NYET | 接收方没有响应 |
0011 | 数据DATA0 | 数据包偶数包 |
1011 | 数据DATA1 | 数据为奇数据包 |
0111 | 数据DATA2 | 此为作为一个高速同步事务的专用数据包 |
1111 | MDATA | 此时作为一个SPLIT事务的专用数据包。 |
令牌包
USB协议定义了8种令牌包,分别为:
IN令牌包
IN令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。
- 包标识字段PID:定义了数据传输方向为USB设备到USB主机。
- ADDR字段:指明了USB设备地址。
- ENDP字段:指明了发送数据的端点号。
- CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。
OUT令牌包
OUT令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。
- 包标识字段PID:定义了数据传输方向为USB主机到USB设备。
- ADDR字段:指明了USB设备地址。
- ENDP字段:指明了接收数据的端点号。
- CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。
SETUP令牌包
SETUP令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。
- 包标识字段PID:定义了数据传输方向为USB主机到USB设备。
- ADDR字段:指明了USB设备地址。
- ENDP字段:指明了接收数据的端点号。
- CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。
PING令牌包
PING令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。
- 包标识字段PID:定义了USB设备到USB主机的握手信号传输。
- ADDR字段:指明了USB设备地址。
- ENDP字段:指明了发送握手包的端点号。
- CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。
SOF令牌包
SOF令牌包包格式由8位的包标识字段PID,11位的帧号字段和5位的循环字段CRC共24位3字节组成。
- 包标识字段PID:定义了数据传输方向为USB主机到USB设备。
- 帧号字段:指明了USB传输的帧号,其11位。
- CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。
SSPLIT令牌包
在USB规范中,为了提高数据传输效率,可以使用SSPLIT令牌包在USB主机与USB集线器之间使用高速数所传输的同时,同时进行低速或全速的数据传输。
SSPLIT令牌包包括开始SPLIT(SSPLIT)令牌包结速SPLIT(CSPLIT令牌包).
启动令牌包SSPLIT由8位的包标识字段PID,7位的地址字段ADDR,1位的SC字段,7位的PORT字段、1位的 S字段、1位的E字段、2位的ET字段和5位的循环校验字段CRC.
- 包标识字段PID:定义了数据传输方向为USB主机到USB集线器。
- ADDR字段:指明了USB设备地址。
- PORT字段:用于指明USB集线器的端口号。该字段最多指定128个集线器端口。
- S字段:在中断传输和控制情况下,如果S=0表示全速传输,如果为S=1表示低速传输。在块传输和同步传输下,S必须为0.对于同步OUT传输,按下表进行选择
S | E | 说明 |
---|---|---|
0 | 0 | 全速数据负载的中间数据是高速数据 |
0 | 1 | 全速数据负载的尾部数据是高速数据 |
1 | 0 | 全速数据负载的首部数据是高速数据 |
1 | 1 | 全速数据负载的全部数据是高速数据 |
- ET字段:用于指明在高速数据传输中,使用低速、全速数据传输的类型 。
ET=00 | ET=01 | EG=10 | ET=11 |
---|---|---|---|
控制传输 | 同步传输 | 块传输 | 中断传输 |
CSPLIT令牌包
结束令牌包CSPLIT的定义格式包含8位的包标识字段PID、7位的地址ADDR、1位的SC字段、7位的PORT字段、1位的S字段、1位的U字段、2位的ET字段和5位的循环校验字段CRC.
- PID字段:定义了数据传输方向为USB主机到USB集线器。
- ADDR字段:指明了USB集线器的设备地址。
- SC字段:该字段固定为“1”, 用于表示结束SPLIT令牌包。
- PORT字段:用于指明USB集线器的端口号。该字段最多可以指定128个USB集线器端口。
- S字段, 含义和S SPLIT令牌包中类似。
- U字段:其值必须为“0”,保留。
- ET字段:用于指明在高速数据传输中,使用的低速/全速数据传输的类型。
当置ET=00时,表示采用控制传输;
当置ET=01时,表示采用同步传输;
当置ET=10时,表示采用块传输:
当置ET=11时,表示采用中断传输。
PRE令牌包
PRE数据包吸一个8位的PID字段,是低速数据的先导包。在低速数据传输前,必须先发先导包PRE,这样USB集线器才会激活相应的低速数据传输端口。
数据包
数据包是用于传输数据的,由8位的包标识PID,数据字段和16位的循环冗余校验字段CRC组成。
- PID字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATAO 、 DATAI 、DATA2 和MDATA。 在介绍的数据触发机制中,使用 DATA0 和 DATA1。而前而的 SPLIT 令牌事务处理则使用DATA0,DATA1和MDATA。对于高速 USB 同步数据传输,一般需要使用全部。
- 数据字段:其中包含了传输的数据。其数据的大小根据数据传输类吧和川户需要而定。根据 USB 协议的规定,对于低速 USB 数据传输, 最大长度为8字节对于全速SB 数据传输,其最大长度为 1023 字节;对于高速 USB 数据传输,数据最大长度为 1024 。
- CR 字段:这里使用 16 位的循环冗余校验来对数据字段进行保护。
握手包
握手包由8位的PID构成,用于数据传输的末位报告本次数据传输的状成。握手包之后使是整个事务处理的结束信号EOP.
USB规范定义了以下几个响应:
1 . ACK 握手包
当 USB 数据传输的接收方正确接收到数据包时,接收方将返回 ACK 握手包。 ACK 握手包表征了一次正确的数据传输,之后才可以进行下一次事务处理。
2 . NAK 握手包
NAK 握手包一般由 USB 功能设备发出。对于困数据传输,表示 USB 设备没有计划向 USB 主机发送数据;对于 OUT 数据传输,表示 USB 设备无法接收 USB 主机发送的数据。
3 . STALL 握手包
STALL 握手包一般由 USB 功能设备发送,表示该 USB 功能设备不支持这个请求,或者无法发送和接收数据。 STALL 握手包分为以下两种情况。。协议 STA LL 握手包:在控制传输中使用。协议 STALL 握手包表明了该 USB 功能设备不支持这个请求协议。。功能 STALL 握手包:表明该 USB 功能设备的相应端点已经停止,而无法完成发送数据或者接收数据的操作。
4 . NYET 握手包
在 SPLIT 令牌包事务处理中,如果 USB 集线器无法正常处理 SPLIT 请求,则 USB 集线器向 USB 主机返回 NYET 握手包。 NYET 握手包一般只发生在高速数据传输过程中。
5 . ERR 握手包
ERR 握手包用于表示总线数据传输发生错误,其一般发生在高速数据传输过程中。