1. 什么是NRZI?
NRZI的全称是Non-Return-to-Zero, Inverted, 翻译成中文是翻转不归零码
。什么意思呢,先看spec截图:
不归零
的意思是编码方式相对于归零码(
正电平,负电平,0电平)而言,还是只有两种电平,不用每次编码完都回到0电平。
翻转
是指当出现逻辑0
时,电平翻转,因此不需要负电平来表示0。
总结一下编码方式:0变1不变
2. 为什么要用NRZI?
- 没有归0步骤,节省了大量的数据带宽
- 没有负电平,表示起来方便
3. 如何自同步?
NRZ编码本身并不带自同步功能,USB在协议中加入了同步头(SYNC),对于每一个USB Packet, 都有一个同步域固定为0000_0001, 这个域翻译成NRZI编码就是01010100, 接收者通过这个同步头可以算出发送者的频率。
4. 为什么需要Bit-Stuffing?
SYNC需要可以解决同步的问题,但是如果发送端一直发1, 那由NRZI编码后的电平会一直保持不变,从SYNC计算出来的频率只要有一点点偏差,累积后都会造成较大的误差,所以USB协议中采取了bit stuffing的机制来避免出现长时间的1。简单说,每6
个连续的1之后,会强制插入一个0,使得发送信号强制出现翻转,接收方在收到翻转信号时可以调整频率,从而实现时钟同步。