USB2.0包Packet的组成
USB包由SOP,SYNC,Packet内容和EOP组成.
SOP起始包
起始包SOP(Start Of Packet),通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知分组的开始(SOP)。 此开关级别表示SYNC字段的第一位。 当重新传输到小于±5 ns时,集线器必须限制SOP第一位宽度的变化。 通过将通过集线器的标称数据延迟与集线器的输出使能延迟相匹配,可以最小化失真。
SYNC同步域
同步域(SYNC),这个域固定为 0000 0001,这个域通过 NRZI 编码之后,就是一串方波(NRZI 遇 0 翻转遇 1 不变),接受者可以用这个 SYNC 域来同步之后的数据信号。
因为在 USB 的 NRZI 编码下,逻辑 0 会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是 1000 个逻辑 1,经过 USB的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个1 了。
USB 对这个问题的解决办法,就是强制插 0,也就是传说中的 bit-stuffing,如果要传输的数据中有 7 个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了.
EOP 结束包(End of Packet)
全速或低速设备的结束包:SE0状态用于发信号通知分组结束(EOP)。 通过将D +和D-驱动到SE0状态两位时间,然后将线路驱动到J状态一位时间来发信号通知EOP。 从SE0到J状态的转换定义了接收器处的分组的结束。 J状态被置位一个位时间,然后D +和D-输出驱动器都处于高阻态。 总线终端电阻将总线保持在空闲状态。
SE0的意思是D+和D-都表示为低电平。
高速设备的EOP:在高速信号中,以从EOP之前的最后一个符号到相反符号的转换开始。这个相反的符号是EOP模式中的第一个符号对于SOF以外的高速数据包。故意生成位填充错误以指示EOP。需要接收器将任何位错误解释为EOP。发送的EOP定界符必须是没有位填充的NRZ字节01111111。例如,如果EOP字段之前的最后一个符号是J,则这将导致EOP为KKKKKKKK。对于高速SOF,传输的EOP分隔符需要5个NRZ字节而不需要填充比特,由01111111 11111111 11111111 11111111 11111111组成。因此,如果EOP字段之前的最后一位是J,这将导致线路上有40个K状态,线路必须返回到高速空闲状态。额外的EOP长度对接收器没有意义,它用于断开检测。
Packet内容
包内容属于协议层,包括的内容大概为PID(包ID),地址,帧号,数据和CRC校验。
PID:
根据PID的内容,包可分为四大类:
Packet分四大类:
- 命令 (Token) Packet
- 帧首 (Start of Frame) Packet
- 数据 (Data) Packet
- 握手 (Handshake) Packet
地址:
地址包括设备地址和端点地址。其中设备地址占1字节,端点地址占4位。
帧号:
- 总共11位。主机每发出一个帧
- 帧号都会自加1
- 当帧号达到7FFH时,将归零重新开始计数
- 仅在每个帧的帧首传输一次SOF包
数据域
为USB传输的数据。对于不同的USB传输类型,数据域的数据长度从0到1024字节不等。
CRC校验域:
CRC校验域分为令牌校验域和数据校验域
令牌Token CRC校验域
计算地址域和帧号域的CRC:G(X) = X5 + X2 + 1Data CRC
计算数据域数据的CRC: G(X) = X16 + X15 + X2 + 1