当今,串行通信协议在各种嵌入式系统和物联网设备中被广泛应用。其中,UART作为最基础的串行通信协议之一,被广泛应用于微控制器、传感器、通信模块等设备之间的数据传输。在UART通信中,数据的传输方式通常是定长字节,即每次传输的字节数是固定的。然而,在一些特殊的应用场景中,变长字节数据的传输方式则更加适用。
在这篇博客中,我将介绍UART接收变长字节数据的优势和实现方法,以及与定长字节数据传输方式的区别,并探讨两种桃芯可实现的方法————UART FIFO Mode Only方式和UART FIFO Mode + DMA方式。
优势分析
在实际应用中,UART接收变长字节数据的场景很常见,下面列举了几种比较常见的场景:
- 传感器数据传输
- 文件传输
- 音视频数据传输
- 协议传输
这些场景都有显著特点是数据长度不固定 、 传输时间不固定,可能会在不同的通信过程中发生变化。除此之外,甚至会当有一些硬件不支持流控。在这些情况下,就需要用到UART接收变长字节数据的方法,优势:
- 灵活性高:可以根据实际需要动态调整接收数据的长度,适应不同场景的需求。
- 节省资源:只需要接收实际需要的数据,避免了接收固定长度数据时可能产生的资源浪费。
- 提高通信效率:变长字节数据可以根据实际数据量进行发送,减少了通信过程中的空闲时间,提高了通信效率。
实现方式
在实际应用中常见的实现方式有三种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+FIFO和UART+DMA适用于中高速数据传输和大数据量的接收,具有更高的效率和可靠性。另外,不同芯片和模块对这些方式的支持程度也不同,需要根据具体情况进行选择和配置。
桃芯可实现方案
由于ING916x CPU 处理UART接收数据时,尤其是单字节接收时频繁进入中断,极大地增加了CPU loading,同时CPU无法进入低功耗工作模式。鉴于上述情况,ING916x提供了以下两种接收变长数据的工作方式,在UART接收变长数据完成后,等待UART RXD线上空闲一段时间后快速进入一次中断处理。
UART FIFO Mode Only方式
方案简介
UART FIFO Mode Only方式是仅依赖于UART模块内部的FIFO(先进先出)缓冲区实现接收变长字节数据的方法。在这种方式下,CPU需要定期检查UART接收缓冲区并读取数据。
假设FIFO的深度为32
bytes,为了保证RX FIFO不溢出,单次接收到半满状态,即将RXIFLSEL
设置为16
bytes,同时使能UART的接收中断以及接收超时中断,至此完成配置,等待数据到来。
接收数据时,每到达16
bytes就会触发一次接收中断,在中断中读取15bytes数据,清除中断后继续接收数据,如此反复,尾部数据不足16
bytes时,则会触发接收超时中断,在中断中读空FIFO,至此传输的数据接收完成,并将所有的数据打包发送给应用层去使用。
配置流程
- 配置UART波特率,同时配置使能UART RX FIFO Mode,配置相应RXIFLSEL为0x10.
- UART RX开始接收数据,CPU周期性收到UART模块的UARTRXINTR中断,则CPU进入中断处理程序。在中断处理程序里CPU需要把UART RX FIFO中数据读出处理,每次读出
15
bytes. - 对于UART RX尾部数据,直到CPU收到UART模块的UARTRTINTR中断,则CPU进入中断处理程序。在中断处理程序里CPU需要把UART RX FIFO中的剩余数据读出,应该是
1-15
bytes,具体方法是每次读出1
bytes, 然后查询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,至此传输的数据接收完成,并将所有的数据打包发送给应用层去使用。
配置流程
- 配置UART波特率,同时配置使能UART RX FIFO Mode,配置相应RXIFLSEL为0x7(推荐值)。
- 配置DMA模块 其中一个channel配合UART RX handshake工作模式,配置SrcBurstSize为0x2(推荐值)。
- 配置完UART和DMA模块后,UART RX开始接收数据,直到CPU收到UART模块的UARTRTINTR中断,则CPU进入中断处理程序。在中断处理程序里CPU需要把UART RX FIFO中的剩余数据读出,应该是
1-6
bytes,具体方法是每次读出1
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部分。