Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE,
Dear team:
One of my clients found that when writing data to a fixed address of CS0 chip selection when operating external SDRAM (MT48LC4M16A2P) through emif2, all addresses will become the data.
Referring to emif1_16bit_sdram_far_cpu01 and emif_32bit_sdram_cpu01 projects from controlSUITE, he changed the emif1 configuration of the two demos to emif2 for testing. The following are the test results and code:
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 EALLOW; ClkCfgRegs.PERCLKDIVSEL.bit.EMIF2CLKDIV = 1; EDIS; EALLOW; //#step2 //#step3 Emif2ConfigRegs.EMIF2ACCPROT0.all = 0x0; //#step4 Emif2ConfigRegs.EMIF2COMMIT.all = 0x1; //#step5 Emif2ConfigRegs.EMIF2LOCK.all = 0x1; EDIS; //#step6 setup_emif2_pinmux_sdram_16bit(0); //#step7 InitEmif2(); //#step8 for(i = 0; i<123; i++){} while(1) { sdram_read_write2(0x90000000, 0x500); } } void InitEmif2(void) { Emif2Regs.SDRAM_TR.bit.T_RFC = 5; Emif2Regs.SDRAM_TR.bit.T_RP = 1; Emif2Regs.SDRAM_TR.bit.T_RCD = 1; Emif2Regs.SDRAM_TR.bit.T_WR = 1; Emif2Regs.SDRAM_TR.bit.T_RAS = 4; Emif2Regs.SDRAM_TR.bit.T_RC = 5; Emif2Regs.SDRAM_TR.bit.T_RRD = 1; Emif2Regs.SDR_EXT_TMNG.bit.T_XS = 6; Emif2Regs.SDRAM_RCR.bit.REFRESH_RATE = 1562; / //ClkCfgRegs.PERCLKDIVSEL.bit.EMIF2CLKDIV = 1; //1:100MHz;0:200MHz Emif2Regs.SDRAM_CR.bit.SR = 0; Emif2Regs.SDRAM_CR.bit.NM = 1; Emif2Regs.SDRAM_CR.bit.CL = 3; Emif2Regs.SDRAM_CR.bit.BIT_11_9_LOCK = 1; Emif2Regs.SDRAM_CR.bit.IBANK = 2; Emif2Regs.SDRAM_CR.bit.PAGESIGE = 0; EDIS; } //Read data only 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); } }
Best Regards