1 | void emc_WaitUS(volatile uint32_t us)
|
2 | {
|
3 | us *= ((SystemCoreClock / 1000000)/3);
|
4 | while(us--);
|
5 | }
|
6 |
|
7 | void emc_WaitMS(volatile uint32_t ms)
|
8 | {
|
9 | ms *= ((SystemCoreClock / 1000)/3);
|
10 | while(ms--);
|
11 | }
|
12 |
|
13 | /*********************************************************************
|
14 | *
|
15 | * _EMC_Init()
|
16 | *
|
17 | * Purpose:
|
18 | * Initializes external memory controller for SDRAM
|
19 | */
|
20 |
|
21 | void _EMC_Init(void) {
|
22 |
|
23 | volatile U32 CmdDly;
|
24 | volatile U32 Dummy;
|
25 | volatile U32 i;
|
26 |
|
27 | LPC_SCU->EMCDELAYCLK = 0x7777;
|
28 | //LPC_CREG->CREG6 |= (1 << 16);
|
29 |
|
30 | LPC_EMC->CONTROL = 0x1; // EMC enable
|
31 | LPC_EMC->CONFIG = 0x0; //Little Endian Mode
|
32 | //
|
33 | // Port init
|
34 | //
|
35 | LPC_SCU->SFSP1_7 = (MD_PLN_FAST | FUNC3); //D0
|
36 | LPC_SCU->SFSP1_8 = (MD_PLN_FAST | FUNC3); //D1
|
37 | LPC_SCU->SFSP1_9 = (MD_PLN_FAST | FUNC3); //D2
|
38 | LPC_SCU->SFSP1_10 = (MD_PLN_FAST | FUNC3); //D3
|
39 | LPC_SCU->SFSP1_11 = (MD_PLN_FAST | FUNC3); //D4
|
40 | LPC_SCU->SFSP1_12 = (MD_PLN_FAST | FUNC3); //D5
|
41 | LPC_SCU->SFSP1_13 = (MD_PLN_FAST | FUNC3); //D6
|
42 | LPC_SCU->SFSP1_14 = (MD_PLN_FAST | FUNC3); //D7
|
43 | LPC_SCU->SFSP5_4 = (MD_PLN_FAST | FUNC2); //D8
|
44 | LPC_SCU->SFSP5_5 = (MD_PLN_FAST | FUNC2); //D9
|
45 | LPC_SCU->SFSP5_6 = (MD_PLN_FAST | FUNC2); //D10
|
46 | LPC_SCU->SFSP5_7 = (MD_PLN_FAST | FUNC2); //D11
|
47 | LPC_SCU->SFSP5_0 = (MD_PLN_FAST | FUNC2); //D12
|
48 | LPC_SCU->SFSP5_1 = (MD_PLN_FAST | FUNC2); //D13
|
49 | LPC_SCU->SFSP5_2 = (MD_PLN_FAST | FUNC2); //D14
|
50 | LPC_SCU->SFSP5_3 = (MD_PLN_FAST | FUNC2); //D15
|
51 | LPC_SCU->SFSPD_2 = (MD_PLN_FAST | FUNC2); //D16
|
52 | LPC_SCU->SFSPD_3 = (MD_PLN_FAST | FUNC2); //D17
|
53 | LPC_SCU->SFSPD_4 = (MD_PLN_FAST | FUNC2); //D18
|
54 | LPC_SCU->SFSPD_5 = (MD_PLN_FAST | FUNC2); //D19
|
55 | LPC_SCU->SFSPD_6 = (MD_PLN_FAST | FUNC2); //D20
|
56 | LPC_SCU->SFSPD_7 = (MD_PLN_FAST | FUNC2); //D21
|
57 | LPC_SCU->SFSPD_8 = (MD_PLN_FAST | FUNC2); //D22
|
58 | LPC_SCU->SFSPD_9 = (MD_PLN_FAST | FUNC2); //D23
|
59 | LPC_SCU->SFSPE_5 = (MD_PLN_FAST | FUNC3); //D24
|
60 | LPC_SCU->SFSPE_6 = (MD_PLN_FAST | FUNC3); //D25
|
61 | LPC_SCU->SFSPE_7 = (MD_PLN_FAST | FUNC3); //D26
|
62 | LPC_SCU->SFSPE_8 = (MD_PLN_FAST | FUNC3); //D27
|
63 | LPC_SCU->SFSPE_9 = (MD_PLN_FAST | FUNC3); //D28
|
64 | LPC_SCU->SFSPE_10 = (MD_PLN_FAST | FUNC3); //D29
|
65 | LPC_SCU->SFSPE_11 = (MD_PLN_FAST | FUNC3); //D30
|
66 | LPC_SCU->SFSPE_12 = (MD_PLN_FAST | FUNC3); //D31
|
67 |
|
68 | LPC_SCU->SFSP2_9 = (MD_PLN_FAST | FUNC3); //A0
|
69 | LPC_SCU->SFSP2_10 = (MD_PLN_FAST | FUNC3); //A1
|
70 | LPC_SCU->SFSP2_11 = (MD_PLN_FAST | FUNC3); //A2
|
71 | LPC_SCU->SFSP2_12 = (MD_PLN_FAST | FUNC3); //A3
|
72 | LPC_SCU->SFSP2_13 = (MD_PLN_FAST | FUNC3); //A4
|
73 | LPC_SCU->SFSP1_0 = (MD_PLN_FAST | FUNC2); //A5
|
74 | LPC_SCU->SFSP1_1 = (MD_PLN_FAST | FUNC2); //A6
|
75 | LPC_SCU->SFSP1_2 = (MD_PLN_FAST | FUNC2); //A7
|
76 | LPC_SCU->SFSP2_8 = (MD_PLN_FAST | FUNC3); //A8
|
77 | LPC_SCU->SFSP2_7 = (MD_PLN_FAST | FUNC3); //A9
|
78 | LPC_SCU->SFSP2_6 = (MD_PLN_FAST | FUNC2); //A10
|
79 | LPC_SCU->SFSP2_2 = (MD_PLN_FAST | FUNC2); //A11
|
80 | LPC_SCU->SFSP2_1 = (MD_PLN_FAST | FUNC2); // A12
|
81 | LPC_SCU->SFSP2_0 = (MD_PLN_FAST | FUNC2); //A13
|
82 | LPC_SCU->SFSP6_8 = (MD_PLN_FAST | FUNC1); //A14
|
83 | LPC_SCU->SFSP6_7 = (MD_PLN_FAST | FUNC1); // A15
|
84 | LPC_SCU->SFSPD_16= (MD_PLN_FAST | FUNC2); // A16
|
85 | LPC_SCU->SFSPD_15= (MD_PLN_FAST | FUNC2); // A17
|
86 | LPC_SCU->SFSPE_0 = (MD_PLN_FAST | FUNC3); // A18
|
87 | LPC_SCU->SFSPE_1 = (MD_PLN_FAST | FUNC3); // A19
|
88 | LPC_SCU->SFSPE_2 = (MD_PLN_FAST | FUNC3); // A20
|
89 | LPC_SCU->SFSPE_3 = (MD_PLN_FAST | FUNC3); // A21
|
90 | LPC_SCU->SFSPE_4 = (MD_PLN_FAST | FUNC3); // A22
|
91 | LPC_SCU->SFSPA_4 = (MD_PLN_FAST | FUNC3); // A23*/
|
92 |
|
93 | LPC_SCU->SFSP1_3 = (MD_PLN_FAST | FUNC3); // OE
|
94 | LPC_SCU->SFSP1_6 = (MD_PLN_FAST | FUNC3); //WE
|
95 | LPC_SCU->SFSP1_4 = (MD_PLN_FAST | FUNC3); // BLS0
|
96 | LPC_SCU->SFSP6_6 = (MD_PLN_FAST | FUNC1); // BLS1
|
97 | LPC_SCU->SFSPD_13 = (MD_PLN_FAST | FUNC2); // BLS2
|
98 | LPC_SCU->SFSPD_10 = (MD_PLN_FAST | FUNC2); // BLS3
|
99 | LPC_SCU->SFSP1_5 = (MD_PLN_FAST | FUNC3); // CS0
|
100 | LPC_SCU->SFSP6_3 = (MD_PLN_FAST | FUNC3); // CS1
|
101 | LPC_SCU->SFSPD_12 = (MD_PLN_FAST | FUNC2); // CS2
|
102 | LPC_SCU->SFSPD_11 = (MD_PLN_FAST | FUNC2); // CS3
|
103 | LPC_SCU->SFSP6_4 = (MD_PLN_FAST | FUNC3); //CAS
|
104 | LPC_SCU->SFSP6_5 = (MD_PLN_FAST | FUNC3); //RAS
|
105 | LPC_SCU->SFSCLK_0 = (MD_PLN_FAST | FUNC0); //CLK0
|
106 | LPC_SCU->SFSCLK_1 = (MD_PLN_FAST | FUNC0); //CLK1
|
107 | LPC_SCU->SFSCLK_2 = (MD_PLN_FAST | FUNC0); //CLK2
|
108 | LPC_SCU->SFSCLK_3 = (MD_PLN_FAST | FUNC0); //CLK3
|
109 | LPC_SCU->SFSP6_9 = (MD_PLN_FAST | FUNC3); //DYCS0
|
110 | LPC_SCU->SFSP6_1 = (MD_PLN_FAST | FUNC1); // DYCS1
|
111 | LPC_SCU->SFSPD_14 = (MD_PLN_FAST | FUNC2); // DYCS2
|
112 | LPC_SCU->SFSPE_14 = (MD_PLN_FAST | FUNC3); // DYCS3
|
113 | LPC_SCU->SFSP6_11 = (MD_PLN_FAST | FUNC3); //CKE0
|
114 | LPC_SCU->SFSP6_2 = (MD_PLN_FAST | FUNC1); // CKEOUT1
|
115 | LPC_SCU->SFSPD_1 = (MD_PLN_FAST | FUNC2); // CKEOUT2
|
116 | LPC_SCU->SFSPE_15 = (MD_PLN_FAST | FUNC3); // CKEOUT3
|
117 | LPC_SCU->SFSP6_12 = (MD_PLN_FAST | FUNC3); //DQMOUT0
|
118 | LPC_SCU->SFSP6_10 = (MD_PLN_FAST | FUNC3); //DQMOUT1
|
119 | LPC_SCU->SFSPD_0 = (MD_PLN_FAST | FUNC2); //DQMOUT2
|
120 | LPC_SCU->SFSPE_13 = (MD_PLN_FAST | FUNC3); //DQMOUT3
|
121 | //
|
122 | // Setup EMC config for SDRAM, timings for 72MHz bus => 13,9ns
|
123 | // SDRAM: MT48LC4M32B2 on Keil MCB1857 Board
|
124 | //
|
125 | LPC_EMC->DYNAMICCONFIG0 = 0x00004500; //128Mb, 4Mx32, 4 banks, 12 rows, 8 columns
|
126 |
|
127 | LPC_EMC->DYNAMICRP = 0x1; // tRP = n + 1 clock cycles # min. 18ns
|
128 | LPC_EMC->DYNAMICRAS = 0x3; // tRAS = n + 1 clock cycles # min. 42ns
|
129 | LPC_EMC->DYNAMICSREX = 0x5; // tSREX = tXSR = n + 1 clock cycles # min. 70ns
|
130 | LPC_EMC->DYNAMICAPR = 0x1; // no tAPR => using tRCD = n + 1 clock cycles # min. 18ns
|
131 | LPC_EMC->DYNAMICDAL = 0x5; // tDAL = n clock cycles # 5Cks = min. 30ns
|
132 | LPC_EMC->DYNAMICWR = 0x1; // tWR = n + 1 clock cycles # min. 12ns
|
133 | LPC_EMC->DYNAMICRC = 0x4; // tRC = n + 1 clock cycles # min. 60ns
|
134 | LPC_EMC->DYNAMICRFC = 0x4; // tRFC = n + 1 clock cycles # min. 60ns
|
135 | LPC_EMC->DYNAMICXSR = 0x4; // tXSR = n + 1 clock cycles # min. 60ns
|
136 | LPC_EMC->DYNAMICRRD = 0x1; // tRRD = n + 1 clock cycles # min. 12ns
|
137 | LPC_EMC->DYNAMICMRD = 0x1; // tMRD = n + 1 clock cycles # 2CKs = min. 12ns
|
138 | //emc_WaitMS(200);
|
139 | LPC_EMC->DYNAMICCONTROL = 0x00000183;
|
140 | emc_WaitMS(100);
|
141 | LPC_EMC->DYNAMICCONTROL = 0x00000103;
|
142 | LPC_EMC->DYNAMICREFRESH = 0x00000002; // n * 16 clock cycles
|
143 | //for (i = 0; i < 0x80; i++); // Wait 128 AHB clock cycles
|
144 | emc_WaitMS(100);
|
145 | LPC_EMC->DYNAMICREFRESH = 50; // n * 16 clock cycles (~ 1 pro MHz)
|
146 | LPC_EMC->DYNAMICRASCAS0 = 0x00000202;
|
147 | LPC_EMC->DYNAMICCONFIG0 = 0x00004500;
|
148 | //emc_WaitUS(200);
|
149 | //
|
150 | // Init SDRAM
|
151 | //
|
152 | LPC_EMC->DYNAMICCONTROL = 0x00000083;// CLock Enable = driven HIGH, CLKOUT runs continously, Issue MODE command
|
153 | Dummy = *((volatile U32*)(SDRAM_BASE_ADDR | (0x22 << (2+8+2)))); // 4 burst, 2 CAS latency
|
154 | Dummy = Dummy;
|
155 | //for (i = 0; i < 0x80; i++);
|
156 | LPC_EMC->DYNAMICCONTROL = 0x00000000;//NORMAL; // Issue NORMAL command
|
157 | LPC_EMC->DYNAMICCONFIG0 = 0x00084500;//128Mb, 4Mx32, 4 banks, 12 rows, 8 columns, buffer enable
|
158 | }
|