在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3745|回复: 10

[原创] USB协议中的SYNC同步字段以及NRZI编码(二)

[复制链接]
发表于 2019-9-19 10:56:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

这样,浪费的带宽又回来了,不过又丧失宝贵的自同步特性了,貌似我们又回到了原点,其实这个问题也是可以解决的,不过待会儿再讲,先看看什么是 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 不变),接受者可以用这个 SYNC 域来同步之后的数据信号。

此外,因为在 USB 的 NRZI 编码下,逻辑 0 会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。
但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是 1000 个逻辑 1,经过 USB的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个1 了。
USB 对这个问题的解决办法,就是强制插 0,也就是传说中的 bit-stuffing,如果要传输的数据中有 7 个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。


                               
登录/注册后可看大图

下一篇是我对于 我之间做过的PD/FCP/SCP快冲协议的一些联系

发表于 2019-9-24 16:34:46 | 显示全部楼层
想问下,通过同步头计算出的发送方频率,后面接收方是如何通过NRZI和发送方进行同步的呢?
 楼主| 发表于 2019-9-25 13:06:56 | 显示全部楼层
这部分其实和ADE(模拟部分关系比较多),我现在还没有接触实际的项目,不过我现在的理解是这样的:你现在看这个同步头是8‘b0000_0001,其次NRZI编码之后是KJKJKJKK,你会发现它总是在变化,也就是协议里面提到的边缘最大化;发送方发送这8个同步字段是不是也是在一个时钟的上升沿发送一个位,假如这个时钟是50MHZ,那一个周期就是20ns,是不是接受方可以通过这个检测总线跳变来算出一个位所需要的时间,不也就知道发送方的时钟了。

发表于 2019-9-25 15:28:25 | 显示全部楼层


不忘初心灬214 发表于 2019-9-25 13:06
这部分其实和ADE(模拟部分关系比较多),我现在还没有接触实际的项目,不过我现在的理解是这样的:你现在 ...


可能我的问题没有描述清楚,我的意思是在计算出发送方频率后,后面如何根据翻转信号不断去调整同步频率?
 楼主| 发表于 2019-9-25 17:50:48 | 显示全部楼层


WDWEET 发表于 2019-9-25 15:28
可能我的问题没有描述清楚,我的意思是在计算出发送方频率后,后面如何根据翻转信号不断去调整同步频率? ...


这个翻转信号同步主要在两个方面,首先你计算出发送方的频率,但是没有完全相同的两个时钟啊,时间长了就会引起误差(误差累积,第一次同步后,你采取信号没问题,但是多了是不是就会有问题?),所以才有这么个规定,6个1 后强制插个0。如果发送放发送的都是0,那NRZI编码出来的肯定是不断翻转的,如果发送的是1,前面说了6个1插0,会导致NRZI编码后会翻转,可能是6个误差累积不会引起错误,但是超过7个出先错误的几率增加。你看我这样解释对不对,你也可以把你理解的告诉我,互相讨论一下啊。

发表于 2019-9-26 08:20:05 | 显示全部楼层
我是刚看spec,看到这里不太明白才过来问的,我先照你这么理解,谢谢解答
 楼主| 发表于 2019-9-26 10:19:43 | 显示全部楼层
你可以看我USB的总结,最后面提到了为什么用NRZI编码;从常用的I2C等协议推倒出的NRZI的用法。
发表于 2019-9-27 08:16:33 | 显示全部楼层


不忘初心灬214 发表于 2019-9-26 10:19
你可以看我USB的总结,最后面提到了为什么用NRZI编码;从常用的I2C等协议推倒出的NRZI的用法。
...


好的,谢谢!
发表于 2019-10-12 15:11:20 | 显示全部楼层
模拟中会根据sync部分解析出这个时钟的,比如说你是12M的full_speed, sync接收的时候,会产生一个时钟,用这个时钟去采样信号线上的内容,你说的如果发送过程中频率变了,应该是需要从新同步的,比如从12M变到480M,是需要从新同步的
 楼主| 发表于 2019-10-14 13:51:24 | 显示全部楼层


新嘴小王安子 发表于 2019-10-12 15:11
模拟中会根据sync部分解析出这个时钟的,比如说你是12M的full_speed, sync接收的时候,会产生一个时钟,用 ...


是的,我其实想说的问题是误差,同步字段和6个1强制插0这两种手段主要是为了解决这个误差。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-19 16:15 , Processed in 0.036499 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表