免责声明:本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
前言
本章继续介绍AXI DMA的使用。
一、A DMA operation for the S2MM channel is set up and started by the following sequence:
1. 启动 S2MM 通道
- 步骤 1:通过设置
S2MM_DMACR.RS = 1
来启动 S2MM 通道,表示 DMA 传输开始运行。- S2MM_DMACR.RS:这个寄存器位用于启动或停止 DMA 操作。设置为 1 启动 DMA 通道,设置为 0 停止 DMA 操作。
- DMASR.Halted:这是一个状态位,指示 DMA 是否停止。启动 S2MM 后,
Halted
位应该被清除(去assert),表示 DMA 通道已经开始运行。
2. 启用中断(可选)
- 步骤 2:如果需要启用中断,可以通过写 1 到以下两个寄存器来启用:
S2MM_DMACR.IOC_IrqEn
:启用传输完成中断。S2MM_DMACR.Err_IrqEn
:启用错误中断。- 延迟中断、延迟计数 和 阈值计数 在启用 Direct Register Mode 时不可用,因此在该模式下,它们的配置无效。
3. 配置目标地址
- 步骤 3:写入有效的目标地址到
S2MM_DA
寄存器:- S2MM_DA:目标地址寄存器,用于指定数据写入的位置。
- 如果 AXI DMA 配置为 大于 32 位的地址空间,则需要编程
S2MM_DA MSB
寄存器。
4. 对齐要求
- 步骤 4:如果未启用数据重对齐(DRE),则需要确保目标地址对齐,否则可能导致未定义的结果。对齐要求通常是根据 流数据宽度 来决定的。例如:
- 如果 Memory Map Data Width 为 32 位(4 字节),那么地址应该是 4 字节对齐的,即 0x0, 0x4, 0x8, 0xC 等。
- 如果启用 DRE(数据重对齐引擎),并且 流数据宽度小于 128 位,则目标地址可以位于任意字节偏移量,无需对齐。
5. 配置接收缓冲区长度
- 步骤 5:将接收缓冲区的字节数写入
S2MM_LENGTH
寄存器:- S2MM_LENGTH:指定要接收的字节数。必须为非零值才能开始接收,值为零时没有任何效果。
- 最小接收缓冲区长度:值应该大于或等于最大接收到的数据包大小,才能保证正常接收。小于接收字节数的长度会导致未定义的结果。
- 在 Micro DMA 模式 下,
S2MM_LENGTH
的值必须与从 S2MM AXI4-Stream 接口接收的字节数完全匹配。 - 写入顺序:所有其他 S2MM 寄存器可以按照任意顺序写入,但
S2MM_LENGTH
必须最后写入。