USB协议详解第19讲(USB包-包的组成及分类)
1.包的组成
下面这张图为包的组成结构,由SOP、SYNC、Packet Content、EOP四部分组成,其中Packet Content最为核心,Packet Content由PID、地址、帧号、数据、CRC组成。
1.SOP域(Start Of Packet)
通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知分组的开始(SOP)。 此开关级别表示SYNC字段的第一位。 当重新传输到小于±5 ns时,集线器必须限制SOP第一位宽度的变化。 通过将通过集线器的标称数据延迟与集线器的输出使能延迟相匹配,可以最小化失真。
2.SYNC(同步域)
SOP域之后就是同步域(SYNC)的开始,全速/低速设备SYNC被定义长度为8位(0000 0001),高速长度定义为32位(0000 0000 0000 0000 0000 0000 0000 0001)。 注意,这个长度是对发送端的要求。下图是一个全速/低速设备,经过NRZI编码后的波形。SYNC域中的最后两位是一个标记(电平未翻转,即受到数据1),用于标识SYNC域的结束和PID域的开始。
3.PID域(Packet Identifier Field)
数据包标识符(PID)域紧跟在同步域之后。 PID由4位类型字段和4位校验字段组成,如下图所示。类型字段主要是标识本包的类型,校验字段主要是对类型字段进行校验。为了确保接收端正确解码并识别包类型,发送端会对4位类型字段的每1位取补码赋值到4位校验字段里面,接收端也会进行校验操作,如果4位PID校验位不是它们各自的分组标识符位的补码,则存在PID错误。
4位类型字段标识的所有包类型如下:
4.地址域
使用两个字段来处理功能端点:设备地址字段和端点地址字段。 任一字段上的不匹配设备都必须忽略该令牌, 访问非初始化端点设备也必须忽略该令牌。
(1)设备地址字段
如下图,ADDR<6:0>总共可访问128个地址。
(2)端点地址字段
如下图, 低速设备每个功能最多支持三个管道,端点号为零的控制管道加上两个额外的管道(两个控制管道,一个控制管道和一个中断端点,或两个中断端点),全速和高速每个功能最多可支持16个IN和OUT端点。
(3)地址域总结
地址是由两个地址构成,设备地址+端点地址
5.帧号域
(1)帧和微帧
帧号域是11比特字段,其由主机在每帧的基础上递增。 帧号字段在达到其最大值7FFH时翻转,并且仅在每个帧(微)SOF令牌包发送并累加,说白了就是限时当前USB发了多少帧了。
USB全速设备1ms产生一个帧,而高速设备每125us产生一个微帧,启动后永不间歇,如下图,图中SOF包中Frame标识了当前帧号。大家可以看我的另一篇文章USB帧和微帧剖析。
(2)帧号域总结
6.数据域
(1)数据域格式
数据域的范围可以是0到1024字节,并且必须是整数个字节,下图显示了多个字节的格式,每个字节内的数据位首先从LSB移出。
(2)数据域总结
根据不同的传输类型,定义如下一次最大传输量。
7.CRC域(循环冗余校验)
(1)令牌CRC
为令牌提供五位CRC字段,并覆盖IN,SETUP和OUT令牌的ADDR和ENDP字段或SOF令牌的时间戳字段。 PING和SPLIT特殊令牌还包括一个五位CRC字段。
生成多项式为: G(X)= X^5 + X^2 + 1
(2)数据CRC
数据CRC是应用于数据分组的数据字段的16位多项式。
生成多项式是:G(X)= X^16 + X^15 + X^2 + 1
表示该多项式的二进制位模式是1000000000000101B,如果没有错误地接收到所有数据和CRC位,则16位校验和将为1000000000001101B。
(3)CRC域总结
8.EOP域(End Of Packet)
全速或低速设备的结束包:SE0状态用于发信号通知分组结束(EOP)。 通过将D +和D-驱动到SE0状态两位时间,然后将线路驱动到J状态一位时间来发信号通知EOP。 从SE0到J状态的转换定义了接收器处的分组的结束。 J状态被置位一个位时间,然后D +和D-输出驱动器都处于高阻态。 总线终端电阻将总线保持在空闲状态。
注:SE0的意思是D+和D-都表示为低电平。
2.包的分类
每种类型的包组成会有所不同,按照组成所有的包会被分成帧首包SOF(Start of Frame)、命令包(Token)、数据包(Data)、握手包(Handshake)四大类型。
4种PID类型和4种包类型(按照组成分类)的区别如下,大家注意区分。