-
初始化和复位:
- 写入MM2S_DMACR和S2MM_DMACR寄存器,将复位位设置为1
- 等待复位完成(复位位自动清零)
- 读取MM2S_DMASR和S2MM_DMASR寄存器,清除所有中断状态
-
创建和配置描述符链:
- 分配内存给描述符(通常是64字节对齐)
- 每个描述符通常包含以下字段:
- NXTDESC:下一个描述符的地址
- BUFFER_ADDRESS:数据缓冲区的地址
- CONTROL:包含EOL(End of List)、传输长度等信息
- STATUS:DMA硬件会更新这个字段
- 配置每个描述符,设置正确的地址和控制信息
- 将描述符链接成环形或线性结构
-
配置DMA控制寄存器:
- 设置MM2S_DMACR和S2MM_DMACR:
- 启用SG模式(设置SGMode位)
- 配置中断(如IOC_IrqEn, Err_IrqEn等)
- 设置其他必要的控制位(如循环模式、突发大小等)
- 设置MM2S_DMACR和S2MM_DMACR:
-
设置描述符起始地址:
- 将第一个描述符的地址写入MM2S_CURDESC和S2MM_CURDESC寄存器
-
配置DMA通道:
- 将最后一个要处理的描述符地址写入MM2S_TAILDESC和S2MM_TAILDESC寄存器
- 这告诉DMA控制器描述符链的结束位置
-
启动DMA传输:
- 设置MM2S_DMACR和S2MM_DMACR的RS(Run/Stop)位为1
- DMA控制器开始处理描述符链
-
监控传输状态:
- 轮询MM2S_DMASR和S2MM_DMASR寄存器或等待中断
- 检查Idle位、错误位、完成中断等状态
-
处理完成和错误:
- 检查每个已完成描述符的状态字段
- 处理传输完成的数据(如果是接收操作)
- 如果发生错误,分析错误类型并采取相应措施
- 清除相关状态标志
-
维护和更新:
- 在循环模式下,可能需要周期性地更新描述符内容
- 动态更新TAILDESC寄存器以处理新添加的描述符
- 管理描述符和数据缓冲区的内存,确保DMA操作不会覆盖正在使用的数据
额外注意事项:
- 确保描述符和数据缓冲区在DMA可访问的内存区域
- 管理缓存一致性,特别是在使用缓存的系统中
- 考虑使用DMA中断来减少轮询开销
- 在多通道操作中,需要单独配置每个通道
- 根据系统需求优化描述符数量和缓冲区大小
SG模式的配置比简单模式更复杂,但提供了更大的灵活性,特别适合处理不连续的内存区域或需要频繁更改传输参数的场景。