/**********************************************************************
* $Id$SDRAM_Init.c2011-06-02
*//**
* @fileSDRAM_Init.c
* @briefThis file contains SCU_MODE_FUNCtions used to initialize SDRAM
* @version1.0
* @date02. June. 2011
* @authorNXP MCU SW Application Team
*
* Copyright(C) 2011, NXP Semiconductor
* All rights reserved.
**********************************************************************/
#include "chip.h"
/************************** PRIVATE DEFINITIONS *************************/
/* SDRAM Address Base for DYCS0*/
#define SDRAM_ADDR_BASE0x28000000
#define MS 8350 // for() loop count to delay 1 ms
/* SDRAM refresh time to 16 clock num */
#define EMC_SDRAM_REFRESH(freq,time) \
(((uint64_t)((uint64_t)time * freq)/16000000000ull)+1)
/*-------------------------PRIVATE SCU_MODE_FUNCTIONS------------------------------*/
/*********************************************************************
* @briefCalculate EMC Clock from nano second
* @param[in]freq - frequency of EMC Clk
* @param[in]time - nano second
* @return None
**********************************************************************/
uint32_t NS2CLK(uint32_t freq,uint32_t time){
return (((uint64_t)time*freq/1000000000));
}
/*********************************************************************
* @briefInit the EMC Controller to connect ex SDRAM
* @param[in]None
* @return None
**********************************************************************/
void SDRAM_Init () {
uint32_t pclk, temp;
uint64_t tmpclk;
uint32_t i = 0;
Chip_SCU_PinMuxSet(2,9,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//A0
Chip_SCU_PinMuxSet(2,10,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//A1
Chip_SCU_PinMuxSet(2,11,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//A2
Chip_SCU_PinMuxSet(2,12,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//A3
Chip_SCU_PinMuxSet(2,13,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//A4
Chip_SCU_PinMuxSet(1,0,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//A5
Chip_SCU_PinMuxSet(1,1,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//A6
Chip_SCU_PinMuxSet(1,2,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//A7
Chip_SCU_PinMuxSet(2,8,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//A8
Chip_SCU_PinMuxSet(2,7,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//A9
Chip_SCU_PinMuxSet(2,6,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//A10
Chip_SCU_PinMuxSet(2,2,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//A11
Chip_SCU_PinMuxSet(2,1,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//A12
Chip_SCU_PinMuxSet(2,0,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//A13
Chip_SCU_PinMuxSet(6,8,(SCU_PINIO_FAST | SCU_MODE_FUNC1));//A14
Chip_SCU_PinMuxSet(1,7,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D0
Chip_SCU_PinMuxSet(1,8,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D1
Chip_SCU_PinMuxSet(1,9,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D2
Chip_SCU_PinMuxSet(1,10,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D3
Chip_SCU_PinMuxSet(1,11,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D4
Chip_SCU_PinMuxSet(1,12,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D5
Chip_SCU_PinMuxSet(1,13,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D6
Chip_SCU_PinMuxSet(1,14,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D7
Chip_SCU_PinMuxSet(5,4,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D8
Chip_SCU_PinMuxSet(5,5,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D9
Chip_SCU_PinMuxSet(5,6,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D10
Chip_SCU_PinMuxSet(5,7,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D11
Chip_SCU_PinMuxSet(5,0,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D12
Chip_SCU_PinMuxSet(5,1,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D13
Chip_SCU_PinMuxSet(5,2,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D14
Chip_SCU_PinMuxSet(5,3,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D15
Chip_SCU_PinMuxSet(0X0D,2,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D16
Chip_SCU_PinMuxSet(0X0D,3,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D17
Chip_SCU_PinMuxSet(0X0D,4,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D18
Chip_SCU_PinMuxSet(0X0D,5,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D19
Chip_SCU_PinMuxSet(0X0D,6,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D20
Chip_SCU_PinMuxSet(0X0D,7,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D21
Chip_SCU_PinMuxSet(0X0D,8,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D22
Chip_SCU_PinMuxSet(0X0D,9,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//D23
Chip_SCU_PinMuxSet(0X0E,5,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D24
Chip_SCU_PinMuxSet(0X0E,6,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D25
Chip_SCU_PinMuxSet(0X0E,7,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D26
Chip_SCU_PinMuxSet(0X0E,8,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D27
Chip_SCU_PinMuxSet(0X0E,9,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D28
Chip_SCU_PinMuxSet(0X0E,10,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D29
Chip_SCU_PinMuxSet(0X0E,11,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D30
Chip_SCU_PinMuxSet(0X0E,12,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//D31
Chip_SCU_PinMuxSet(6,11,(SCU_PINIO_FAST | SCU_MODE_FUNC3));// CKEOUT0
Chip_SCU_ClockPinMuxSet(0, (SCU_PINIO_FAST | SCU_MODE_FUNC0));// CLK0 connected to EMC_CLK0
Chip_SCU_ClockPinMuxSet(1, (SCU_PINIO_FAST | SCU_MODE_FUNC0));// CLK1 connected to EMC_CLK1
Chip_SCU_ClockPinMuxSet(2, (SCU_PINIO_FAST | SCU_MODE_FUNC0));// CLK2 connected to EMC_CLK3
Chip_SCU_ClockPinMuxSet(3, (SCU_PINIO_FAST | SCU_MODE_FUNC0));// CLK3 connected to EMC_CLK2
Chip_SCU_PinMuxSet(6,12,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//DQMOUT0
Chip_SCU_PinMuxSet(6,10,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//DQMOUT1
Chip_SCU_PinMuxSet(0X0D,0,(SCU_PINIO_FAST | SCU_MODE_FUNC2));//DQMOUT2
Chip_SCU_PinMuxSet(0X0E,13,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//DQMOUT3
Chip_SCU_PinMuxSet(6,4,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//CAS
Chip_SCU_PinMuxSet(6,5,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//RAS
Chip_SCU_PinMuxSet(1,6,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//WE
Chip_SCU_PinMuxSet(6,9,(SCU_PINIO_FAST | SCU_MODE_FUNC3));//DYCS0
/* Select EMC clock-out */
LPC_SCU->SFSCLK[0] = SCU_PINIO_FAST;
LPC_SCU->SFSCLK[1] = SCU_PINIO_FAST;
LPC_SCU->SFSCLK[2] = SCU_PINIO_FAST;
LPC_SCU->SFSCLK[3] = SCU_PINIO_FAST;
LPC_EMC->CONTROL = 0x00000001;
LPC_EMC->CONFIG = 0x00000000;
LPC_EMC->DYNAMICCONFIG0 = 1<<14 | 2<<9 | 1<<7 | 0 << 12; /* 256Mb, 8Mx32, 4 banks, row=12, column=9 */
pclk = Chip_Clock_GetRate(CLK_MX_EMC);
LPC_EMC->DYNAMICRASCAS0 = 0x00000303; /* 1 RAS, 3 CAS latency */
LPC_EMC->DYNAMICREADCONFIG = 0x00000001; /* Command delayed strategy, using EMCCLKDELAY */
LPC_EMC->DYNAMICRP = NS2CLK(pclk, 20);
LPC_EMC->DYNAMICRAS = NS2CLK(pclk, 42);
LPC_EMC->DYNAMICSREX = NS2CLK(pclk, 63);
LPC_EMC->DYNAMICAPR = 0x00000005;
LPC_EMC->DYNAMICDAL = 0x00000005;
LPC_EMC->DYNAMICWR = 2;
LPC_EMC->DYNAMICRC = NS2CLK(pclk, 63);
LPC_EMC->DYNAMICRFC = NS2CLK(pclk, 63);
LPC_EMC->DYNAMICXSR = NS2CLK(pclk, 63);
LPC_EMC->DYNAMICRRD = NS2CLK(pclk, 14);
LPC_EMC->DYNAMICMRD = 0x00000002;
for(i = 0; i < 100*MS; i++);/* wait 100ms */
LPC_EMC->DYNAMICCONTROL = 0x00000183; /* Issue NOP command */
for(i = 0; i < 200*MS; i++);/* wait 200ms */
LPC_EMC->DYNAMICCONTROL = 0x00000103; /* Issue PALL command */
LPC_EMC->DYNAMICREFRESH = EMC_SDRAM_REFRESH(pclk,70); /* ( n * 16 ) -> 32 clock cycles */
for(i = 0; i < 200*MS; i++);/* wait 200ms */ /* wait 128 AHB clock cycles */
tmpclk = (uint64_t)15625*(uint64_t)pclk/1000000000/16;
LPC_EMC->DYNAMICREFRESH = tmpclk; /* ( n * 16 ) -> 736 clock cycles -> 15.330uS at 48MHz <= 15.625uS ( 64ms / 4096 row ) */
LPC_EMC->DYNAMICCONTROL = 0x00000083; /* Issue MODE command */
//Timing for 48/60/72MHZ Bus
temp = *((volatile uint32_t *)(SDRAM_ADDR_BASE | (((3<<4)| 2UL)<<13))); /* 4 burst, 3 CAS latency 12 = (8+2+2) RBC */
temp = temp;
LPC_EMC->DYNAMICCONTROL = 0x00000000; /* Issue NORMAL command */
//[re]enable buffers
LPC_EMC->DYNAMICCONFIG0 |= 1<<19;
} |