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字节组成。
SOF令牌包

  • 包标识字段PID:定义了数据传输方向为USB主机到USB设备。
  • 帧号字段:指明了USB传输的帧号,其11位。
  • CRC字段:用于帧号字段进行循环冗余校验。

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组成。
数据包格式

  • PID字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATAO 、 DATAI 、DATA2 和MDATA。 在介绍的数据触发机制中,使用 DATA0 和 DATA1。
    • SPLIT 令牌事务处理则使用DATA0,DATA1和MDATA。
    • 对于高速 USB 同步数据传输,一般需要使用全部。
  • 数据字段:其中包含了传输的数据。其数据的大小根据数据传输类吧和用户需要而定。
    • 根据 USB 协议的规定,对于低速 USB 数据传输, 最大长度为8字节
    • 对于全速USB 数据传输,其最大长度为 1023 字节;
    • 对于高速 USB 数据传输,数据最大长度为 1024 。
  • CR 字段:这里使用 16 位的循环冗余校验来对数据字段进行保护。

握手包

握手包由8位的PID构成,用于数据传输的末位报告本次数据传输的状成。握手包之后使是整个事务处理的结束信号EOP.
握手包

USB规范定义了以下几个响应:

1 . ACK 握手包

当 USB 数据传输的接收方正确接收到数据包时,接收方将返回 ACK 握手包。 ACK 握手包表征了一次正确的数据传输,之后才可以进行下一次事务处理。

2 . NAK 握手包

NAK 握手包一般由 USB 功能设备发出。对于IN数据传输,表示 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 握手包用于表示总线数据传输发生错误,其一般发生在高速数据传输过程中。

1 篇笔记 写笔记

通过后续章节的抓包分析,可以更加详细的了解令牌,事务,数据DATA0,DATA1...之间的关系。

把握住几点:一软传输,可能包括多个事务,一个事务又可能是由令牌,数据和握手信号组成。


USB中文网 2021-06-26 01:13:02
USB2.0 数据包DATA0,DATA1,DATA2
数据包是用于传输数据的,由8位的包标识PID,数据字段和16位的循环冗余校验字段CRC组成。PID字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATAO 、 DATAI 、DATA2 和MDATA。 在介绍的数据触发机制中,使用 DATA0 和 DATA1。SPLIT 令牌事......
DirectShow数据流
本节介绍DirectShow的数据的工作方式进行介绍。通过滤器之间数据交互一节可知,数据是存在buffer中的。而每个buffer都由一个名为media sample的COM对象包装,该对象实现了IMediaSample接口。Sample由另一种类型的对象(称为分配器)创建的,它由IMemAlloc......
USB 数据流(令牌、数据、握手)
USB总线上传递的数据流是USB主机和USB设备通讯的基础。USB数据流包括3个阶段:令牌阶段 :定义了本次传输的类型,表示一次传输的开始。令牌阶段由同步字段,令牌包和EOP组成。数据阶段 :包括了本次传输的数据。数据的大小根据端点大小和传输类型决定,一般最大的数据量为1024字节。数据阶段由同......
USB2.0 SOF令牌
SOF令牌包是最广泛的令牌包,由主机发送。在实机的抓包工具过程,由于和NAK包大量存在,都会在软件配置中不显示。但这并不代表这个SOF令牌包不重要。SOF令牌不需要像其它令牌一样,具有握手包。因此发送给设备的SOF包并不能保证一定会收到。SOF数据流管理由USB主机发送一个SOF令牌包。SOF数据......
USB2.0 IN令牌
令牌IN用于主机接收从USB设备发出的数据,和OUT令牌的数据传输方向相反。IN令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。包标识字段PID:定义了数据传输方向为USB设备到USB主机。ADDR字段:指明了USB设备地址。......
USB2.0 OUT令牌
USB2.0 OUT令牌用于主机向设备发送数据,令牌后跟数据包,当数据发送完成后设备需返回ACK包。OUT令牌包格式OUT令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的段点字段和5位的循环字段CRC共24位3字节组成。包标识字段PID:定义了数据传输方向为USB主机到USB......
USB2.0 SETUP令牌
SETUP令牌包用于主机向USB设备发送配置信息SETUP令牌包结构SETUP令牌包格式由8位的包标识字段PID,7位的地址字段ADDR、4位的端点字段和5位的循环字段CRC共24位3字节组成。包标识字段PID:定义了数据传输方向为USB主机到USB设备。ADDR字段:指明了USB设备地址。E......
USB2.0 PING令牌
PING事务:PING事务只有令牌包和握手包。PING事务是USB2.0高速模式特有的,全速模式和低速模式没有。PING事务作用:主机探测设备是否有空间接收数据。PING令牌PIDPING令牌的PID低4位为0100,高4位的补码为1011,故PING令牌的PID为0xB4.PING流程:主机......
USB2.0包Packet的组成
USB包由SOP,SYNC,Packet内容和EOP组成.SOP起始包起始包SOP(Start Of Packet),通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知分组的开始(SOP)。 此开关级别表示SYNC字段的第一位。 当重新传输到小于±5 ns时,集线器......
USB2.0令牌包、起始包、数据包和握手包示例
从上节可知道,根据PID可将USB2.0的包分为四种包类型。令牌包Token PacketSOF起始包数据包握手包......
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

您的支持,是我们前进的动力!