通常的一个USB包主要 包括以下几种包字段:包标示符字段(PID)、地址字段(包括地址字段和端口字段)、帧号字段(Frame Number)、数据字段(Data)和循环冗余校验(CRC)。
一、令牌包(Token)
令牌包由PID、ADDR、ENDP和CRC构成,其中PID指定了包是输入输出还是建立类型,对于输出和建立事务地址和端口字段唯一地确定了接下来将收到数据包的端口,对于输入事务的这些字段唯一地确定了哪个端口应该传送数据包。只有主机能发出令牌包,输入PID定义了从功能部件到主机的数据事务,输出和建立PID定义了从主机到功能部件的数据事务。
令牌包格式
如上图所示,令牌包包括了覆盖地址和端口字段的5位CRC。CRC并不覆盖PID,因为它有自己的校验字段。令牌包和帧开始(SOF)包是由3个字节的包字段数据后面的包结束(EOP,End of Packet)界定的。如果包被译码为合法令牌或SOF,但却没有在3个字节之后以EOP终止则它被认为是无效的,并被接收器忽略。
二、帧开始包(SOF)
对于全速总线主机以每1.00 ms ±0.0005 ms一次的额定速率发出帧开始SOF包,对于高速总线主机以每125 μs ±0.0625 μs一次的额定速率发出帧开始SOF包。SOF包由8位PID、11位FrameNuber已经5位CRC构成。
帧开始(SOF)格式
SOF标记组成了仅有标记的(token-only)事务,它以相对于每帧的开始精确计算的时间间隔发送SOF记号Marker和伴随的帧数。包括集线器的所有全速功能部件都可收到SOF包。SOF标记不会使得接收功能部件产生返回包;因此不能保证向任何给定的功能部件发送的SOF都能被收到。SOF包发送2个时间调配Timing信息,当功能部件探测到SOF的PID的时候,它被告知发生SOF。对帧时间敏感而不需要追踪帧数例如集线器的功能部件,仅需对SOF的PID译码;可忽略帧数和其CRC。如果功能部件需要追踪帧数,它必须对PID和时间戳都进行译码。对总线时间调配信息的没有特别需要的全速设备可以忽略SOF包。
三、数据包
数据包由PID、包括至少0个字节数据的数据区和CRC构成。有4种类型的数据包,根据不同的PID:DATA0、DATA1、DATA2和MDATA来识别。DATA0和DATA1两种数据PID是为了支持数据切换同步(Data Toggle Synchronization)而定义的;在同步高速传输中,四种数据PID格式都会被用到;对于分离传输只会用到DATA0、DATA1和MDATA三种数据格式。
数据包格式
对于低速设备,数据区最大可以承载8字节;对于全速设备,数据区最大可以承载1023字节;对于高速设备,数据区最大可以承载1024字节;
四、握手包
握手包仅由PID构成,握手包用来报告数据事务的状态,还能用来表示数据成功接收、命令的接收或拒绝、流控制(Flow Control)和停止(Halt)条件。只有支持流控制的事务类型才能返回握手信号。握手总是在事务的握手时相(Phase)中被返回,也可在数据时相中代替数据被返回,握手包由1个字节的包字段后的EOP确定界限。如果包被解读为合法的的握手信号,但没有以1个字节后面的EOP终止,则它被认为是无效的,且被接收机忽略。
握手包格式:
有3种类型的握手包:
- ACK:表示数据包没有位填充或数据字段上的CRC错,并且数据PID被正确收到。ACK在下列的情况下被发放,当时序位(Sequence Bit)匹配且接收器能接受数据的时候,或者当时序位失配,但发送方和接收器互相之间必须再同步(Resynchronize)的时候。ACK握手信号只适用于数据被传送且期待握手信号的事务中。对于输入事务,ACK由主机返回,而对于输出或建立事务则由功能部件返回。
- NAK:表示功能部件不会从主机接受数据(对于输出事务),或者功能部件没有传输数据到主机(对于输入事务)。NAK仅由功能部件在输入事务的数据时相返回,或在输出事务的握手时相返回。主机决不能发出NAK。出于流控制的目的,NAK用于表示功能部件暂时不能传输,或者接收数据,但是最终还是能够在不需主机干涉的情况下而传输或接收数据。
- STALL:作为输入标记的回应,或者在输出事务的数据时相之后由功能部件返回。STALL表示功能部件不能传输,或者接收数据,或者不支持一个控制管道请求。在任何条件下都不允许主机返回STALL。