X_MODIFY在ADSP-BF537的DMA中做了什么? (Analog Devices)

时间:2015-03-02 12:33:45

标签: c signal-processing dma microprocessors

我一直在试图找出来自EZ-Kit Lite BF537(ADI)的“X_MODIFY”的问题,这是DMA配置的一部分。究竟是什么变化?这是循环开始后的步骤吗?

这是代码。你们可以在 Woon-Seng Gan和Sen M. Kuo的书中的嵌入式信号处理与微信号架构的示例会议中找到它。

*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 如何影响我的数据。

非常感谢!

2 个答案:

答案 0 :(得分:0)

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寄存器设置为在1D模式下运行,只有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数据实现双缓冲区   像图像。我们展示了更多关于如何在Hands-On中设置2D DMA的示例   实验7.4和7.5。

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

实际上,你所提供的东西设置了几个循环,基本上就像:

//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
  3. X_MODIFY在ADSP-BF537 Blackfin Processor Hardware Reference的第5-88页指定:

    DMAx_X_MODIFY/MDMA_yy_X_MODIFY Registers

答案 1 :(得分:0)

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

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