深入讲解曼彻斯特编码与解码
曼彻斯特编码(ManchesterEncoding),也叫做相位编码(PhaseEncode,简写PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。它在以太网媒介系统中的应用属于数据通信中的两种位同步方法里的自同步法(另一种是外同步法),即接收方利用包含有同步信号的特殊编码从信号自身提取同步信号来锁定自己的时钟脉冲频率,达到同步目的。
常见的编码方式有以下几种,
1、NRZ(NotReturntoZero)不归零编码,这是一种比较简单的编码方式,二进制数据“0”和“1”分别用高电平和低电平来表示,当1位数据传输完以后,信号电平
不返回零所以称为不归零编码。
2、BiPhase编码,相比NRZ编码方式,这种编码稍微复杂了一点,他是这样规定,在每一位数据传输时,电平都会跳变(高电平变低电平,或者低电平变高电平),
同时当数据为“1”时(按照规定也可以是“0”),在数据位中间也会跳变。
3、曼彻斯特编码方式,这种编码方式利用信号的边沿来表示二进制数据“0”和“1”,比如信号的上身沿表示“1”,下降沿表示“0”,而这种跳变一般发生在位帧的中间。
以上3中编码方式的波形如下图所示,
图1常见编码方式波形图
曼彻斯特编码
假设信号的上升沿表示“0”,下降沿表示“1”,同时假设数据的波特率为f,那么一个位的时长为1/f,那么位帧的中间时长为1/2f,我们用T来表示这个半个位帧的时长。
有了以上的假设条件,那么曼彻斯特的编码流程如下,
1.首先I/O口输出高电平。
2.检查数据是否发送完成,如果是,跳到步骤7。
3.检查下一个数据位的值。
4.如果是“1”,调用发送1的函数ManchesterOne(T)。
5.如果是”0″,调用发送0的函数ManchesterZero(T)。
6.返回到步骤2。
7.I/O输出为高电平并返回。
ManchesterOne(T)的执行过程
1.I/O输出低电平。
2.等待半位帧时间T。
3.I/O输出高电平。
4.等待半位帧时间T。
5.返回。
ManchesterZero(T)的执行过程
1.I/O输出高电平。
2.等待半位帧时间T。
3.I/O输出低电平。
4.等待半位帧时间T。
5.返回。
解码原理
解码可通过解码器来实现,解码器从曼彻斯特码中分离出接收数据RxD与接收时钟RxC。具体方法是:解码器从曼码中分别提出“1”跳变和“0”跳变信号,但需区分位中跳变与位间跳变,前者是表示数据的跳变,后者是当数据中有连续“1”信号或连续“0”信号时产生的不反应数据特征的无效跳变。解码器提取位中跳变后,可将其转换为二进制
数据,抑制并剔除位间跳变,不将其转换为数据。最后将曼彻斯特编码与解出的数据RxD用异或逻辑取得时钟特征,并利用单稳电路把时钟特征(窄脉冲)展宽为接收时钟RxC。
曼彻斯特解码
曼彻斯特解码过程要比编码复杂,一般的,解码过程有以下步骤:
1.获取数据流的波特率(或者已知数据流的波特率)。
2.同步数据流的时钟信号(实质是区分位帧边沿和半位帧边沿)。
3.根据上面两步对数据流进行解码。
假设的条件和编码时一样,具体的实现步骤如下,
1.将定时器的捕获中断设置为所有边沿(对于没有上升沿和下降沿同时捕获的MCU,需要在中断处理函数里改变捕获沿)。
2.中断函数里处理捕获标志位和捕获值。
3.开启定时器,捕获第一个边沿并丢弃。
4.捕获下一个边沿,检查捕获值是否等于2T(T=1/2f,其中f为数据流的波特率。
5.重复步骤4,直到捕获值等于2T(此时就和数据流的时钟同步了)。
6.读取当前I/O信号的电平值,并保存为当前位的值(0或者1)。
7.捕获下一个边沿
a.捕获值和T比较
b.如果捕获值等于T
i.捕获下一个边沿同时确定该捕获值也等于T(如果不等说明编码错误)
ii.下一位的值和当前值相同
iii.返回该值
c.如果捕获值等于2T
i.下一位的值和当前值相反
ii.返回该值
d.否则返回错误
8.保存下一位的值到缓存
9.如果接收到的数据位达到要求,返回对数据做进一步处理
10.否则更新当前值(设置为下一位的值),重复步骤7
下图展示的是这种解码方式的一个示意图,
#p#分页标题#e#
图2曼彻斯特解码示意图
总结
总的来说,编码和解码还是比较简单的,曼彻斯特的典型应用是在RFID领域里标签读取。另外,上面假设上升沿表示“1”,下降沿表示“0”,对于相反的情况(即上升沿表示“0”,下降沿表示“1”),解码过程处理不同的地方在步骤6,假如同步到数据流的时钟,对于上升沿表示“1”,下降沿表示“0”的情况,当前位的值和读取到的I/O
的值相同;对于上升沿表示“0”,下降沿表示“1”的情况,当前位的值和读取到的I/O的值相反。
小编总结:看完这篇文章,学到了很多知识了,但小编觉得还不完整,如果想要了解更多知识,欢迎登陆课课家哦~