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.

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

Other Parts Discussed in Thread: C2000WARE, TMS320F28377D, CONTROLSUITE

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

  • 你好,能否更详细描述一下这个情况?
    另外,用例程测试的时候只是将例程中的EMIF1改成EMIF2吗?有做过其他修改吗?
  • void main(void)
    {
    int i = 0;

    InitSysCtrl();
    InitGpio(); // Skipped for this example
    DINT; // Disable interrupts
    InitPieCtrl();

    //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相关GPIO
    setup_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:200MHz
    Emif2Regs.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个bank
    Emif2Regs.SDRAM_CR.bit.PAGESIGE = 0; //256-word,requiring 8 column address,列地址为8位时设置为0
    EDIS;



    }


    //我把读的代码去掉了,只是写数据
    char sdram_read_write2(Uint32 start_addr, Uint32 mem_size)
    {
    Uint16 mem_rdl;
    Uint16 mem_wdl;
    Uint32 XMEM_p;
    Uint32 i;

    //Write data
    XMEM_p = start_addr;

    //Fill memory
    mem_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,0x31);
    }
    }
  • 请您帮忙看一下。
  • 下面这是基本现象,每次写入,所有地址数据都跟着变。然后我又参考TI的另外一个DEMO,直接修改CMD文件,在外部的SDRAM中定义一个数组缓冲区,然后向数组中写数据,刚向数组第一个空间写入一个数据,数组所有空间都变成这个数据了。

  • 建议你使用C2000Ware中的配置工具检查一下EMIF SDRAM的设置:〜\ C2000Ware_XXXXX \ boards \ TIDesigns \ F28379D_EMIF_DC \ C2000-EMIF_ConfigurationTool.xlsx
    此EMIF应用报告中还包含一些设计、用法和调试指南:www.ti.com/.../sprac96a.pdf
  • 我下载了,利用配置工具检查了配置,没发现问题。我问一下TMS320F28377d为什么没有配置突发长度的相关字段和行地址线大小的相关字段。
  • 还有就是寄存器里为什么没有配置突发长度的字段。
  • JEDEC标准提供了有关兼容性行为的指南。 EMIF仅针对允许根据标准变化的参数进行配置和指定。
  • 您好!Green Deng

          您还有其他的思路吗?

          问题还是向一个地址写入数据后,所有地址都变成该数据,比如向0x9000 0000 写入0x0005,,,所有地址都变成0x0005,向0x9000 1000写入0x0006,所有地址又都变成0x0006, 用的是镁光的MT48LC4M16A2P-6A,大小1M*16(bit)*4(bank)。是通过CCS的Memory Browser观察的数据。

            为了防止是观察方法不对,我不管显示,向不同地址写入不同的数据后,读出的都是最后写入的数据,确实说明当前向一个地址写入数据后,所有地址都变成该数据了。

            配置利用TI的配置工具已经检查过了,EMIF1操作SDRAM的例程也下载了(controlSUITE.exe)。

            请问为什么会出现这种现象,不认为是配置错误。之前论坛有几个人问过,都没人回答,并不是我一个人遇到这种问题。很着急解决这个问题,希望您能解答一下,或者提供一些思路。