概述
Ameba 系列产品支持 UART 接口,能够进行异步串行全双工通信。
功能特性
支持多种 UART 数据格式
可配置的接收时钟,支持低功耗接收模式
支持硬件自动流控
支持接收信号去抖
支持接收波特率监控与校正
支持串行红外编码与解码
操作模式
轮询模式
中断模式
DMA 模式
收发时钟
发送时钟与波特率
时钟:XTAL40M
波特率:110bps - 8Mbps
接收时钟与波特率
接收时钟包括 XTAL40M、OSC2M 和 XTAL2M, 各芯片支持的接收时钟如下表所示:
Ameba SoC |
RTL8721Dx |
RTL8720E |
RTL8726E |
RTL8713E |
RTL8730E |
RTL8721F |
---|---|---|---|---|---|---|
XTAL40M |
Y |
Y |
Y |
Y |
Y |
Y |
OSC2M |
Y |
Y |
Y |
Y |
Y |
Y |
XTAL2M |
N |
Y |
Y |
Y |
Y |
N |
接收时钟对应的波特率范围如下表所示:
接收时钟 |
XTAL40M(默认) |
OSC2M |
XTAL2M |
波特率 |
110bps - 8Mbps |
110bps - 115200bps |
110bps - 115200bps |
工作模式
根据需要,可配置 UART 工作在以下三种模式:
轮询模式
这是最基础的工作模式。CPU 通过轮询 UART 的状态寄存器,然后根据需要读写 FIFO 缓冲区,以实现数据的收发。
适用对实时性要求较低的小规模数据传输。
中断模式
当满足配置的触发条件时,UART 硬件会发送中断信号通知 CPU 处理相关事务。
该方式无需频繁轮询,使得 CPU 占用率降低且响应速度更快。
DMA 模式
通过 UART 与 DMA 握手机制,由 DMA 控制器负责数据传输,减轻 CPU 的处理负担。
适用于需处理大量数据的应用,如音视频流处理、大数据传输等情境。
UART 通过 DMA 模式发送数据,过程由 GDMA 控制。
UART 通过 DMA 模式接收数据,过程由 GDMA 或 UART 控制:
如果开发者需要接收
固定长度
的数据,可以利用 GDMA 控制 UART DMA 。如果开发者需要接收
不固定长度
的数据,可以利用 UART 控制 UART DMA 。
硬件自动流控
UART 支持硬件自动流控,通过请求发送 RTS 信号和清除发送 CTS 信号,自动控制数据的传输,避免数据丢失或溢出。
硬件自动流控的收发双方设备连接如图所示:
UART 自动流控信号连接
备注
nRTS 信号和 nCTS 信号为低电平有效。
自动请求发送
设备 A 在准备好接收数据时将其 RTS 线置为低电平,通知设备 B 可以发送数据。
当设备 A 的接收 FIFO 中的数据量达到配置阈值时,RTS 线被置为高电平,通知设备 B 不要再发送数据。
当设备 A 的接收 FIFO 中的数据量减少到一定程度,RTS 线被置为低电平,通知设备 B 可以继续发送数据。
备注
RTS 线一旦被拉高,再次拉低的时刻取决于接收 FIFO 中的数据量。
接收 FIFO
完全为空
时,RTS 线才会被置为低电平。
接收 FIFO
完全为空
时,RTS 线才会被置为低电平。
接收 FIFO
完全为空
时,RTS 线才会被置为低电平。
接收 FIFO
完全为空
时,RTS 线才会被置为低电平。
接收 FIFO
完全为空
时,RTS 线才会被置为低电平。
接收 FIFO 中的数据数量下降到
配置阈值 - 2
的时候,RTS 线会被置为低电平。
自动清除发送
设备 A 监控来自设备 B 的 CTS 信号,以判断是否继续发送数据:
当 CTS 信号为低电平,设备 A 可以发送数据。
当 CTS 信号为高电平,设备 A 不发送数据。
应用示例
SDK 提供了两类功能示例,帮助开发者了解和使用 UART 功能:
mbed 示例
路径:
{SDK}\component\example\peripheral\mbed\UART\{demo}
展示如何在 mbed 环境中实现 UART 控制。
raw 示例
路径:
{SDK}\component\example\peripheral\raw\UART\{demo}
展示如何在无抽象层的情况下直接控制 UART。
以下是对 raw 示例功能的简要说明:
raw_uart_poll_trx 演示使用 UART
轮询
工作模式收发数据;raw_uart_poll_autoctrl 演示使用 UART
轮询
工作模式通过自动流控
收发大量数据;raw_uart_int_trx 演示使用 UART
中断
工作模式收发数据;raw_uart_int_stream 演示使用 UART
中断
工作模式收发大量数据;raw_uart_int_rx_timeout 演示使用 UART
中断
工作模式收发数据并避免超时
;raw_uart_dma_clock 演示使用 UART
DMA
工作模式发送数据;raw_uart_dma_stream 演示使用 UART
DMA
工作模式收发固定数量
的数据;raw_uart_dma_rx_fc 演示使用 UART
DMA
工作模式收发不固定数量
的数据。
备注
要了解示例支持的芯片,请查看示例路径下的 README.md
文件。
API 参考
要详细了解和使用相关 API,请参阅 {SDK}\component\soc\amebaxxxx\fwlib\include\ameba_uart.h
。
常见问题排查
通过 UART 唤醒丢数据
现象 |
向UART发送数据唤醒系统,唤醒后发现丢失了部分数据 |
原因 |
接收FIFO大小有限,发送数据太长时,系统来不及处理,只能保留一部分数据 |
解决方法 |
|
UART 利用 DMA 接收数据时越界
现象 |
在RTL8721Dx/RTL8720E/RTL8726E/RTL8713E/RTL8730E上, 运行raw_uart_dma_rx_fc示例进行数据接收时,数据量超出buffer范围 |
原因 |
UART控制DMA接收时,电路不会对数据量做限制 |
解决方法 |
运行raw_uart_dma_stream示例并打开宏UART_USE_GTIMER_TO, 开发者可以在连续接收的前提下,接收不超过指定数量的数据 |