void SDRAM_Init()
{
uint32_t emcdivby2_buf[emcdivby2_szw];
uint32_t div = 0;
uint32_t n;
// Select and enable EMC branch clock
if (SystemCoreClock > 120000000UL)
{
// Use EMC clock divider and EMC clock output delay
div = 1;
// Following code must be executed in RAM to ensure stable operation
LPC_CCU1->CLK_M4_EMCDIV_CFG = (1 << 5) | (1 << 2) | (1 << 1) | 1;
LPC_CREG->CREG6 |= (1 << 16); // EMC_CLK_DIV divided by 2
while (!(LPC_CCU1->CLK_M4_EMCDIV_STAT & 1));
}
else
{
LPC_CCU1->CLK_M4_EMC_CFG = (1 << 2) | (1 << 1) | 1;
while (!(LPC_CCU1->CLK_M4_EMC_STAT & 1));
}
// Set EMC clock output delay
LPC_SCU->EMCDELAYCLK = 0x7777;
// Configure EMC port pins
[...removed to shorten the post...]
LPC_EMC->CONTROL = 0x00000001; // EMC Enable
LPC_EMC->CONFIG = 0x00000000; // Little-endian, Clock Ratio 1:1
// Configure EMC clock-out pins
LPC_SCU->SFSCLK_0 = EMC_PIN_SET | 0; // CLK0
LPC_SCU->SFSCLK_1 = EMC_PIN_SET | 0; // CLK1
LPC_SCU->SFSCLK_2 = EMC_PIN_SET | 0; // CLK2
LPC_SCU->SFSCLK_3 = EMC_PIN_SET | 0; // CLK3
// Dynamic memory configuration (chip select 0)
// Set Address mapping: 128Mb(4Mx32), 4 banks, row len = 12, column len = 8
LPC_EMC->DYNAMICCONFIG0 = (1 << 14) | // AM[14] = 1
(0 << 12) | // AM[12] = 0
(2 << 9) | // AM[11:9] = 2
(2 << 7) ; // AM[8:7] = 2
LPC_EMC->DYNAMICRASCAS0 = 0x00000303; // Latency: RAS 3, CAS 3 CCLK cyc.
LPC_EMC->DYNAMICREADCONFIG = 0x00000001; // Command delayed by 1/2 CCLK
LPC_EMC->DYNAMICRP = EMC_NANOSEC (20, SystemCoreClock, div);
LPC_EMC->DYNAMICRAS = EMC_NANOSEC (45, SystemCoreClock, div);
LPC_EMC->DYNAMICSREX = EMC_NANOSEC (70, SystemCoreClock, div);
LPC_EMC->DYNAMICAPR = EMC_NANOSEC (70, SystemCoreClock, div);
LPC_EMC->DYNAMICDAL = EMC_NANOSEC (70, SystemCoreClock, div);
LPC_EMC->DYNAMICWR = EMC_NANOSEC (14, SystemCoreClock, div);
LPC_EMC->DYNAMICRC = EMC_NANOSEC (68, SystemCoreClock, div);
LPC_EMC->DYNAMICRFC = EMC_NANOSEC (68, SystemCoreClock, div);
LPC_EMC->DYNAMICXSR = EMC_NANOSEC (70, SystemCoreClock, div);
LPC_EMC->DYNAMICRRD = EMC_NANOSEC (14, SystemCoreClock, div);
LPC_EMC->DYNAMICMRD = EMC_NANOSEC (30, SystemCoreClock, div);
WaitUs (100);
LPC_EMC->DYNAMICCONTROL = 0x00000183; // Issue NOP command
WaitUs (200);
LPC_EMC->DYNAMICCONTROL = 0x00000103; // Issue PALL command
WaitUs (200);
LPC_EMC->DYNAMICCONTROL = 0x00000183; // Issue NOP command
WaitUs (10);
LPC_EMC->DYNAMICREFRESH = EMC_NANOSEC( 200, SystemCoreClock, div) / 16 + 1;
WaitUs (10);
LPC_EMC->DYNAMICREFRESH = EMC_NANOSEC(15625, SystemCoreClock, div) / 16 + 1;
WaitUs (10);
LPC_EMC->DYNAMICCONTROL = 0x00000083; // Issue MODE command
// Mode register: Burst Length: 4, Burst Type: Sequential, CAS Latency: 3
WR_MODE(((3 << 4) | 2) << 12);
WaitUs (200);
LPC_EMC->DYNAMICCONTROL = 0x00000002; // Issue NORMAL command
LPC_EMC->DYNAMICCONFIG0 |= (1 << 19); // Enable buffer
}
|