在i.MX RT1010上使用FlexIO模拟UART
在i.MX RT上有一个非常神奇的外设——FlexIO,用它可以模拟各种各样的串并型外设接口,例如UART、I2C、SPI等简单协议,还可以实现比较复杂的I2S接口协议,甚至是LIN总线或摄像头的接口。我们将陆续推出一系列介绍FlexIO实现各种接口协议的介绍文章。
一、FlexIO介绍
本文如何使用FlexIO模块在i.MX RT1010上模拟UART。
尽管RT1010具有4个LPUART,但当LPUART数量不足时,也可以选择FLEXIO模拟。
FlexIO是NXP i.MX RT系列上的片上外设,是一个高度可配置的模块,能够仿真各种通信协议,例如UART,I2C,SPI,I2S等。用户还可以使用FlexIO生成PWM和PFM波形等。
二、基于FlexIO的UART
2.1 UART简介
通用异步接收器/发送器(UART)是一种计算机硬件,可以在并行和串行形式之间转换数据。UART通常与EIA,RS-232,RS-422或RS-485等通信标准结合使用。通用名称表示数据格式和传输速度是可配置的。
电信号电平和方法(例如差分信号等)由UART外部的驱动器电路处理。UART通常是用于在计算机或外围设备串行端口上进行串行通信的单个(或一部分)集成电路。
必须将发送和接收UART设置为相同的位速度,字符长度,奇偶校验和停止位,以确保正常工作。接收UART可能会检测到某些不匹配的设置,并为主机系统设置“成帧错误”标志位。
下图为典型的UART 8位数据帧。
2.2 FlexIO模拟UART
当使用FlexIO模拟UART时,应当注意到这种方法的优缺点,以更好的协调和分配片上资源:
优势
增加了可用的UART总数
高波特率
灵活配置,可以自行定义和配置帧内数据位数
不足
不支持奇偶校验
不支持FIFO,大量数据收发时建议使用DMA
FlexIO由移位器(Shifter)和定时器(Timer)组成。
移位器(Shifter)具有发送,接收和数据匹配的功能。对于UART,移位器(Shifter)在发送或接收模式下工作。除此之外,移位器(Shifter)还支持启动/停止位(Start/Stop bit)生成。
定时器(Timer)支持各种内部/外部触发,并支持启用/禁用/复位/减量条件功能。计时器(Timer)具有三种工作模式:
双8位波特率模式(Dual 8-bit baud mode),
双8位PWM模式(Dual 8-bit PWM mode),
和单16位模式(Single 16 bit mode)。
对于UART,定时器在双8位波特模式下工作。
下图展示了简略的UART数据发送和接收的过程。
对于发送过程,要发送的数据存储在SHIFBUFi寄存器中,然后加载到SHIFTERi寄存器,最后数据在定时器和时钟的共同作用下,通过FlexIO的输出引脚输出。
对于接收过程,输入数据被FlexIO输入管脚捕捉,对应的定时器被触发,在定时器和时钟的共同作用下将数据存储到SHIFTERi寄存器中,最后将数据移出并加载SHIFTBUFi寄存器中。
更详尽的分步操作,请查看本应用笔记的附件,附件中的幻灯片有助于更好的理解整个过程。
2.3 基于FlexIO的UART发送器
使用FlexIO模拟UART发送功能,需要使用下列的资源:
1个定时器(Timer): 配置为双8位波特率模式(Dual 8-bitbaud mode)以控制数据的移位
1个移位器(Shifter):在定时器的控制下对来自SHIFTERBUF的数据移位
1个引脚(Pin): 连接到移位器(Shifter)用于输出数据
发送器的移位器(Shifter) 配置如下:
发送器的定时器(Timer)配置如下:
下面是接收器工作原理动图:
2.4 基于FlexIO的UART接收器
使用FlexIO模拟UART接收功能,需要使用下列的资源:
1个定时器(Timer): 配置为双8位波特率模式(Dual8-bit baud mode)以控制数据的移位
1个移位器(Shifter):在定时器的控制下对来自SHIFTERBUF的数据移位
1个引脚(Pin): 连接到移位器(Shifter)用于输出数据
接收器的移位器(Shifter) 配置如下:
接收器的定时器(Timer)配置如下:
下面是接收器工作原理动图: 三、总结
下图对比了UART和FlexIO模拟UART在功能上的差异。除了不能实现过采样以外,其他的功能基本可以支持。
在RT1010的SDK软件包内有一些关于FlexIO UART的应用例程,路径是:
boards\evkmimxrt1010\driver_examples\flexio\uart
这些应用例程有: edma_transfer, int_rb_transfer, interrupt_transfer, polling_transfer
在FlexIO UART的基础上,还可以进一步开发IrDA协议模拟的应用,具体可以查看相应的应用笔记。
作者:Lucas@NXP 文章出处:恩智浦MCU加油站
|