TI中文支持网
TI专业的中文技术问题咨询交流网站

关于TMS320F28377 操作镁光SDRAM(MT48LC4M16A2P)的问题

在通过EMIF2操作外部SDRAM的时候,发现向CS0片选区一个固定的地址写入数据,所有的地址都会变成该数据。检查程序无果后,到TI官网下载controlSUIT工具,参考emif1_16bit_sdram_far_cpu01和emif_32bit_sdram_cpu01两个工程,将两个demo的EMIF1配置改成EMIF2,继续进行测试,发现同样的问题 。我想请教有人知道原因的吗?我在论坛上看见2014年有人问过TI工程师类似的问题,但是貌似没有解决关键问题。

Green Deng:

你好,能否更详细描述一下这个情况?
另外,用例程测试的时候只是将例程中的EMIF1改成EMIF2吗?有做过其他修改吗?

ocean zh:

回复 Green Deng:

void main(void)
{int i = 0;
InitSysCtrl();InitGpio();// Skipped for this exampleDINT;// Disable interruptsInitPieCtrl();
//Disable CPU interrupts and clear all CPU interrupt flags;EALLOW;IER = 0x0000;IFR = 0x0000;EDIS;
InitPieVectTable();
EALLOW;EINT;EDIS;
//#step1配置EMIF2时钟EALLOW;ClkCfgRegs.PERCLKDIVSEL.bit.EMIF2CLKDIV = 1;//参考TI配置,先配置EMIF时钟为时钟主频的一半。EDIS;
EALLOW;//#step2//设置CPU1还是CPU2为EMIF1的master,由于EMIF2只能工作在CPU1下,EMIF2没有该功能寄存器
//#step3 解除EMIF2访问保护Emif2ConfigRegs.EMIF2ACCPROT0.all = 0x0;
//#step4设置EMIF2ACCPROT0不能再被更改Emif2ConfigRegs.EMIF2COMMIT.all = 0x1;
//#step5锁定EMIF2COMMIT寄存器,防止被再次更改Emif2ConfigRegs.EMIF2LOCK.all = 0x1;EDIS;
//#step6配置所有的EMIF2相关GPIOsetup_emif2_pinmux_sdram_16bit(0);//库函数配置方法
//#step7配置EMIF2控制寄存器InitEmif2();// EMIF2初始化
//#step8 加一点延时for(i = 0; i<123; i++){}
while(1){sdram_read_write2(0x90000000, 0x500);}
}

//EMIF2的关键寄存器配置
void InitEmif2(void)
{
Emif2Regs.SDRAM_TR.bit.T_RFC = 5;//5,发送加载模式寄存器命令后要等待的时间,过了这段时间才可以发送行有效命令(激活命令)Emif2Regs.SDRAM_TR.bit.T_RP = 1;//1,预充电和其它命令之间的延时Emif2Regs.SDRAM_TR.bit.T_RCD = 1;//1,行有效命令(激活命令)到列读写命令之间的延时Emif2Regs.SDRAM_TR.bit.T_WR = 1;//1,写命令和预充电命令之间的延时,过了这段时间才可以进行预充电Emif2Regs.SDRAM_TR.bit.T_RAS = 4;//4,发送行有效命令后要等待的时间Emif2Regs.SDRAM_TR.bit.T_RC = 5;//5,两个行有效命令之间的延时,以及两个相邻刷新命令之间的延时Emif2Regs.SDRAM_TR.bit.T_RRD = 1;//1,两个不同的bank之间的行有效命令之间的延时Emif2Regs.SDR_EXT_TMNG.bit.T_XS = 6;//6,退出自我刷新命令后要等待的时间,过了这段时间才可以发送行有效命令Emif2Regs.SDRAM_RCR.bit.REFRESH_RATE = 1562;//1562,刷新频率
//ClkCfgRegs.PERCLKDIVSEL.bit.EMIF2CLKDIV = 1;//1:100MHz;0:200MHzEmif2Regs.SDRAM_CR.bit.SR = 0;//EMIF进入自动刷新状态Emif2Regs.SDRAM_CR.bit.NM = 1;//设置为16位数据总线Emif2Regs.SDRAM_CR.bit.CL = 3;//CAS延迟:内存纵向地址脉冲的反应时间,只支持设置为2和3。需查阅SDRAM的手册,示例设置为3 “该时间只是针对读操作,写操作没有这一延时”Emif2Regs.SDRAM_CR.bit.BIT_11_9_LOCK = 1;//该位被置1,CL字段才被允许写入Emif2Regs.SDRAM_CR.bit.IBANK = 2;//???最大只能配置到010b,存疑,寄存器手册标注配置为2就可以连接外部4个bank,数据手册标注连接外部3个bankEmif2Regs.SDRAM_CR.bit.PAGESIGE = 0;//256-word,requiring 8 column address,列地址为8位时设置为0EDIS;

}

//我把读的代码去掉了,只是写数据
char sdram_read_write2(Uint32 start_addr, Uint32 mem_size)
{Uint16 mem_rdl;Uint16 mem_wdl;Uint32 XMEM_p;Uint32 i;
//Write dataXMEM_p = start_addr;
//Fill memorymem_wdl = 0x0123;for (i=0; i < mem_size; i++){__addr32_write_uint16(XMEM_p, mem_wdl);XMEM_p = XMEM_p+2;mem_wdl += 0x0001;}
}

//IO配置
void setup_emif2_pinmux_sdram_16bit(Uint16 cpu_sel)
{int i;
for (i=53; i<=68; i++){GPIO_SetupPinMux(i,cpu_sel,3);}for (i=96; i<=121; i++){GPIO_SetupPinMux(i,cpu_sel,3);}
////configure Data pins for Async mode//for (i = 53; i <= 68; i++){GPIO_SetupPinOptions(i,0,0×31);}
}

ocean zh:

回复 Green Deng:

请您帮忙看一下。

ocean zh:

回复 Green Deng:

下面这是基本现象,每次写入,所有地址数据都跟着变。然后我又参考TI的另外一个DEMO,直接修改CMD文件,在外部的SDRAM中定义一个数组缓冲区,然后向数组中写数据,刚向数组第一个空间写入一个数据,数组所有空间都变成这个数据了。

赞(0)
未经允许不得转载:TI中文支持网 » 关于TMS320F28377 操作镁光SDRAM(MT48LC4M16A2P)的问题
分享到: 更多 (0)