+ -

USB 数据流(令牌、数据、握手)

欢迎加入字节流官方QQ群:952873936或联系站长进行技术交流。

USB总线上传递的数据流是USB主机和USB设备通讯的基础。
USB数据流包括3个阶段:
1599986361659

  • 令牌阶段 :定义了本次传输的类型,表示一次传输的开始。令牌阶段由同步字段,令牌包和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字节组成。
IN令牌包

  • 包标识字段PID:定义了数据传输方向为USB设备到USB主机。
  • ADDR字段:指明了USB设备地址。
  • ENDP字段:指明了发送数据的端点号。
  • CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。

OUT令牌包

OUT令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。
OUT令牌包

  • 包标识字段PID:定义了数据传输方向为USB主机到USB设备。
  • ADDR字段:指明了USB设备地址。
  • ENDP字段:指明了接收数据的端点号。
  • CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。

SETUP令牌包

SETUP令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。
SETUP令牌包

  • 包标识字段PID:定义了数据传输方向为USB主机到USB设备。
  • ADDR字段:指明了USB设备地址。
  • ENDP字段:指明了接收数据的端点号。
  • CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。

PING令牌包

PING令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。
PING令牌包

  • 包标识字段PID:定义了USB设备到USB主机的握手信号传输。
  • ADDR字段:指明了USB设备地址。
  • ENDP字段:指明了发送握手包的端点号。
  • CRC字段:用于ADDR字段和ENDP字段进行循环冗余校验。

SOF令牌包

SOF令牌包包格式由8位的包标识字段PID,11位的帧号字段和5位的循环字段CRC共24位3字节组成。
1599988847220

  • 包标识字段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.
1599988721782

  • 包标识字段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.
CSPLIT令牌包

  • 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集线器才会激活相应的低速数据传输端口。
PRE令牌包


数据包

数据包是用于传输数据的,由8位的包标识PID,数据字段和16位的循环冗余校验字段CRC组成。
1599989508942

  • 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 握手包用于表示总线数据传输发生错误,其一般发生在高速数据传输过程中。

微信公众号
字节流公众号  字节流QQ群:952873936
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!