NRZI 编码及其发展 NRZI 编码是一种自同步信号编码方式,广泛应用于串行总线通信中,如 UART、I2C、SPI、USB 等。NRZI 编码的出现是为了解决串行总线通信中的同步问题。 在串行总线通信中,发送者和接收者之间需要保持同步,以便正确地传输和接收数据。然而,发送者和接收者运行的频率可能不同,导致信号的同步问题。一个解决办法是附加一个时钟信号线,用来同步两端的传输。例如,I2C 通信协议使用 SDA 线传输数据,SCL 线传输同步时钟信号。 然而,附加时钟信号线增加了系统的复杂度和成本。因此,RZ 编码(Return-to-zero Code)出现了。RZ 编码使用正电平和负电平来表示逻辑 1 和逻辑 0,并在每个数据位后返回零电平。这样,接收者可以在信号归零后采样,实现自同步。 然而,RZ 编码也有缺点,大部分的数据带宽都用来传输“归零”,浪费了带宽。于是,NRZ 编码(Non-return-to-zero Code)出现了。NRZ 编码不需要归零步骤,节省了带宽,但是丧失了自同步特性。 NRZI 编码(Non-Return-to-Zero Inverted Code)是 NRZ 编码的一种变种。NRZI 编码使用信号的翻转来表示一个逻辑,信号保持不变来表示另一个逻辑。USB 传输的编码就是 NRZI 格式,电平翻转代表逻辑 0,电平不变代表逻辑 1。 NRZI 编码解决了同步问题,但仍然需要一些特殊的技巧来实现同步。例如,发送一个同步头,内容是 0101010 的方波,让接收者通过这个同步头计算出发送者的频率,然后用这个频率来采样之后的数据信号。 在 USB 中,每个 USB 数据包,最开始都有个同步域(SYNC),这个域固定为 0000 0001,这个域通过 NRZI 编码之后,就是一串方波。接受者可以用这个 SYNC 域来同步之后的数据信号。 此外,因为在 USB 的 NRZI 编码下,逻辑 0 会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。 然而,NRZI 编码仍然存在一些问题,例如频率误差问题。如果数据信号是 1000 个逻辑 1,经过 USB 的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个 1 了。 USB 对这个问题的解决办法,就是强制插 0,也就是传说中的 bit-stuffing。如果要传输的数据中有 7 个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。 曼彻斯特编码(Manchester Code)是一种双相码,用高电平到低电平的转换边表示 0,低电平到高高电平的转换边表示 1。这也是串行总线通信中的一种常用的编码方式。
- 粉丝: 1
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于C语言和汇编语言的简单操作系统内核.zip
- (源码)基于Spring Boot框架的AntOA后台管理系统.zip
- (源码)基于Arduino的红外遥控和灯光控制系统.zip
- (源码)基于STM32的简易音乐键盘系统.zip
- (源码)基于Spring Boot和Vue的管理系统.zip
- (源码)基于Spring Boot框架的报表管理系统.zip
- (源码)基于树莓派和TensorFlow Lite的智能厨具环境监测系统.zip
- (源码)基于OpenCV和Arduino的面部追踪系统.zip
- (源码)基于C++和ZeroMQ的分布式系统中间件.zip
- (源码)基于SSM框架的学生信息管理系统.zip