主题中讨论的其他部件:C2000WARE
您好,
我正在将16位SDRAM连接到tms320f2837d,并且我正在使用DMA CH1来向其写入外部ADC读数,这很正常。 在用户停止ADC采样后,我想读取 之前使用DMA CH2写入的所有16位值,然后使用UART传输这些值。 但是,DMA通道2仅重复读取最后写入的16位值。 我确信没有硬件问题,因为我运行了示例程序"emif1_32bit_SDRAM",并且没有返回错误,因此我知道读/写内存不是问题。 DMA CH2读取的地址似乎不是从内存的初始内存位置开始,而是在每次内存访问后递增。 这应该自动执行还是应该为它编程? 我已经看了"emif1_16bit_SDRAM_DMA"上提供的代码示例,但是此示例只访问一次内存,而我的情况不是这样,我想重复这样做,因为我想传输使用UART获得的数据。
下面是我正在实施的一些代码片段,我目前正在将变量InitData用作虚拟变量,而不是ADC数据...
感谢你的帮助
Johann
----------------------------------
中断无效XINT1_ISR(void)// 当ADC具有数据就绪时发生的中断
{
INT A;
DMA_DstDataClear();
对于(a=0;a<MEM_BUFFER_SIZE;a++)
{
G_ulSrcBuf0[A]= InitData;
}
InitData = InitData + 1;
//写入外部MEM (16位)
//
EALLOW;
DmaRegs.CH1.control.bit.run = 1;
DmaRegs.CH1.control.bit.PERINTFRC = 1;
while (DmaRegs.CH1.control.bit.TRANSFERSTS !=1){};
while (DmaRegs.CH1.control.bit.TRANSFERSTS !=0){};
EDIS;
对于(i=0;i<123;i+){}//延迟
PieCtrlRegs.PIEACK/ALL = PIEACK_Group1;//确认此中断以从组1获取更多信息
}
全局变量:
//
//全局
//
#pragma data_section(g_ulSrcBuf0,"ramgs0");//0
#pragma data_section(g_ulDstBuf1,"ramgs1");//1.
uINT32 g_ulSrcBuf0[MEM_BUFFER_Size];
UINT32 g_ulDstBuf1[MEM_BUFFER_Size];
//远端内存中的缓冲区
__attribute___(far) volatile UINT32 g_ulSDRAMBuf[MEM缓冲 器大小];
易失性UINT32 InitData =0;
易失性UINT32 *DMADest;
易失性UINT32 *DMASOource;
#define SDRAM_CS0_START_ADDR 0x8000万
#define SDRAM_CS0_SIZE 0x30万
#define MEM_BUFFER_SIZE 5 // 5字,每个十六位
我的DMA缓冲区有5个字长,使用16位长度:
//
//初始化DMA
//
DMAInitialize();
//
//配置DMA通道1 (16位数据大小)
//
DMADest = g_ulSDRAMBuf;
DMASource =(volatile UINT32 *)g_ulSrcBuf0;//
DMACH1AddrConfig32bit (DMADest,DMASource);
//
//将设置为使用16位数据大小,指针基于16位字
//
DMACH1BurstConfig (4,1,1);
DMACH1TransferConfig (0,1,1);// 01 1.
DMACH1WrapConfig (0xFFFF,0,0xFFFF,0);
//
//
//也使用16位模式
//
DMACH1ModeConfig (0x0,PERINT_ENABLE,OneShot_enable,
CONT_DISABLE,SYNC_DISABLE,SYNC_SRC,
OVRFLOW_DISABLE,CHINT_BIT,CHINT_END,CHINT_ENABLE);
//
//配置DMA通道2 (16位数据大小)
//
DMADest =(volatile UINT32 *)g_ulDstBuf1;//!!!!!!
DMASource = g_ulSDRAMBuf;
DMACH2AddrConfig32bit (DMADest,DMASource);
//
//将设置为使用16位数据大小,指针基于16位字
//
DMACH2BurstConfig (4,1,1);// 4 1 1.
DMACH2TransferConfig (0,1,1);// 01 1.
DMACH2WrapConfig (0xFFFF,0,0xFFFF,0);
//
//由于这是一个静态副本,所以使用单触发模式,因此只需要一个触发器
//也使用16位模式
//
DMACH2ModeConfig (0x0,PERINT_ENABLE,OneShot_enable,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,
十六位,CHINT_END,CHINT_ENABLE);
StartDMACH1();
StartDMACH2();
//
//从EXT MEM读取(16位)
//
EALLOW;
DmaRegs.CH2.control.bit.run = 1;
DmaRegs.CH2.control.bit.PERINTFRC = 1;//中断
while (DmaRegs.CH2.control.bit.TRANSFERSTS !=1){};
while (DmaRegs.CH2.control.bit.TRANSFERSTS !=0){};
EDIS;