查看: 1968|回复: 0

在i.MX RT1010上使用FlexIO模拟IrDA

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32032
    最后登录
    2024-4-26
    发表于 2020-4-16 09:26:57 | 显示全部楼层 |阅读模式
    在i.MX RT1010上使用FlexIO模拟IrDA


    在i.MX RT上有一个非常神奇的外设——FlexIO,用它可以模拟各种各样的串并型外设接口,例如UART、I2C、SPI等简单协议,还可以实现比较复杂的I2S接口协议,甚至是LIN总线或摄像头的接口。我们将陆续推出一系列介绍FlexIO实现各种接口协议的介绍文章。


    上周介绍了模拟UART:




    一、FlexIO概述


    本文介绍了如何在i.MX RT1010上使用FlexIO模拟IrDA协议。
    尽管i.MX RT1010的LPUART同样支持IrDA协议的功能,但是当LPUART资源不够时,FlexIO模拟IrDA是一个备用选项。
    FlexIO是NXP i.MX RT系列的一个片上外设。它是一个高度可配置的模块,能够仿真各种通信协议,例如UART,I2C,SPI,I2S等。用户还可以使用FlexIO生成PWM和PFM波形。
    模拟IrDA,基本上是参考FLEXIO UART的功能,使用计时器来实现NRZ数据的编码和解码。

    二、IrDA概述

    IrDA是一种标准化的无线红外数据通信方法。为了降低误码率,应使用NRZ格式发送数据。同时,传输的数据应与载波混合。载波频率通常为38kHz。
    21.png
    图1. UART数据与NRZ格式数据关系图


    下图中的电路显示了如何混合传输的数据和载波。红外接收器可以用来接收混合数据,经过接收器出来后的数据可以被MCU使用。
    22.png
    图2. IrDA发送电路
    23.png
    图3. IrDA接收电路

    三、FlexIO模拟IrDA

    3.1. 如何使用FLEXIO产生一个PWM载波

    如图2所示,需要使用一个PWM信号作为载波。
    PWM的频率通常是38kHz,占空比是50%。
    恩智浦官网上有一篇应用笔记Generating PWM and PFM by using FlexIO介绍了如何使用FLEXIO产生PWM和PFM信号。读者可以参考这篇应用笔记去获取频率38kHz和50%占空比的PWM。

    3.2. 如何使用FLEXIO配置一个NRZ数据编码器

    在RT1010 SDK软件包中,有一个关于FLEXIO的例程:

    flexio_uart_interrupt_transfer

    NRZ数据解码器将会基于这个例程进行开发。

    IrDA发送的数据是NRZ格式,NRZ格式与UART数据的关系如图1所示。

    编码计时器将会被UART数据的下降沿触发。当编码计时器被下降沿信号触发后,NRZ数据输出管脚将会产生一个固定脉宽的脉冲。因此,编码计时器需要配置为 PWM模式。下面为编码计时器的具体配置:

    triggerSelect: Triggered by FLEXIO UART TX pin
    triggerSource: Internal trigger
    triggerPolarity: Trigger Polarity is Active Low
    pinConfig: Pin output
    pinPolarity: Pin Polarity is Active High
    pinSelect: The NRZ data output pin
    timerMode: Dual 8Bit PWM
    timerOutput: Never Reset
    timerDecrement: Decrement counter on FlexIO clock, Shiftclock equals Timer output
    timerDisable: Timerdisabled on Timer compare
    timerEnable: Timerenabled on Trigger high
    timerReset: Timer never reset
    timerStart: Start bit disable
    timerStop: Stop bit is enabled on timerdisable

    此外,脉冲信号的频率和占空比同样需要进行配置。

    脉冲的占空比通常是3/16的PWM周期。PWM的频率应该与UART信号的波特率相同。

    FLEXIO中的比较寄存器(CompareRegister)决定了这个脉冲信号的占空比和频率。

    编码计时器工作在Dual 8 bits模式,低8位决定PWM的高电平时间,而高位决定低电平时间。

    对于详细的配置方法,可以参考RT1010 FLEXIO PWM例程:

    boards\evkmimxrt1010\driver_examples\flexio\pwm

    图4展示了UART发送数据(发送的数据为字符U)与NRZ格式数据的时序关系。
    24.png
    图4. CH3是UART发送的原始数据,
    CH2是完成编码后的NRZ格式数据
    3.3. 如何使用FLEXIO配置一个NRZ数据解码器

    当IrDA信号被红外接收电路处理后,NRZ格式数据被送到FLEXIO的输入引脚。此时,一个解码计时器被用来把NRZ格式数据转换成UART常用的TTL电平数据。
    正如图1所示,解码计时器应该在NRZ数据的上升沿被触发。
    下面的配置可以实现这个功能:
    triggerSelect: Triggered by FLEXIO IRDA RX pin
    triggerSource: Internal trigger
    triggerPolarity: Trigger Polarity is Active High
    pinConfig: Pin output
    pinPolarity: Pin Polarity is Active Low
    pinSelect: The FLEXIO UART RX pin
    timerMode: Dual 8Bit BaudMode
    timerOutput: Never Reset
    timerDecrement: Decrement counter on FlexIO clock, Shiftclock equals Timer output
    timerDisable: Timerdisabled on Timer compare
    timerEnable: Timerenabled on Trigger high
    timerReset: Timer reset on Trigger risingedge
    timerStart: Start bit disable
    timerStop: Stop bit disable

    解码计时器的比较寄存器中的低八位数据可以用如下公式计算:
    CMP[7:0] = FLEXIO_CLOCK_FREQUENCY /BOARD_DEBUG_UART_BAUDRATE  - 1
    25.png
    图5. CH2是NRZ格式数据,
    CH4是经过NRZ解码器后的数据
    3.4. NRZ编解码总结
    26.png
    图6是NRZ数据的编码和解码的全部流程。


    除此之外,图7和图8展示了详细的编码和解码的触发时序。对于图7和图8示波器中每一个通道的物理意义,可以在图6中找到介绍。
    27.png
    图7. NRZ 数据编解码触发时序图
    28.png

    图8. NRZ 数据编解码触发时序图

    四. 如何在RT1010 EVK上开发IrDA?

    硬件设置:

    CH2: 经过编码器发送的NRZ数据,需要使用飞线将R1820的二号焊盘与J26-8相连接

    CH3: 发送的UART原始数据

    CH4: 结果过解码器收到的UARTRX数据

    使用示波器连接如图9所示的测试点,以完成硬件设置准备。

    29.png

    图9. 硬件设置示意图

    软件设置:


    软件使用IAR工具链,基于RT1010 SDK2.6.1中的 flexion_uart_polling_transfer进行开发。
    使用附件中的文件替代pin_mux.c and flexio_uart_polling_transfer.c。然后将程序编译下载到EVK的Flash内,使用IAR的watch功能改变IRDA的数值, 接着ch的数值将会发生改变并且与IRDA一致。
    此外还有一个方法可以进行观察ch数值的变化,连接J26-4和J31-1,打开串口助手并将波特率配置为115200,对应的ch数值将会被打印在串口助手上。


    图10. 如何改变发送数据的内容

    好了,如何在i.MX RT1010上使用FlexIO模拟IrDA就介绍到这里,随后将陆续介绍模拟LIN总线、SPI总线等内容。







    作者:Lucas@NXP      文章出处:恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 00:17 , Processed in 0.103147 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表