USB 的数据信号线是差分 驱动,在数据传输过程中分别有差分态 (1,0) 、静止态 (1,0) 和单终端 0(SE0) 等状态。协议根据这些状态判断设备的速率、信号所代表的数据意义等目 的。
数据按照包 (Packet) 的格式传输。 Packet = Sync 包 + 数据(PID, 数据字段 ,CRC) + EOP(End of Packet, 由 SE0 和 J 信号组成 ) 。传输顺序为 : 先 LSB 后 MSB.
除了 D+ 和 D- 数据线的空闲状态和 EOP 外, USB 中的数据采用反向不归零 (NRZI=None-Return to Zero Inverted) 的编码方式,并对 D+ 和 D- 所处的不同数据状态定义成 'J’ 和 'K' 两种状态。
NRZI 的编码规则如下 :
u 当有多个“ 0 ”的信息时,信号的每一位时间按方波变换。
u 当有多个“ 1 ”的信息时,信号的每一位时间状态不变。
u 当有从“ 1 ”到“ 0 ”的信息时,信号的状态要求变换。
u 当有从“ 0 ”到“ 1 ”的信息时,信号的状态要求不变。
The SYNC pattern used for low-/full-speed transmission is required to be 3 KJ pairs followed by 2 K’s for a total of eight symbols. Figure 7-35 shows the NRZI bit pattern, which is prefixed to each low-/full-speed packet. (低速 / 全速 的 Sync 包 =3K&J 对 + 2 个 K , 共 8symbols )
The SYNC pattern used for high-speed transmission is required to be 15 KJ pairs followed by 2 K’s, for a total of 32 symbols. (高速的 Sync 包 =15 个 K&J 对 + 2 个 K , 共 32symbols ,但通过 HUB 转发时可以 Drop 至多 4Bits ,这样的话,通过 5 级 Hub 转发后, Sync 包可能等于 12Bits )
由于采用 NRZI 编码,对于一串 1 来说,数据线的电平状态长时间不会跳变,可能会 导致数据接收方的时间同步漂移。因此协议要求每遇到 6 个 1 就在 NRZI 编码之前添加一个 0 ,称为位填充 (Bit Stuffing). Sync Pattern 的最后一位“ 1 ”计作连续 6 个 1 序列的第一位。