微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > USB学习系列之四——USB包结构

USB学习系列之四——USB包结构

时间:12-14 来源:互联网 点击:
1.USB的数据传输以包为单位,一个包被分成不同的域。USB传输时使用的是LSB在前,MSB在后的方式。

2.不同的包所包含的域是不同的,但是都有共同的特点是:以同步域开始,紧跟着一个包标识符PID,最终以包结束符EOP结束这个包。

3.同步域:高速USB串行接口引擎数据传输要开始了,同时也提供同步时钟。对于低速设备和全速设备,同步域使用的是0000 0001(二进制数);对于高速设备使用的是00000000 00000000 00000000 00000001。

注意:这个是对发送端的要求,接收端解码时,0的个数可以少于这个数目。

4.包结束符:包结束符一共有8位,其中USB协议使用的只有4位(PID0~PID3),另外4位(PID4~PID7)是前四位的取反,用来校验PID。USB协议规定了四类包,分别是:令牌包(PID1~PID0为01)、数据包(PID1~PID0为11)、握手包(PID1~PID0为10)和特殊包(PID1~PID0为00)。以下为USB2.0协议的包,带*的为USB1.1协议没有的:

5.令牌包:令牌包用来启动一次USB传输。主机发送一个令牌来通知哪个设备进行响应,如何响应。

输入令牌包:用来通知设备将要输出一个数据包。

输出令牌包:用来通知设备返回一个数据包。

建立令牌包:只用在控制传输中,通知设备输出一个数据包,建立令牌包后只使用DATA0数据包,且只能发送到设备的控制端点,并且设备必须要接收,而输出令牌包没有这些限制。

帧起始包:在每帧开始时发送,以广播的形式发送。USB全速设备没毫秒产生一个帧,高速设备每125微秒产生一个帧。USB主机会对当前的帧号进行计数,在每次帧开始时通过SOF包发送帧号(或者微帧开始时,每毫秒有八个微帧,这8个微帧的帧号是一样的)。SOF中的帧号是11位。
注意:在4个令牌包中,只有SOF令牌包之后不能跟数据传输,其他的都有数据传输。每个令牌包之后都有一个CRC5的校验,它只校验PID之后的数据,不包括PID本身,因为PID本身的后4位已经有取反的校验机制了。

由于SOF令牌包之后不跟随数据传递,所以SOF令牌包和其他三种包的结构不同,具体如下图所示:

SOF令牌包结构

IN、OUT、SETUP令牌包结构图

6.数据包

USB1.1中只有DATA0和DATA1两种数据包。

USB2.0中增加了DATA2和MDATA两种数据包,这两种数据包主要用在高速分裂事物和高速高带宽同步传输中。

数据包的统一结构:同步域 + 8位包标志PID + 整数字节数据 + CRC16校验 + EOP。

之所以有不同类型的数据包,是用在握手包出错时纠错。具体解释如下:

主机和设备都会维护自己的一个数据包类型切换机制:当数据包成功发送或者接收时,数据包类型切换。当检测到对方所使用的数据包类型不对时,USB系统认为这发生了一个错误,并试图从错误中恢复。数据包类型不匹配主要发生在握手包被损坏的时候。当一端已经正确接收到数据并且返回确认信号后,确认信号在传输过程中被损坏。这时另一端就无法知道刚才发送的数据是否已经发送成功,这时只好继续保持自己的数据包类型不变。如果对方下一次使用的数据包类型跟自己的不一致,则说明它刚刚已经成功接收到数据包;如果对方下一次使用的数据包跟自己的一致,则说明对方没有切换数据包类型,也就是刚刚的数据包没有发送成功,这是上一次的重试操作。

7.握手包

握手包用来表示一个传输是否被对方确认。

握手包的结构:同步域 +包标识符PID + EOP。

握手包有ACK、NAK、STALL和NYET。

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

NAK:表示没有数据需要返回,或者数据正确接收但是没有足够的空间来容纳。当主机接收到NAK时,知道设备还没有准备好,主机会在以后合适的实际进行重试传输。

STALL:表示设备无法执行这个请求,或者端点已经被挂起,它表示一种错误的状态,设备返回STALL之后,需要主机进行干预才能解除这种STALL状态。

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

注意:NAK并不表示数据出错,当USB主机或者设备检测到数据出错时,将什么都不返回,这时等待接收握手包的一方就会收不到握手包从而等待超时。

8.特殊包

特殊包是在一些特殊场合使用的包。总共有四种:PRE、ERR、SPLIT和PING。其中PRE、SPLIT、PING是令牌包,ERR是握手包。ERR、SPLIT、PING三个是在USB2.0协议中增加的。

(1)PRE:通知集线器打开其低速端口的一种

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top