qipp
2025-11-07 744722688187eb4991c72464e2bb5e06b244fee7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <def21489.h>
 
.global _InitPLL;
.global _InitSDRAM;
.global _InitAMI;
 
.section/pm seg_pmco;
 
_InitPLL:
// CLKIN= 25 MHz, Multiplier= 16, Divisor= 2, CCLK_SDCLK_RATIO 2.5.
// Fcclk = (CLKIN * 2 * M) / (N * D)
// VCO max frequency = 800 GHz
// M = 1 to 64, N = 2,4,8,16 and D = 1 if INDIV = 0, D = 2 if INDIV = 1
 
 
// Core clock = (25MHz * 2* 16) /(2 * 1) = 400 MHz
// SDRAM clock = 400 / 2.5 = 160 MHz.
 
    ustat3 = PLLM16|PLLD2|SDCKR2_5;
changePLL:
 
    bit set ustat3 DIVEN;
    dm(PMCTL) = ustat3;
    
    bit set ustat3 PLLBP; //Place the PLL in bypass mode.
    bit clr ustat3 DIVEN; //Clear the DIVEN bit while placing the PLL in bypass mode.
    dm(PMCTL) = ustat3;
 
     // Wait for at least 4096 cycles for the pll to lock
    lcntr = 5000, do loopend2 until lce;
loopend2:     nop;
 
    ustat3 = dm(PMCTL);    //Reading the PMCTL register will return the DIVEN bit value as zero.
    bit clr ustat3 PLLBP; //Take the PLL out of bypass mode.
    dm(PMCTL) = ustat3;
    
    lcntr = 16, do loopend3 until lce;
loopend3:     nop;
 
_InitPLL.end: rts;        
 
_InitSDRAM:
// SDRAM memory on EZ-KIT - MT48LC16M16A2-6A
//5.4ns @ CL = 3 ,167 MHz speed
// Parameters 
// Config - 64M x 16(16M x 16 x 4)
// Speed -        167 MHz
// CAS Latency -   3
// Row addressing - 8K(A0-A12)
// Column addressing - 512(A0-A8)
// No of Banks - 4
 
//tRAS - 42ns
//tRCD - 18ns
//tRP - 18ns
//tRC - 60ns( tRP + tRAS >= tRC)
//tWR - (1CLK + 6ns)/12
 
//For the 160 MHz case, tSDCLK = 1/160 MHz = 6.25ns 
// CAS Latency = 3
// tRCD = 18 / 6.25 = 3(2.88)
// tRP = 18 / 6.25 = 3(2.88)
// tRC = 60 / 6.25 = 10(9.6)
// tRAS = 42/ 6.25 = 7(6.72)
// tWR = (6.25 + 6)/ 12 = 2(1.02)
// fSDCLK = 160 MHz
// tREF=  64ms
// NRA = 8192
 
// RDIV = ((f SDCLK X t REF)/NRA) - (t RAS + t RP)
// RDIV = (((160 X 10^6 x 64 x 10^-3)/8192) - (7 + 3))
// RDIV = 1240 = 0x4D8
 
#define RDIV    (0x4D8)
 
    ustat1 = dm(SYSCTL);
    bit set ustat1 MSEN;
    dm(SYSCTL) = ustat1;
 
    // Mapping Bank 0 to SDRAM
    ustat1 = dm(EPCTL);
    bit set ustat1 B0SD;
    bit clr ustat1 B1SD|B2SD|B3SD;
    dm(EPCTL) = ustat1;
    
    ustat1 = RDIV; 
    bit set ustat1 SDROPT | BIT_17; // Enabling SDRAM read optimization
                                    // Setting the Modify to 1
    dm(SDRRC) = ustat1;
 
    // Programming SDRAM control register    
    ustat1 = 0;
    bit set ustat1 SDCL3|SDTRAS7|SDTRP3|SDCAW9|SDPSS|SDTWR2|SDTRCD3|SDRAW13|X16DE;
    dm(SDCTL) = ustat1;
    
    r0 = dm(0x200000);
    nop;
    nop;
    nop;
    nop;
    
_InitSDRAM.end: rts;
 
_InitAMI:
    ustat1 = dm(SYSCTL);
    bit set ustat1 EPDATA32;
    dm(SYSCTL) = ustat1;
    
    // Flash is connected on Bank 1 
    // Programming maximum waitstates
    ustat1 = AMIEN | BW8 | WS31 ;
    dm(AMICTL1) = ustat1;
    
    // SRAM is connected on Bank 2
    // SRAM part used - IS61WV102416BLL
    // As per datasheet access time is 10 ns, 8ns
    // Programming waitstates = 2
    ustat1 = AMIEN | BW16 | WS2 ;
    dm(AMICTL3) = ustat1;
    
_InitAMI.end: rts;