当今,串行通信协议在各种嵌入式系统和物联网设备中被广泛应用。其中,UART作为最基础的串行通信协议之一,被广泛应用于微控制器、传感器、通信模块等设备之间的数据传输。在UART通信中,数据的传输方式通常是定长字节,即每次传输的字节数是固定的。然而,在一些特殊的应用场景中,变长字节数据的传输方式则更加适用。

在这篇博客中,我将介绍UART接收变长字节数据的优势和实现方法,以及与定长字节数据传输方式的区别,并探讨两种桃芯可实现的方法————UART FIFO Mode + DMA方式UART FIFO Mode Only方式

优势分析

在实际应用中,UART接收变长字节数据的场景很常见,下面列举了几种比较常见的场景:

  1. 传感器数据传输
  2. 文件传输
  3. 音视频数据传输
  4. 协议传输

这些场景都有显著特点是数据长度不固定传输时间不固定,可能会在不同的通信过程中发生变化。除此之外,甚至会当有一些硬件不支持流控。在这些情况下,就需要用到UART接收变长字节数据的方法,优势:

  1. 灵活性高:可以根据实际需要动态调整接收数据的长度,适应不同场景的需求。
  2. 节省资源:只需要接收实际需要的数据,避免了接收固定长度数据时可能产生的资源浪费。
  3. 提高通信效率:变长字节数据可以根据实际数据量进行发送,减少了通信过程中的空闲时间,提高了通信效率。

实现方式

在实际应用中常见的实现方式有三种UART单字中断接收UART FIFO Mode Only方式UART FIFO Mode + DMA方式,在下表中我对三种方式的实现原理以及优缺点进行了详细的说明:

方式 实现原理 优点 缺点
UART单字节中断接收 每接收到一个字节
触发一次中断处理
简单易实现,
不需要额外的
硬件支持
需要频繁的中断处
理,CPU负载高,
适用于低速数据传
UART FIFO Mode Only 使用硬件FIFO缓存
存储接收到的数据
可以减轻CPU
负载,适用于
中速数据传输
FIFO缓存大小限制
了接收数据的最大
长度,需要设置合
适的缓存大小和中
断频率
UART FIFO Mode + DMA 使用DMA直接将接
收到的数据存储到
内存中
可以大大提高
接收效率,适
用于高速数据
传输和大数据
量的接收
需要硬件支持,实
现复杂,需要额外
的DMA控制器和
内存空间,高端芯
片支持程度较好

需要注意的是,选择哪种方式需要根据具体场景的需求硬件条件综合考虑。单字节中断接收可以适用于低速数据传输,而UART+FIFOUART+DMA适用于中高速数据传输和大数据量的接收,具有更高的效率和可靠性。另外,不同芯片和模块对这些方式的支持程度也不同,需要根据具体情况进行选择和配置。

桃芯可实现方案

由于ING916x CPU 处理UART接收数据时,尤其是单字节接收时频繁进入中断,极大地增加了CPU loading,同时CPU无法进入低功耗工作模式。鉴于上述情况,ING916x提供了以下两种接收变长数据的工作方式,在UART接收变长数据完成后,等待UART RXD线上空闲一段时间后快速进入一次中断处理。

UART FIFO Mode Only方式

方案简介

UART FIFO Mode Only方式是仅依赖于UART模块内部的FIFO(先进先出)缓冲区实现接收变长字节数据的方法。在这种方式下,CPU需要定期检查UART接收缓冲区并读取数据。

假设FIFO的深度为32bytes,为了保证RX FIFO不溢出,单次接收到半满状态,即将RXIFLSEL设置为16bytes,同时使能UART的接收中断以及接收超时中断,至此完成配置,等待数据到来。

接收数据时,每到达16bytes就会触发一次接收中断,在中断中读取16bytes数据,清除中断后继续接收数据,如此反复,尾部数据不足16bytes时,则会触发接收超时中断,在中断中读空FIFO,至此传输的数据接收完成,并将所有的数据打包发送给应用层去使用。

配置流程

  1. 配置UART波特率,同时配置使能UART RX FIFO Mode,配置相应RXIFLSEL为0x10.
  2. UART RX开始接收数据,CPU周期性收到UART模块的UARTRTINTR中断,则CPU进入中断处理程序。在中断处理程序里CPU需要把UART RX FIFO中数据读出处理,每次读出16bytes.
  3. 对于UART RX尾部数据,直到CPU收到UART模块的UARTRTINTR中断,则CPU进入中断处理程序。在中断处理程序里CPU需要把UART RX FIFO中的剩余数据读出,应该是3-6bytes,具体方法是先读出3bytes, 然后查询UART模块的RX FIFO空标志位RXFE,直至把UART RX FIFO读空。

UART FIFO Mode + DMA方式

方案简介

UART FIFO Mode + DMA方式是通过使用DMA(直接存储器访问)控制器并结合UART模块内部的FIFO实现UART接收变长字节数据的方法。DMA控制器可以在不占用CPU资源的前提下,将接收到的数据直接传输到指定的内存地址。但是由于ING916XX系列的DMA不支持DMA LEN,而是设置固定长度,所以我们需要开启UART的接收超时中断,等待数据到来。

接收数据时,DMA会自动的将UART中的数据按照最小单元SrcBurstSize将数据循环读出,直到达到最大值TranSize,所以我们需要随时更新TranSize以保证数据持续接收,尾部数据不足SrcBurstSize时,则会触发接收超时中断,在中断中读空FIFO,至此传输的数据接收完成,并将所有的数据打包发送给应用层去使用。

配置流程

  1. 配置UART波特率,同时配置使能UART RX FIFO Mode,配置相应RXIFLSEL为0x7(推荐值)。
  2. 配置DMA模块 其中一个channel配合UART RX handshake工作模式,配置SrcBurstSize为0x2(推荐值)。
  3. 配置完UART和DMA模块后,UART RX开始接收数据,直到CPU收到UART模块的UARTRTINTR中断,则CPU进入中断处理程序。在中断处理程序里CPU需要把UART RX FIFO中的剩余数据读出,应该是3-6bytes,具体方法是先读出3 bytes, 然后查询UART模块的RX FIFO空标志位RXFE,直至把UART RX FIFO读空。同时在中断处理程序里更新DMA配置数值,以便进行下一次UART变长数据接收。

总结

如果UART模块使能FIFO Mode,不配合DMA搬运接收数据的情况,应用中会有很多限制。建议在有UART FIFO且硬件不支持DMA的情况下使用UART FIFO Mode Only方式,譬如ING918XX系列芯片。对于ING916XX系列芯片,建议使用UART FIFO Mode + DMA方式,能够使提升CPU的性能,并且降低系统的功耗。

上述两种桃芯可实现的方案已经完全实现,具体的代码可以查看《ING916XXx系列芯片开发者手册》的UART部分。