usb包的结构和分类

USB的传输:总是低位在前,高位在后。

USB的传输方向:从设备到主机的数据为输入;从主机到设备的数据叫做输出。

1.

包结构

以同步域开始,紧跟着一个包标识符PID(Packet Identifier),最终以包结束符EOP(End of Packet)结束这个包。(同步域+包标识符PID+包结束符EOP)

同步域

1. 作用:① 通知USB串行接口引擎数据要开始传输;② 同步主机和设备之间的时钟。

2. 格式:① 全速/低速设备的同步域为00000001;② 高速设备的同步域为31个0,后面跟1个1;注意:这是对发送端的要求,接收端在解码时,0的个数可以少于这个数。

包标识符PID

1. 包标识符PID是用来标识一个包的类型。

2. PID共有8位,目前USB协议仅使用4位(PID0~PID3),另外4位(PID4~PID7)是PID0~PID3的取反,用来校验PID。传输的顺序为PID0,PID1,PID2,PID3,...,PID7。

包结束符EOP

1. 全速/高速模式的EOP是一个约为2个数据宽度的SE0;

2. 高速模式的EOP是通过故意的位填充错误实现的。

3. 单端0(SE0):D+和D-同时保持低电平。

4. 单端0的用处:① 包结束;② 复位信号(USB集线器对USB设备的复位操作,就是将总线设置为SE0约10ms)。

5. Q: 如何一个位填充错误是EOP还是传输错误?A: 通过CRC校验,即如果CRC正确,则说明这个位填充是EOP;否则说明传输错误

2.

包分类

根据包标识符PID的不同,包可以分为四种包:

令牌包(token packet, PID1~0为01)

数据包(data packet, PID1~0为11)

握手包(handshake packet, PID1~0为10)

特殊包(special packet, PID1~0为00)

令牌包

令牌包用来启动一次USB传输。由于USB是主从结构的拓扑结构,所以所有的数据传输都是主机发起的(唯一的例外是支持远程唤醒的设备能够主动改变总线的状态,让集线器感知到设备的唤醒信号,但是这一过程并不发送数据,只是改变总线的状态)。

令牌包分4种:输出(OUT)、输入(IN)、建立(SETUP)、帧起始(SOF)。

输出令牌包:主机将要向设备发送一个数据包。

输入令牌包:主机将要从设备读取一个数据包。

建立令牌包:与输出令牌包几乎相同,不同之处是建立令牌包只使用DATA0,并且发送到设备的控制端点,设备必须接收建立令牌包。

帧起始令牌包:在每帧(或微帧)开始时发送,并且以广播的形式发送,使得总线上的所有USB全速/高速设备都可以接收到SOF令牌包。

OUT、IN、SETUP令牌包结构图

同步域

8位标识符PID

7位地址

4位端点号

5位CRC5校验

EOP

 SOF令牌包结构图

同步域

8位标识符PID

11位帧号

5位CRC5校验

EOP

 

数据包

同步域 8位标识符 PID 字节0 字节1… 字节n 16位CRC16校验 EOP

             

数据包类型不匹配主要发生在握手包

握手包

同步域 8位标识符PID EOP

     

1. ACK:正确接收数据,并且有足够的空间容纳数据。主机和设备都可以使用ACK来确认,而NAK、STALL、NYET只有设备才能够返回,主机不能使用这些握手包。

2. NAK:① 没有数据需要返回;② 数据接收正确,但是没有足够的空间容纳数据。

3. STALL:设备无法执行这个请求或者设备已挂起。设备返回STALL,需要主机干预才能解除这种STALL状态。

4. NYET:只在USB2.0高速设备输出设备中使用,表示设备本次数据成功接收,但是没有足够的空间来接收下一次的数据。主机在下一次输出数据前,将使用PING令牌包来探测设备是否有足够的空间接收数据,以免浪费不必要的带宽和时间。

usb的transaction,包括一个Token包、一个Data包和一个Handshake包。

Token、Data和Handshake都属于四种PID类型中的。

1. Token包只包括SYNC、PID、地址域、CRC,并没有DATA字段,它的名字起的很形象,就是用来标记所在transaction里接下来动作的。

2. Out和Setup Token包,里面的地址域指明了接下来要接收Data包的端点,

3. In Token包,地址域指明了接下来哪个端点要发送Data包。

只有主机才有权利发送Token包,协议里就这么规定的

与Token包相比,Data包里没了地址域,多了Data字段,这个Data字段对于低速设备最大为8字节,对于全速设备最大为1023字节,对于高速设备最大为1024字节。,它就是躲在Token后边儿用来传输数据的。

Handshake包的成分,除了SYNC,它就只包含了一个PID,通过PID取不同的值来报告一个transaction的状态,比如数据已经成功接收了等。

猜你喜欢

转载自blog.csdn.net/sinat_37817094/article/details/84479833