【问题标题】:What does the X_MODIFY do in the ADSP-BF537's DMA? (Analog Devices)X_MODIFY 在 ADSP-BF537 的 DMA 中起什么作用? (模拟设备)
【发布时间】:2015-03-02 12:33:44
【问题描述】:

我在试图弄清楚 EZ-Kit Lite BF537(模拟设备)中的 "X_MODIFY" 是什么意思时遇到了问题,这是 DMA 配置的一部分。它究竟改变了什么?这是循环开始后的步骤吗?

这里是代码。你们可以在 Woon-Seng Gan 和 Sen M. Kuo 所著的 Embedded Signal Processing with the Micro Signal Architecture 一书中的示例会话中找到它。

*pDMA3_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1 | DMA2D | DI_SEL;
// Start address of data buffer
*pDMA3_START_ADDR = iRxBuffer1;
// DMA loop count
*pDMA3_X_COUNT = 2*INPUT_SIZE;
// DMA loop address increment
*pDMA3_X_MODIFY = 4;
*pDMA3_Y_COUNT = TOTAL_FRAME;
*pDMA3_Y_MODIFY = 4;

我正在处理音频帧,将来可能需要使用两个以上的通道,因此我想了解 X_MODIFY 如何影响我的数据。

非常感谢!

【问题讨论】:

  • 鉴于您的具体问题,如果您包含指向您看到 X_MODIFY 的文档的链接,将会很有帮助。我们可以猜测,很有可能是正确的,但我们不应该这样做。这样可以让更多人更轻松地回答您的问题。
  • 请提供页码,这样我们就不必去寻找代码了。你在寻求帮助。请让人们轻松地为您提供帮助。

标签: c signal-processing dma microprocessors


【解决方案1】:

X_MODIFY 寄存器在您引用的书的page 293 上进行了解释:

X_COUNT 寄存器指定所需的传输次数,并且
X_MODIFY 寄存器指定每个数据后的字节增量
转移。请注意,数据传输可以是 8、16 或 32 位。因此,X_COUNT
与字数有关,字可以是8位、16位或32位。但是,
X_MODIFY 始终以字节数表示。 Blackfin 处理器允许
一维 (1D) 和二维 (2D) DMA 模式。当 DMAx_
图 7.1 所示的 CONFIG 寄存器设置为操作在一维模式下,只有 X_
需要设置 COUNT 和 X_MODIFY 寄存器。否则,当 2D 模式
设置后,除了
还必须设置Y_COUNT和Y_MODIFY寄存器 X_COUNT 和 X_MODIFY 寄存器。 2D DMA 可视为嵌套
循环,其中 X_COUNT 和 X_MODIFY 指定内部外观和 Y_COUNT
和 Y_modify 指定外循环。 2D DMA 在
为块处理模式和寻址二维数据实现双缓冲区
像图像。我们将展示更多有关如何在动手操作中设置 2D DMA 的示例
实验 7.4 和 7.5。

鉴于您提供的设置,DMA 通道 3(串行端口 0 接收,SPORT 0 Rx)的每次传输将是 32 位,并且在每次传输后(在内循环内)内存地址将增加 4 个字节( X_MODIFY)。每个内部循环之间也会增加 4 个字节(Y_MODIFY)。

实际上,您提供的内容基本上设置了几个循环:

//SETUP DMA
// Config is set to: Memory write | Transfer size = 32 bits | generate interrupt
//                   | autobuffer | 2D DMA mode 
//                   | interrupt is on completion of each X_COUNT loop
DMA3_START_ADDR = iRxBuffer1;
DMA3_X_COUNT = 2*INPUT_SIZE;
DMA3_X_MODIFY = 4;
DMA3_Y_COUNT = TOTAL_FRAME;
DMA3_Y_MODIFY = 4;

//Begin DMA
while (DMA3_CONFIG & DMAEN) { //autobuffer mode
    DMA3_CURR_ADDR = DMA3_START_ADDR;
    for(DMA3_CURR_Y_COUNT = DMA3_Y_COUNT; DMA3_CURR_Y_COUNT > 0; DMA3_CURR_Y_COUNT-- ) {
        for(DMA3_CURR_X_COUNT = DMA3_X_COUNT; DMA3_CURR_X_COUNT > 0; DMA3_CURR_X_COUNT--){
            //Transfer data from serial port 0 to memory at location DMA3_CURR_ADDR.
            //  Note that here is actually the hardware waiting for an interrupt to be
            //  generated by the receive side of serial port 0 indicating that data is
            //  available.  Once it is available, the data is DMA'ed into memory and
            //  the process continues.
            if(DMA3_CURR_X_COUNT > 1) {
                DMA3_CURR_ADDR += DMA3_X_MODIFY;
            }
        }
        if(DMA3_CURR_Y_COUNT > 1) {
            DMA3_CURR_ADDR += DMA3_Y_MODIFY;
            //Generate interrupt
        }
    }
    DMA3_CURR_ADDR += DMA3_X_MODIFY;
    //Generate interrupt
}

就我个人而言,我发现以下参考资料比 Google 提供的您引用的书的部分版本更有用(但是,我有硬件背景):

  1. ADSP-BF537 Blackfin Processor Hardware Reference 5-75 – 5-94
  2. ADSP-BF537 Data Sheet Rev. J

X_MODIFY 在ADSP-BF537 Blackfin Processor Hardware Reference 的第 5-88 页上指定:

【讨论】:

    【解决方案2】:

    在您的代码中,X-MODIFY 是 iRxBuffer1 的每个数据的长度(以字节为单位)。

    通知 DMA,从哪里(哪个地址)获取下一个数据。 DMA 总线地址将按此 X-MODIFY 值递增。

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多