当前位置: 首页 > news >正文

USB学习【2】通讯的基础-反向不归零编码

一.写在前面

所有的通讯协议,发送端和接收端必须按照同一节奏发送信号和接受信号才能保证通讯的正常进行,否则会出现错位。
这个节奏用我自己的话说:时间卡尺。

  • 串口协议是通过约定好波特率来进行解析信号。
  • IIC是专门有一个时钟线作为时间卡尺来解析信号线的数据。
    提到这三种通讯了,顺便列出来这三种通讯的优缺点。
  • 在USB总线上,通过D+和D-两个数据信号线来传输,而并没有像I2C总线那样会有一根SCL时钟线来同步,那么USB总线是如何来进行同步两端信号传输呢?
维度串口通讯IIC通讯USB通讯
速率低(kbps级)中(Mbps级)高(Gbps级)
距离远(RS-485达数百米)短(<1米)短(<5米)
设备数量单一主从多主多从单主机多从
硬件复杂度低(2线)低(2线+上拉)高(需控制器芯片)
适用场景工业控制、传统设备芯片间通信、传感器高速外设、消费电子

这里就要引出一个话题:编码方式

二.编码方式

  1. RZ 编码(Return-to-zero Code),也叫归零编码。
    在该编码试工中,正电平代表逻辑1,负电平代码逻辑0,并且每次传输完一位数据,信号都会回到零电平。这样,在信号线上会产生3种电平:正电平、负电平、零电平,相应的信号图例如下:
    在这里插入图片描述

从上图中可看出,每们数据传输中都有一个归零的过程,这样接收端只需要在归零后进行采样,这样就替代了时钟信号时间卡尺的功能,这实际上相当于把时钟信号和数据合并在了一起,这种信号叫自同步(self-clocking)信号。
这样确实节省了信号线,不过还是有它固有的缺点,由于RZ编码信号中有一半的数据带宽被用于传输“归零”信号而占据,速度自然就慢了。
为了解决这个问题,NRZ编码就被聪明人发明了。

  1. NRZ 编码(Non-return-to-zero Code),也叫不归零编码。

在这里插入图片描述
从上图可以看到,每一位信号都不需要“归零”了,被浪费的带宽收回了,但又失去了应有的自同步特性,让我们感觉又回到了起点,这个同步的问题先不研究,继续看下面的编码规则。

  1. NRZI 编码(Non-Return-to-Zero Inverted Code),也叫反向不归零编码。
    NRZI编码与NRZ编码的区别就是NRZI用翻转来表示一个逻辑,而信号保持不变来表示另一个逻辑。而在USB传输的编码中采用的是NRZI格式,电平翻转代表逻辑0,电平不变代表1。
    下图是NRZI与NRZ的对比图例:

在这里插入图片描述
在这里插入图片描述

也就是说, NRZI 编码是以变化来作为逻辑的,在信号传递中,很多时候都是111011,100011这种连续1或者连续0的情况出现,这种编码可以大大减少信号翻转频率、降低EMI。

从上面的了解,NRZ和NRZI都失去了自同步特性,不过还是可以通过一些技巧来处理。

三.如何同步信号(怎么得到时间卡尺)

在USB中,每个数据包的最开始处都有一个同步域(SYNC),其值为00000001,在经过NRZI编码后,就是一串方波,接收方通过同步头来计算发送方的频率,以便用这个频率来继续采样数据信号。用人话说就是,发送一个方便测试频率样例给对方,对方测试测试就知道多快的频率了。。
NRZI编码中,每当逻辑0时就会进行电平翻转,前7个0会触发连续7次电平翻转,形成明显的信号波动,第8个1保持电平不变,结束翻转
还有一个问题极限问题要解决,凡是信号必有误差!
一旦电平长时间保持不变时,假设我们发送发送一位个逻辑1,即使传输的是100个逻辑1,但接收方与发送方的频率相差了100分之1,那么也还是存在可能把数据采集成为99或者101。而USB中采用了Bit-Stuffing位填充处理,即在连续发送6个1后面会插入1个0,强制使发送信号进行翻转,从而让接收方调整频率,同步接收。而接收方在接收时只要接收到连续的6个1后,直接将后面的0删除即可恢复数据的原貌。
下图是原始数据、位填充数据、NRZI编码数据的一个图例:

在这里插入图片描述
在这里插入图片描述

而接收方只需要将上面接受到的NRZI编码数据进行译码,再进行位反填充即可还原为原始数据了。
此种编码方式除了在USB上使用,还有在CD光盘以及使用光纤传输的100BASE-FX(Fast Ethernet)等产品、领域。

4.问题

  1. 为什么一定是6位后面位填充?
    这个问题没有仔细测算过,位填充按道理肯定是越多位之后填充效率会更改,设定为6一定是经过专家的计算取的一个平衡策略。
http://www.xdnf.cn/news/303409.html

相关文章:

  • 优势演员-评论家A2C详解:python从零实现
  • 【KWDB 创作者计划】一文掌握KWDB的时序表管理
  • 计算机中的逻辑运算
  • DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
  • 碰一碰发视频源码搭建的定制化开发实践
  • 代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串
  • Ubuntu 22.04 安装配置远程桌面环境指南
  • K8s 常用命令、对象名称缩写汇总
  • Mysql group by 用法
  • ResNet50应用于农业保险现场照片作物种类核验
  • 【coze】故事卡片(图片、音频、文字)
  • 【漫话机器学习系列】242.欠拟合(Underfitting)
  • 端口隔离 实验 讲解
  • UE5 GAS开发P47 游戏标签
  • Kotlin 中 List 和 MutableList 的区别
  • 网络自动化与可观测性:构建自愈型智能网络体系
  • 什么是进程,如何管理进程
  • 【2025】Visio 2024安装教程保姆级一键安装教程(附安装包)
  • Java基础学完,继续深耕(0506)SQL--多表关系
  • Kotlin-访问权限控制
  • unittest自动化测试实战
  • 文件上传漏洞篇:upload-labs靶场搭建
  • 栈与队列详解及模拟实现
  • 未来 CSS:变量、容器查询与新特性的探索
  • 硬件工程师面试常见问题(16)
  • Deepseek流式操作与用户行为数据分析day01
  • 【Linux】基础开发工具
  • Flutter开发HarmonyOS实战-鸿蒙App商业项目
  • Mac电脑,idea突然文件都展示成了文本格式,导致ts,tsx文件都不能正常加载或提示异常,解决方案详细说明如下
  • Mathematica中的ResourceFunction