3. DMA 控制器架构:通道、请求与应答、传输粒度
DMA(Direct Memory Access)控制器是嵌入式系统中负责在内存与外设之间、或内存与内存之间直接搬运数据的硬件引擎。理解 DMA 控制器的内部架构——尤其是通道管理、请求/应答握手协议以及传输粒度——是编写高效、无竞争 RAW 数据流驱动的核心前提。
3.1 DMA 通道:独立的数据搬运流水线
DMA 控制器内部包含多个独立通道(Channel),每个通道相当于一条专用的数据搬运流水线。通道之间在硬件层面并行工作,互不阻塞。
| 通道属性 | 说明 | 典型配置值 |
|---|---|---|
| 源地址寄存器 | 数据读取的起始地址(外设数据寄存器或内存缓冲区) | 0x4000_3800(ADC 数据寄存器) |
| 目标地址寄存器 | 数据写入的起始地址(内存缓冲区或外设输出寄存器) | 0x2000_0400(SRAM 缓冲区) |
| 传输计数寄存器 | 剩余待传输的数据单元数量(按传输粒度计数) | 1024(半字) |
| 控制配置寄存器 | 传输方向、地址增量模式、循环模式、中断使能等 | 0x0000_0035 |
| 状态标志寄存器 | 传输完成、半传输完成、传输错误等硬件标志 | 0x0000_0001(完成标志置位) |
关键概念:每个通道拥有自己独立的寄存器组,因此可以同时配置为不同的传输方向、不同的外设和不同的优先级。在 RAW 多通道采集场景中,通常一个通道专用于图像传感器数据搬运,另一个通道专用于音频数据搬运。
3.2 请求与应答信号:DMA 与外设的握手协议
DMA 传输的启动并非由 CPU 逐字节触发,而是通过硬件信号线完成请求(Request)与应答(Acknowledge)握手。这套机制保证了数据在“外设准备好”时才被搬运,避免空读或数据覆盖。
实战要点:在 RAW 图像传感器驱动中,VSYNC(帧同步)信号通常连接到 DMA 的硬件触发输入,每帧开始后 DMA 自动响应外设的逐行请求,无需 CPU 干预。务必确认外设的 REQ 信号极性(高电平有效/上升沿有效)与 DMA 控制器的触发配置一致。
3.3 DMA 传输粒度:字节、半字与字
传输粒度(Transfer Width)决定了 DMA 每次搬运操作的数据宽度。选择错误的粒度会导致数据错位、总线效率下降甚至外设寄存器访问异常。
| 粒度 | 位宽 | 适用外设 | 总线访问次数 | 典型场景 |
|---|---|---|---|---|
| 字节(Byte) | 8 位 | UART、SPI(8 位模式)、I²C | 1 次 / 字节 | 低速串行通信、字符流 |
| 半字(Half-word) | 16 位 | ADC(12/16 位)、音频 I²S、定时器捕获 | 1 次 / 半字 | RAW 图像像素(每像素 10~16 位) |
| 字(Word) | 32 位 | 并行摄像头接口(DVP)、高速 DAC、内存拷贝 | 1 次 / 字 | 高带宽数据流、帧缓冲区搬运 |
粒度对齐规则:源端和目标端的传输粒度可以不同(例如从 8 位外设读取字节,在内存中组合为 32 位字),但必须满足:
• 源地址必须按源粒度对齐(半字访问地址必须为 2 的倍数)
• 目标地址必须按目标粒度对齐(字访问地址必须为 4 的倍数)
• 传输计数 = 总字节数 ÷ 源粒度字节数
• 源地址必须按源粒度对齐(半字访问地址必须为 2 的倍数)
• 目标地址必须按目标粒度对齐(字访问地址必须为 4 的倍数)
• 传输计数 = 总字节数 ÷ 源粒度字节数
3.4 传输粒度与 RAW 数据格式的匹配
在 RAW 格式输出场景中,像素深度通常为 10 位、12 位或 14 位。存储时一般按 16 位半字对齐(高位补零或符号扩展),因此 DMA 传输粒度应配置为半字(16 位)。
常见错误:若将 12 位 RAW 数据按字节粒度传输,则每两个像素会占用 3 个字节,导致内存中像素边界错位,后续软件解析时必须做位操作重组,增加 CPU 负载且容易出错。始终优先使用半字粒度传输 RAW 像素数据。
3.5 多通道优先级与仲裁
当多个 DMA 通道同时发出请求时,DMA 控制器内部的仲裁器(Arbiter)根据优先级策略决定哪个通道获得总线控制权。
- 固定优先级:通道编号越小优先级越高(如通道 0 > 通道 1 > ...)。适用于明确知道哪个外设最紧急的场景。
- 循环优先级(Round-Robin):所有通道轮流获得总线访问权,防止低优先级通道被饿死。适用于多个外设带宽需求相近的场景。
- 混合模式:部分通道配置为高优先级(如实时视频流),其余通道使用循环模式。
配置建议:在 RAW 图像采集系统中,将图像传感器对应的 DMA 通道设置为最高固定优先级,音频或调试串口通道设置为循环优先级。这样可以保证图像帧数据不因总线竞争而丢失像素。
3.6 本章小结
| 知识点 | 核心要点 |
|---|---|
| DMA 通道 | 每个通道独立配置源/目标地址、传输计数和控制选项,支持并行传输 |
| 请求与应答 | 外设通过 REQ 信号触发 DMA 传输,DMA 通过 ACK 信号确认并接管总线 |
| 传输粒度 | 字节(8 位)、半字(16 位)、字(32 位),必须与外设数据宽度和地址对齐 |
| RAW 数据匹配 | 10~14 位 RAW 像素推荐使用半字粒度,避免位操作和像素错位 |
| 优先级仲裁 | 固定优先级保证实时性,循环优先级防止饿死,混合模式兼顾两者 |