首页 > 代码库 > [编码] 曼彻斯特编码与解码

[编码] 曼彻斯特编码与解码

  常见的编码方式有以下几种,

  1、NRZ(Not Return to Zero)不归零编码, 这是一种比较简单的编码方式,二进制数据“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. 返回。

 

  曼彻斯特解码

  曼彻斯特解码过程要比编码复杂,一般的,解码过程有以下步骤:

    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

 

    下图展示的是这种解码方式的一个示意图,

  技术分享  图2 曼彻斯特解码示意图

  总结

  总的来说,编码和解码还是比较简单的,曼彻斯特的典型应用是在RFID领域里标签读取。另外,上面假设上升沿表示“1”,下降沿表示“0”,对于相反的情况(即上升

  沿表示“0”,下降沿表示“1”),解码过程处理不同的地方在步骤6,假如同步到数据流的时钟,对于上升沿表示“1”,下降沿表示“0”的情况,当前位的值和读取到的I/O

  的值相同;对于上升沿表示“0”,下降沿表示“1”的情况,当前位的值和读取到的I/O的值相反。

 

 

    

[编码] 曼彻斯特编码与解码