4. DMA 传输模式详解:单次传输、循环传输、块传输、链式传输(Linked List)
S32K3 的 eDMA 引擎支持四种核心传输模式,分别对应不同的数据采集场景。理解这些模式的触发条件、地址更新规则和中断协同方式,是设计高效 DMA 系统的关键。本章将逐一剖析每种模式的结构与适用场景。
4.1 单次传输(Single Transfer)
单次传输是最基础的 DMA 操作模式。每次触发请求(DMA Request)仅完成一个源地址到目的地址的数据搬运,传输宽度可以是 8/16/32 位。传输完成后,TCD(传输控制描述符)中的 CITER(当前迭代计数)减 1,当 CITER 归零时,DMA 通道自动停止并可选地触发中断。
4.2 循环传输(Circular Transfer)
循环传输通过 TCD 的 通道链接(Channel Linking) 功能实现。当主循环(Major Loop)完成后,DMA 通道不会停止,而是自动重新加载初始的 CITER 和源/目的地址,形成一个无限循环的数据搬运管道。这在连续数据采集(如麦克风阵列、电机电流采样)中极为常见。
| 参数 | 配置值 | 说明 |
|---|---|---|
| CITER | 缓冲区长度(如 256) | 每次主循环搬运的数据单元数 |
| BITER | 与 CITER 相同 | 初始迭代计数,用于循环重载 |
| DMA_CR[ERCA] | 1(Enable Round Robin) | 启用通道循环仲裁 |
| 中断使能 | DONE 中断 | 每次主循环完成时触发,用于缓冲区切换 |
4.3 块传输(Block Transfer)
块传输本质上是 Minor Loop 多次迭代 的组合。一个 Minor Loop 完成一次源到目的的数据搬运,多个 Minor Loop 构成一个 Major Loop(即一个数据块)。块传输的典型配置是:Minor Loop 计数 = 1(单次搬运),Major Loop 计数 = 块大小(如 64 个字)。
块传输的优势在于:一次触发完成整个数据块的搬运,大幅减少 CPU 干预。S32K3 的 eDMA 支持在块传输过程中通过 分散-收集(Scatter-Gather) 功能动态更新 TCD,实现非连续内存区域的块传输。
4.4 链式传输(Linked List Transfer)
链式传输是 S32K3 eDMA 最强大的特性之一。它通过 TCD 中的 DLAST_SGA(最后一个目的地址调整/散聚地址) 字段,在每次 Major Loop 完成后自动加载下一个 TCD,形成一个可动态配置的传输链。每个 TCD 可以独立配置源地址、目的地址、传输宽度和中断使能。
链式传输的核心价值在于:无需 CPU 干预即可执行一系列预定义的复杂传输序列。例如,在数据采集中,链式传输可以依次搬运 ADC 结果、状态寄存器、时间戳到不同的内存区域。
| 特性 | 单次/循环传输 | 链式传输 |
|---|---|---|
| TCD 数量 | 1 个 | 多个(最多 32 个通道可链接) |
| 配置灵活性 | 固定源/目的地址 | 每个 TCD 独立配置 |
| 中断触发 | 每次 Major Loop 完成 | 可在任意 TCD 完成后触发 |
| 典型应用 | 单缓冲区采集 | 多通道扫描、协议解析 |
- 每个 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 次触发 = 多块序列 | 可配置(关键节点) | 极低 | 多通道扫描、复杂协议 |