1.网络上一个比较具体的解说
首要,USB 的数据是串行发送的,就像 UART、I2C、SPI 等等,接连的01 信号只通过一根数据线发给接受者。
可是由于发送者和接纳者运转的频率不相同,信号的同步便是个问题,比方,接受者接纳到了一个继续
一段时间的低电平,无法得知这究竟是代表了5个0 仍是1000个0。
一个处理办法,便是在传输数据信号的一起,附加一个时钟信号,用来同步两头的传输,接受者在时钟
信号的辅佐下对数据信号采样,就能够正确解析出发送的数据了,比方 I2C 便是这样做的,SDA 来传
输数据,SCL 来传输同步时钟:
尽管这样处理了问题,可是却需求附加一根时钟信号线来传输时钟。有没有不需求附加的时钟信号,也
能坚持两头的同步呢?
有的,这便是 RZ 编码(Return-to-zero Code),也叫做归零编码。
在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电
平,也便是说,信号线上会呈现 3 种电平:正电平、负电平、零电平:
从图上就能够看出来,由于每位传输之后都要归零,所以接纳者只需在信号归零后采样即可,这样就不
在需求独自的时钟信号。实际上, RZ 编码便是相当于把时钟信号用归零编码在了数据之内。这样的信
号也叫做自同步(self-clocking)信号。
这样尽管省了时钟数据线,可是仍是有缺点的,由于在 RZ 编码中,大部分的数据带宽,都用来传
输“归零”而糟蹋掉了。
那么,咱们去掉这个归零过程,NRZ 编码(Non-return-to-zero Code)就呈现了,和 RZ 的差异便是
NRZ 是不需求归零的:
这样,糟蹋的带宽又回来了,不过又损失名贵的自同步特性了,形似咱们又回到了原点,其实这个问题
也是能够处理的,不过待会儿再讲,先看看什么是 NRZI:
NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ 的差异便是 NRZI 用信号的翻转代表一个
逻辑,信号坚持不变代表别的一个逻辑。
USB 传输的编码便是 NRZI 格局,在 USB 中,电平翻转代表逻辑 0,电平不变代表逻辑1:
翻转的信号自身能够作为一种告诉机制,并且能够看到,即便把 NRZI 的波形彻底翻转,所代表的数据
序列仍是相同的,关于像 USB 这种通过差分线来传输的信号特别便利~
现在再回到那个同步问题:
确实,NRZ 和 NRZI 都没有自同步特性,可是能够用一些特别的技巧处理。
比方,先发送一个同步头,内容是 0101010 的方波,让接受者通过这个同步头计算出发送者的频率,
然后再用这个频率来采样之后的数据信号,就能够了。
在 USB 中,每个 USB 数据包,最开端都有个同步域(SYNC),这个域固定为 0000 0001,这个域通
过 NRZI 编码之后,便是一串方波(温习下前面:NRZI 遇 0 翻转遇 1
此外,由于在 USB 的 NRZI 编码下,逻辑 0 会形成电平翻转,所以接纳者在接纳数据的一起,依据接
收到的翻转信号不断调整同步频率,确保数据传输正确。
可是,这样仍是会有一个问题,便是尽管接纳者能够自动和发送者的频率匹配,可是两者之间总会有差错。
假设数据信号是 1000个逻辑1,通过 USB 的 NRZI 编码之后,便是很长一段没有改变的电平,在这种
情况下,即便接受者的频率和发送者相差千分之一,就会形成把数据采样成 1001个或许 999个了。
USB对这个问题的处理办法,便是强制插0,也便是传说中的bit-stuffing,假如要传输的数据中有7个
接连的1,发送前就会在第6个1后边强制刺进一个0,让发送的信号强制呈现翻转,然后强制接受者进
行频率调整。接受者只需删去6个接连 1 之后的0,就能够康复原始的数据了。
2,来至ST的别的一个解说