4. DMA 传输模式详解:单次传输、循环传输、块传输、链式传输(Linked List)

S32K3 的 eDMA 引擎支持四种核心传输模式,分别对应不同的数据采集场景。理解这些模式的触发条件、地址更新规则和中断协同方式,是设计高效 DMA 系统的关键。本章将逐一剖析每种模式的结构与适用场景。

4.1 单次传输(Single Transfer)

单次传输是最基础的 DMA 操作模式。每次触发请求(DMA Request)仅完成一个源地址到目的地址的数据搬运,传输宽度可以是 8/16/32 位。传输完成后,TCD(传输控制描述符)中的 CITER(当前迭代计数)减 1,当 CITER 归零时,DMA 通道自动停止并可选地触发中断。

关键特征: 每次请求只搬运 1 个数据单元(Major Loop 的 Minor Loop 计数为 1),适合低速外设(如 UART 单字节接收)或事件驱动的单次采样。
单次传输模式流程 外设触发请求 eDMA 搬运 1 次 目标内存 CITER == 0 ? 触发完成中断 等待下次触发
应用提示: 在 S32K3 的 ADC 单次采样场景中,每次软件触发或硬件触发后,DMA 仅搬运一个通道的转换结果到内存缓冲区。此时中断服务程序(ISR)只需处理单个数据点,延迟最低。

4.2 循环传输(Circular Transfer)

循环传输通过 TCD 的 通道链接(Channel Linking) 功能实现。当主循环(Major Loop)完成后,DMA 通道不会停止,而是自动重新加载初始的 CITER 和源/目的地址,形成一个无限循环的数据搬运管道。这在连续数据采集(如麦克风阵列、电机电流采样)中极为常见。

参数 配置值 说明
CITER 缓冲区长度(如 256) 每次主循环搬运的数据单元数
BITER 与 CITER 相同 初始迭代计数,用于循环重载
DMA_CR[ERCA] 1(Enable Round Robin) 启用通道循环仲裁
中断使能 DONE 中断 每次主循环完成时触发,用于缓冲区切换
循环传输模式:环形缓冲区与自动重载 ADC 连续采样 eDMA 搬运 环形缓冲区 [0..255] 主循环完成 → 自动重载 CITER 与地址 DONE 中断
注意事项: 循环传输模式下,中断服务程序必须快速处理缓冲区切换(如更新指针或标志位),避免在下一个主循环完成前未完成处理,导致数据覆盖。S32K3 的 eDMA 支持在中断中修改 TCD 的 DADDR(目的地址)来实现双缓冲切换。

4.3 块传输(Block Transfer)

块传输本质上是 Minor Loop 多次迭代 的组合。一个 Minor Loop 完成一次源到目的的数据搬运,多个 Minor Loop 构成一个 Major Loop(即一个数据块)。块传输的典型配置是:Minor Loop 计数 = 1(单次搬运),Major Loop 计数 = 块大小(如 64 个字)。

块传输的优势在于:一次触发完成整个数据块的搬运,大幅减少 CPU 干预。S32K3 的 eDMA 支持在块传输过程中通过 分散-收集(Scatter-Gather) 功能动态更新 TCD,实现非连续内存区域的块传输。

性能指标: 在 S32K3 上,块传输的吞吐量可达 400 MB/s(在 160 MHz 系统时钟下),适合高速 ADC(如 12 位 5 Msps)的批量数据搬运。
块传输模式:Minor Loop 与 Major Loop 结构 一次触发请求 Major Loop(块传输) Minor Loop 1:搬运 1 单元 Minor Loop 2:搬运 1 单元 Minor Loop N:搬运 1 单元 连续内存块 (N 个单元) Major Loop 完成 → 触发中断

4.4 链式传输(Linked List Transfer)

链式传输是 S32K3 eDMA 最强大的特性之一。它通过 TCD 中的 DLAST_SGA(最后一个目的地址调整/散聚地址) 字段,在每次 Major Loop 完成后自动加载下一个 TCD,形成一个可动态配置的传输链。每个 TCD 可以独立配置源地址、目的地址、传输宽度和中断使能。

链式传输的核心价值在于:无需 CPU 干预即可执行一系列预定义的复杂传输序列。例如,在数据采集中,链式传输可以依次搬运 ADC 结果、状态寄存器、时间戳到不同的内存区域。

特性 单次/循环传输 链式传输
TCD 数量 1 个 多个(最多 32 个通道可链接)
配置灵活性 固定源/目的地址 每个 TCD 独立配置
中断触发 每次 Major Loop 完成 可在任意 TCD 完成后触发
典型应用 单缓冲区采集 多通道扫描、协议解析
链式传输模式:TCD 链表与执行流程 TCD 1 源: ADC 结果寄存器 目的: 缓冲区 A DLAST_SGA → TCD 2 TCD 2 源: 定时器捕获 目的: 缓冲区 B DLAST_SGA → TCD 3 TCD 3 源: 状态寄存器 目的: 缓冲区 C DLAST_SGA → NULL 执行顺序:TCD 1 → TCD 2 → TCD 3 → 停止(或循环回 TCD 1) TCD 3 完成触发中断
链式传输配置要点:
  • 每个 TCD 的 DLAST_SGA 字段必须指向下一个 TCD 的起始地址(32 位对齐)。
  • 最后一个 TCD 的 DLAST_SGA 应设置为 0 或指向循环链表的头节点。
  • 中断使能位 INT_MAJOR 可以在任意 TCD 中单独设置,实现关键节点的中断通知。
  • 在 S32K3 的 SDK 中,使用 EDMA_DRV_ConfigSingleTCD() 逐个配置 TCD,然后通过 EDMA_DRV_ConfigLinkedTCD() 建立链接关系。

4.5 四种模式对比与选型指南

模式 触发次数/块 中断频率 CPU 负载 适用场景
单次传输 1 次触发 = 1 次搬运 高(每次搬运) 高 低速外设、事件触发
循环传输 1 次触发 = 1 次搬运(无限循环) 中(每块完成) 中 连续数据流、环形缓冲区
块传输 1 次触发 = N 次搬运 低(每块完成) 低 高速批量数据、ADC 块采集
链式传输 1 次触发 = 多块序列 可配置(关键节点) 极低 多通道扫描、复杂协议
选型建议: 在 S32K3 数据采集系统中,推荐将 块传输 与 链式传输 结合使用。例如,使用链式传输配置多个块传输 TCD,每个 TCD 负责一个 ADC 通道的 64 字块采集,链尾触发中断进行数据后处理。这样既保证了高吞吐量,又实现了多通道的灵活调度。