我一直在试图找出来自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 如何影响我的数据。
非常感谢!
答案 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引用的部分版本更有用(但我有硬件背景):
X_MODIFY在ADSP-BF537 Blackfin Processor Hardware Reference的第5-88页指定:
答案 1 :(得分:0)
在您的代码中,X-MODIFY是iRxBuffer1的每个数据的长度(以字节为单位)。
通知DMA,其中(哪个地址)从中获取下一个数据。 DMA总线地址将以此X-MODIFY值递增。