This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8379万D:16位EMIF读取问题DMA

Guru**** 2587365 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/655019/tms320f28379d-16-bit-emif-reading-problem-dma

部件号:TMS320F2.8379万D
主题中讨论的其他部件: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;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,Johann,

    初始化SDRAM中的数据后,您是否检查是否已正确写入数据。 基本上是通过CCS内存监视窗口检查还是通过CPU读取代码?

    查看初始化代码-

    ---

    对于(a=0;a<MEM_BUFFER_SIZE;a++)

    G_ulSrcBuf0[A]= InitData;

    }

    InitData = InitData + 1;

    ---

    在循环内部,所有位置都写入了相同的数据。 InitData正在for循环之外递增。 对吧?

    此致,

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢Vivek的及时回复。是的,我写了5个相同的字,每个字是每个中断的总内存缓冲区大小,每一个都是16位。这是为了测试目的。 在最终版本中,每个单词都是来自每个ADC通道的数据。
    在地址0x8000000000处使用内存浏览器窗口(即SDRAM_CS0_START_ADDR)时,每次中断时,我都可以看到值的变化(递增一)。 然后,DMA应处理此问题,将其写入SDRAM。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我也遵循了这篇文章中的步骤,因为这与我的问题非常相似...然而,这似乎在当时也没有解决...也许现在有一个示例代码...

    e2e.ti.com/.../37.2769万
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,c200Ware中有SDRAM的DMA示例(C2000Ware_1_00_02_00\device_support\f2837xd\examples\CPU1 \emif1_16bit_SDRAM_DMA2837 \emif1_16bit_SDRAM_DMA)。

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    示例代码是否有助于解决问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,谢谢Vivek,我已经解决了这个问题。 感谢你的帮助。