USB2.0物理层的电信号
+ -

USB硬件编码格式NRZI

2021-05-09 5604 5

我们知道USB3.0以前采用的是两根数据线D+和D-所对应的数据传输,采用的是数据编码方式是NRZI(Non-Return-to-Zero Inverted),而USB3.0以后采用的是8/10bit编码。

USB使用NRZI编码方式:当数据为0时,电平翻转;数据为1时,电平不翻转。为了防止出现过长时间电平不变化现象,在发送数据时采用位填充处理。具体过程如下:当遇见连续6个高电平时,就强制插入一个0。经过位填充后的数据由串行接口引擎(SIE)将数据串行化和NRZI编码后,发送到USB的差分数据线上。接收端完成的过程和发送端刚好相反。

同步时钟编码

USB 的数据是串行发送的,就像 UART、I2C、SPI 等等,连续的01 信号只通过一根数据线发送给接受者。

但是因为发送者和接收者运行的频率不一样,信号的同步就是个问题,比如,接受者接收到了一个持续一段时间的低电平,由于没有时钟采用,所以无法得知这究竟是代表了多少个低电平0。

一个解决办法,就是在传输数据信号的同时,附加一个时钟信号,用来同步两端的传输,接受者在时钟信号的辅助下对数据信号采样,就可以正确解析出发送的数据了,比如 I2C 就是这样做的,SDA 来传输数据,SCL 来传输同步时钟:
i2c-hd-encode

虽然这样解决了问题,但是却需要附加一根时钟信号线来传输时钟。有没有不需要附加的时钟信号,也能保持两端的同步呢?
有的,这就是 RZ 编码(Return-to-zero Code),也叫做归零编码。

NRZ编码(Non-return-to-zero Code)

RZ 编码(Return-to-zero Code),也叫做归零编码。在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电平,也就是说,信号线上会出现 3 种电平:正电平、负电平、零电平:
1610552904953

从图上就可以看出来,因为每位传输之后都要归零,所以接受者只要在信号归零后采样即可,这样就不在需要单独的时钟信号。实际上, RZ 编码就是相当于把时钟信号用归零编码在了数据之内。这样的信号也叫做自同步(self-clocking)信号。

这样虽然省了时钟数据线,但是还是有缺点的,因为在 RZ 编码中,大部分的数据带宽,都用来传输“归零”而浪费掉了。

NRZ编码(Non-Return-to-Zero Inverted Code)

我们去掉这个归零步骤,NRZ 编码(Non-return-to-zero Code)就出现了,和 RZ 的区别就是 NRZ 是不需要归零的:
1610552921072
这样,浪费的带宽又回来了,不过又丧失宝贵的自同步特性了,貌似我们又回到了原点,其实这个问题也是可以解决的,不过待会儿再讲,先看看什么是 NRZI:

NRZI 编码(Non-Return-to-Zero Inverted Code)

NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。

USB 传输的编码就是 NRZI 格式,在 USB 中,电平翻转代表逻辑 0,电平不变代表逻辑1:
1610552934466
1610553336619

翻转的信号本身可以作为一种通知机制,而且可以看到,即使把 NRZI 的波形完全翻转,所代表的数据序列还是一样的,对于像 USB 这种通过差分线来传输的信号尤其方便~

现在再回到那个同步问题:

的确,NRZ 和 NRZI 都没有自同步特性,但是可以用一些特殊的技巧解决。

比如,先发送一个同步头,内容是 0101010 的方波,让接受者通过这个同步头计算出发送者的频率,然后再用这个频率来采样之后的数据信号,就可以了。

USB使用NRZI编码同步原理

在 USB 中,每个 USB 数据包,最开始都有个同步域(SYNC),这个域固定为 0000 0001,这个域通过 NRZI 编码之后,就是一串方波(复习下前面:NRZI 遇 0 翻转遇 1 不变),接受者可以用这个 SYNC 域来同步之后的数据信号。

此外,因为在 USB 的 NRZI 编码下,逻辑 0 会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。

但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。

假如数据信号是 1000 个逻辑 1,经过 USB 的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个 1了。

USB中用Bit-Stuffing来同步时钟信号

USB 对这个问题的解决办法,就是强制插 0,也就是传说中的 bit-stuffing,如果要传输的数据中有 7 个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。
接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。

很多人会说如果传输了 11111101,会不会接受者把0勿删,答案是不会的,接收端收到6个1后,紧接着肯定会收到0(如果第7位为1则插入0,如果传输的第7位为0则接受者接收到的也为0)。这个0是否删除需要查看0的下一位,下一位如果1则发送端是真的发送了连续的7个1,之前收到的0的确是发送端插入进入的,需要删除;如果下一位是0,则接受端只发送了6个1,之前收到的0为接收端发送的数据,不能删除。

Bit-Stuffing实例

在使用力科的抓包调试工具时,有一个很好的功能是可以显示波形。如对于如下的的OUT令牌包,其因为PID和地址出现连续的1,故插入了Bit-Stuffing。
Bit-Stuffing

不显示Bit-Stuffing
不显示Bit-Stuffin

显示BIT-stuffing
显示BIT-stuffing

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB3.0硬件编码格式-8B/10B编码
1.编码技术基础理论 在高速的串行数据传输中,传送的数据被编码成自同步的数据流,就是将数据和时钟组合成单一的信号进行传送,使得接收方能容易准确地将数据和时钟分离,而且要达到令人满意的误码率,其关键技术在于串行传输中数据的编码方法。 目前, 高速接口正在被广泛应用于包括 SATA、 SAS、 高速......
USB3.2超高速GEN2 128b/132b编码
USB3.2 GEN2的物理层PHY使用的是128b/132b编码,数据的传输速从GEN1最高的5Gbps达到了GEN现在的10Gbps。USB3.2 GEN2和GEN1一样,都是要传输的数据先进行序列化,然后再从低位(LSB)到高位(MSB)进行传输。USB3.2 GEN2对于传输1字节的symb......
USB3.2超高速GEN1 8b/10b编码概述
USB3.2 GEN1的物理层PHY使用的是8b/10b编码。USB3.2GEN1即USB3.0使用的8b/10b编码是对数据从8位到10的编码扩展。如对于发送的数据1字节,其各位从低到高记作 ABCDEFGH,这里将其分为2组,低5位一组,高3位一组。高3位的FGH被编码为fghj,低5位的ABC......
USB端口颜色编码标识
USB端口和连接器有时会进行颜色编码,以指示其支持的USB规范和功能。这些颜色不是USB规范所要求的,设备制造商之间也不一致。例如,Intel使用橙色表示充电端口,而一家工业设备组件制造商选择橙色表示具有强保留机制的USB端口。端口颜色接口类型USB规范备注白USB-A or USB-BMicro ......
UVC 编码单元
编码单元请求用于设置或读取视频函数的编码单元内的视频控制的属性。编码单元是可选的。......
UVC 编码单元描述符
编码单元描述符ID由bUnitID字段中的值唯一标识描述符。同一视频功能内的任何其他单元或终端不得具有相同的功能ID。bSourceID字段用于描述连接到此编码单元的ID。它包含连接到通过其输入引脚连接到该编码单元的单元或端点的ID。bSourceID必须引用同一视频功能中的单元或终端。bmCont......
USB硬件编码格式NRZI
我们知道USB3.0以前采用的是两根数据线D+和D-所对应的数据传输,采用的是数据编码方式是NRZI(Non-Return-to-Zero Inverted),而USB3.0以后采用的是8/10bit编码。USB使用NRZI编码方式:当数据为0时,电平翻转;数据为1时,电平不翻转。为了防止出现过长......
USB3.2超高速GEN1、GEN2特殊符号(symbol)和链路管理
8b/10b编码方案提供与数据不同的特殊符号(symbol)用来表示字符的符号。这些特殊符号用于各种链接管理机制。特殊符号应遵循适当的8b/10b差异规则。对于GEN2,块头标识如果以下16个符号代表数据,则它们具有特殊含义。在GEN2中,当是控制块的一部分,接收机在接收特殊符号时,应始终对其进行单......
TYPE-C PD供电协议信号-双相标记编码(BMC)编码
在TYPE-C接口上运行的PD供电协议,其PD通讯协议是通过TYPE-C接口的CC1线缆来进行信号传输的。信号的传输速率一般为300kps,最大值为不能超过330kps,最小值不能小于270kps。图片来源于USB中文网QQ群墨玉麒麟提供。PD信号的编码规则采用的是BMC(Biphase ......
TYPE-C PD供电协议信号-4b5b编码对照表
PD供电协议编码格式是4b5b,即把4位的数据(0x0-0xf)编码成5位,其编码对照表见下图:名称4b5b Symbol描述0011110hex data 0111001hex data 121010100hex data 23111......
PCM音频编码
本文的转载得到了零声教育的QQ同意。主要过程是将语音等模拟信号每隔一定时间进行取样,使其离散化,同时将抽样值按分层单位四舍五入取整量化,同时将抽样值按一组二进制码来表示抽样脉冲的幅值。也就是说语音信号最终以脉冲形式编码。有一定电子基础的人都知道传感器采集音频信号是模拟量,而我们实际传输过程中......
音视频开发AAC编码
本文的转载得到了零声教育的QQ同意。AAC(Advanced Audio Coding,译为:高级音频编码),是由Fraunhofer IIS、杜比实验室、AT&T、Sony、Nokia等公司共同开发的有损音频编码和文件格式AAC对比MP3AAC被设计为MP3格式的后继产品,通常在相......
视频编码格式分类
本文的转载得到了零声教育的QQ同意。跟音频编码一样,视频编码最重要的目的也是为了进行数据压缩,以此来降低数据传输和存储成本。以一路分辨率 720x1280(常说的 720P),帧率为 30 fps 的视频为例,如果不经过编码压缩,直接传输或存储原始的 RGB 数据,对应的码率是:720 * ......
USB3.0的8B/10B编码、AC耦合以及为什么要进行硬件编码
在USB2.0时代,USB的差分信号采用的是D+/D-进行传输,使用的编码NRZI编码。对原始数据的编码就是:当数据为0时,电平翻转;数据为1时,电平不翻转。所以总线当数据为连续的0时,数据会是一个不停翻转的波形,电压呈交流形式,而当原始数据为1时,电平会由于NIZI的编码规则,呈现短暂的直流形式......
USB2.0握手包ACK总线分析仪抓包实例详解
ACK握手包的详细使用说明可详见:https://www.usbzh.com/article/detail-452.html这里详细的介绍了ACK握手包的使用说明。这里我们对此从数据链路层和USB总线分析仪抓包的来分析。ACK的数据包格式ACK可能是USB总线分仪里最简单的包了。其主要包括两部分组......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!