EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6655时钟PLL配置与ddr3的配置 1 时钟概述PLL与PLL控制器的逻辑组成和处理流程如图1所示。PLL控制器能够通过PLLDIV1到PLLDIV16这些分频器灵活便利的配置和修改内部的时钟信号。PLL控制器也包含PLLM和SECCTL寄存器,如图1所示,这些寄存器能够配置好PLLM,OUTPUTDIVIDE和BYPASS的输出。PLL控制器决定DSP核心,外设或者其他模块的输出时钟。 2 o% {7 {, o, b! S3 s, K3 x
9 } s Y; j4 a* s% L' B& q
图1 PLL图示
$ y# k3 O4 _* [$ w1 PLL的配置PLL和PLL控制器的初始化在设备复位后由软件配置。PLL控制器寄存器只能由CPU或者仿真器修改,外部主设备,如PCIe,是无法直接操作PLL寄存器的。PLL控制器的初始化应该在程序启动或者复位的一瞬间完成,必须在外设初始化之前完成。 PLL配置寄存器(MAINPLLCTL0和MAINPLLCTL1)在bootcfg中,上电的时候是被写保护的,所以软件想操作chip-level寄存器时,必须先解锁KICK0和KICK1。同时,使能任何指定的PLL之前必须使能其对应的电源管理单元。 1.1 MAIN PLL的配置1. 设备上电后,需要等待一段时间使得PLL选通,时间为100us 2. 检测SECCTL寄存器(0x02310108)的BYPASS(23位)位是否使能,如果BYPASS == 1则执行下面操作,如果BYPASS == 0则跳到步骤3执行。 a) 在MAINPLLCTL1寄存器(0x0262032C)的ENSAT位(6位)写1(使得PLL得倒最佳的操作) b) 在PLLCTL寄存器(0x02310100)的PLLEN位写0(旁路使能PLL控制器开关) c) 在PLLCTL寄存器(0x02310100)的PLLENSRC位写0(使能PLLEN去控制PLL控制器开关) d) 等待4个CLKIN的时钟周期(为了确保PLL控制器开关在BYPASS模式,目标板晶振为25M) e) 在SECCTL寄存器(0x02310108)的BYPASS位写1(使能 BYPASS模式) f) 在PLLCTL寄存器(0x02310100)的PLLPWRDN位写1(关闭PLL模式) g) 等待至少5us(使得PLL关闭完成) h) 在PLLCTL寄存器(0x02310100)的PPLPWRDN位写0(打开PLL模式) 3. PLL控制器使能BYPASS a) PLLCTL寄存器(0x02310100)的PLLEN位写0(PLL控制器开关使能BYPASS) b) PLLCTL寄存器(0x02310100)的PLLENSR位写0(PLL控制器开关使能PLLEN) c) 等待4个CLKIN的时钟周期(为了确保PLL控制器开关在BYPASS模式了,板子晶振为25M) 4. PLLM的值分别写入两个寄存器,将PLLM[5:0]写入PLLM寄存器,将PLLM[12:6]写入MAINPLLCTL0 5. BWADJ的值分别写入两个寄存器,将BWADJ[7:0]写入MAINPLLCTL0寄存器,将BWADJ[11:8]写入MAINPLLCTL1寄存器。BWADJ[11:0]可以由PLLM[12:0]计算得倒,计算公式为BWADJ= ((PLLM + 1) >> 1)- 1 6. 将PLLD值写入到MAINPLLCTL0寄存器 7. 将SECCTL寄存器(0x02310108)的OD位写1 8. 对分频器PLLDIVn操作 a) 检测PLLSTAT寄存器(0x0231013C)中的GOSTAT位为0,表明目前没有GO operation操作 b) PLLDIVn寄存器中的RATIO位中写入分频值,若RATIO中的值改变了,则PLL控制寄存器会在DCHANGE寄存器中的对应位标明其改变。 c) 设置需要对齐SYSCLKS的位在ALNCTL寄存器中对应的ALNn位写1 d) 设置PLLCMD寄存器(0x02310138)中的GOSET位为1,进入GO操作 e) 读PLLSTAT寄存器(0x0231013C)中的GOSTAT位为0则表明完成DDR3 PLL初始化配置中的GO operation操作 9. 在PLLCTL寄存器(0x02310100)的PLLRST位写1,进入PLL复位操作 10. 等待最少7us(等待PLL复位完成) 11. 在PLLCTL寄存器(0x02310100)的PLLRST位写0,表示完成PLL复位操作,使得PLLCTL离开复位 12. 等待最少500*CLKIN cycles*(PLLD + 1) 13. SECTL寄存器(0x02310108)的BYPASS写0(使能PLL开关到PLL模式) 14. PLLCTL寄存器(0x02310100)的PLLEN写1(使能PLL控制器开关到PLL模式) 15. PLL与PLL控制器初始化位PLL模式完成 1.2 DDR3 PLL配置MAIN PLL与PLL控制器的初始化必须在DDR3PLL初始化之前DDR3 PLL配置。 1. DDR3PLLCTL1寄存器的ENSAT位(6位)写1(使得PLL得倒最佳操作) 2. DDR3PLLCTL0寄存器的BYUPASS写1(设置PLL旁路模式) 3. 将PLLM与PLLD的值写入到DDR3PLLCTL0寄存器中 4. 将BWADJ[7:0]写入DDR3PLLCTL0寄存器,将BWADJ[11:8]写入DDR3 PLLCTL1寄存器,BWADJ[11:0]的值可以根据PLLM[12:0]推导出来,公式为:BWADJ = ((PLLM + 1)>> 1)- 1 5. DDR3PLLCTL1寄存器的PLLRST写1(PLL复位) 6. 等待最少5us(等待PLL复位完成) 7. DDR3PLLCTL1寄存器的PLLRST写0(PLL复位完成,离开复位状态) 8. 等待最少500*REFCLK cycles *(PLLD + 1) (PLL 锁定时间) 9. DDR3PLLCTL0寄存器的BYPASS写0(开关处在PLL模式) 10. DDR3 PLL初始化完成 代码实现:1,DDR3时钟的配置& u4 i2 F" x, E M) r
#define PLL2_PLLD 0 // Must be less than 64
* E9 E! L6 b3 _# z+ i9 s#define PLL2_PLLM 19 // Must be less than 4096 A! D" Q! ?5 R3 \: M: q
. f2 B$ K; Y- S7 O D8 o) d$ XDDR3PLLCTL1 |= 0x00000040; // Set ENSAT bit = 1
( x) u# ]. m1 d# W; R1 GDDR3PLLCTL0 |= 0x00800000; // Set BYPASS bit = 1 h/ `4 a" [9 L7 r7 f1 r
. u! M3 v8 f. O& P' I
// Clear and program PLLD field
2 X" ?; n7 p3 N% [+ b3 }DDR3PLLCTL0 &= ~(0x0000003F);
! J, W) h0 e4 g4 aDDR3PLLCTL0 |= (PLL2_PLLD & 0x0000003F);
/ @. R6 r) J& O, _$ O4 Y6 U+ {// Clear and program PLLM field! \, d# O* s& R
DDR3PLLCTL0 &= ~(0x0007FFC0);" q- ^6 S. S& \0 f
DDR3PLLCTL0 |= ((PLL2_PLLM << 6) & 0x0007FFC0 );: z: {: v. {: H; W! E) U
9 \/ o% f: v5 J* w+ `6 I// Clear and program BWADJ field( F; a k, n" O2 s8 D
PLL2_BWADJ = ((PLL2_PLLM + 1) >> 1) - 1;
- a+ L6 B+ h. M: T7 w) \3 M- QDDR3PLLCTL0 &= ~(0xFF000000);
4 a4 n* }( Z5 ?DDR3PLLCTL1 &= ~(0x0000000F);; P- \! E$ ^! ] w" G% @
DDR3PLLCTL0 |= ((PLL2_BWADJ << 24) & 0xFF000000);
# b; k0 @" `- _1 N" g" d+ _) |' h8 ~DDR3PLLCTL1 |= ((PLL2_BWADJ >> 8) & 0x0000000F);
9 o) g* k! x7 X$ `/ |% h" k1 P1 ~3 ]0 f E0 [) W+ g& Z |% c
DDR3PLLCTL1 |= 0x00002000; // Set RESET bit = 1% Z8 u9 q! {" n9 D0 b
for(i=0;i<10000;i++); // Wait at least 5us for reset complete7 N+ {& `: \7 @" |% T1 n# Q. U/ ^
4 Z# q( M* N5 I3 Y
DDR3PLLCTL1 &= ~(0x00002000); // Clear RESET bit9 k- N$ M+ g M7 |% C
for(i=0;i<70000;i++); // Wait at least 50us for PLL lock
9 v# ^ w4 s7 l2 R# l' a: P
/ T0 K7 N( K# H) g. D# FDDR3PLLCTL0 &= ~(0x00800000); // Clear BYPASS bit = 07 `8 f' Y9 T- L5 F% [ Z- c
4 {8 ]& i4 d; K n7 ~# h
2,DDR3控制器配置2 {8 {9 B* P/ r- k: g! A% s
int i,TEMP,startlo, stoplo,starthi, stophi;( ^9 _8 ^( u- o* ^8 U! P4 |' Y
KICK0 = KICK0_UNLOCK;
0 r9 `- B+ Y5 O4 O. U KICK1 = KICK1_UNLOCK;
( n5 B- A' i1 }- A) [! X /* Wait for PLL to lock = min 500 ref clock cycles.. ~" a: j( t# L! ]" R
With refclk = 100MHz, = 5000 ns = 5us */
5 h. F4 Q7 o- }1 g) u Delay_milli_seconds(1);, z$ K- v: o! k7 V5 l% V
/***************** 3.2 DDR3 PLL Configuration ************/2 E% l4 ?5 A- ]% Y7 c
/* Done before */0 @, y/ P& s: N u8 i
- X) A6 F3 w% K; K" L4 _9 O /**************** 3.3 Leveling register configuration ********************/
/ \ ?. M/ U! _0 J+ Q DDR3_CONFIG_REG_0 &= ~(0x007FE000); // clear ctrl_slave_ratio field4 D5 ^6 n- g4 v! r5 {
DDR3_CONFIG_REG_0 |= 0x00200000; // set ctrl_slave_ratio to 0x100$ b$ ~+ c0 t" u" ~ i+ w# e
DDR3_CONFIG_REG_12 |= 0x08000000; // Set invert_clkout = 1/ |4 G; P3 z' p w+ P
DDR3_CONFIG_REG_0 |= 0xF; // set dll_lock_diff to 151 y% \$ f& I" @& b) t. n
+ x. g+ j4 ^( ~% A/ o! ` //From 4.2.1 Executing Partial Automatic Leveling -- Start9 H$ f: d% n( h- q/ D, [6 W
DDR3_CONFIG_REG_23 |= 0x00000200; //Set bit 9 = 1 to use forced ratio leveling for read DQS& E( Z7 k, @- F
//From 4.2.1 Executing Partial Automatic Leveling -- End# }# L v5 x% x9 u
//Values with invertclkout = 1( p, I( I/ b" i9 \$ B
/**************** 3.3 Partial Automatic Leveling ********************/
u6 P* E, @" Q3 k, p) L7 ]5 f5 h DATA0_WRLVL_INIT_RATIO = 0x00;
, _# y$ t2 R2 V0 @ e DATA1_WRLVL_INIT_RATIO = 0x00;! k, E* g8 w! i% ?" U
DATA2_WRLVL_INIT_RATIO = 0x00;- {: N/ v$ F. A' s
DATA3_WRLVL_INIT_RATIO = 0x00;
6 B$ n2 \# }7 Q% {; j1 d DATA4_WRLVL_INIT_RATIO = 0x33;, @1 ~) h# _: s% i5 T! P
DATA5_WRLVL_INIT_RATIO = 0x3A;
! ^2 O! ^) {4 x3 d DATA6_WRLVL_INIT_RATIO = 0x2C;% t9 n }/ Q8 _. v- M: B3 A/ j
DATA7_WRLVL_INIT_RATIO = 0x2C;& m( y" f1 J3 J' H4 a
DATA8_WRLVL_INIT_RATIO = 0x21;% {5 e' \" V, N n; b' P
DATA0_GTLVL_INIT_RATIO = 0x00;0 ~ R$ w& Y2 [. T" g$ j; d# G8 H
DATA1_GTLVL_INIT_RATIO = 0x00;* W1 d9 _/ C$ s; @2 _$ S* j
DATA2_GTLVL_INIT_RATIO = 0x00;) O. p: A3 N$ f& _! x
DATA3_GTLVL_INIT_RATIO = 0x00;0 e6 k. a* Q, \2 I* C7 c v: f
DATA4_GTLVL_INIT_RATIO = 0xB7;& e* G8 Q3 {6 m
DATA5_GTLVL_INIT_RATIO = 0xB1;
8 ~# l1 b8 i0 L" l9 r& U DATA6_GTLVL_INIT_RATIO = 0xA4;
5 ?8 h. [ a7 E s DATA7_GTLVL_INIT_RATIO = 0xA4;
@5 m/ {/ t% {! C# x H( B DATA8_GTLVL_INIT_RATIO = 0x98;% _0 R- A' t3 F4 o, v5 }( |, Q0 D. N
//Do a PHY reset. Toggle DDR_PHY_CTRL_1 bit 15 0->1->0! W7 m1 M9 g' I! U8 \
DDR_DDRPHYC &= ~(0x00008000);3 C2 }/ J! K$ R, C$ n! g# Y" K K
DDR_DDRPHYC |= (0x00008000);
1 j+ K' c% S6 D0 [- U6 |9 T! z DDR_DDRPHYC &= ~(0x00008000);% A1 O1 x- g* S+ ^+ A; j
/***************** 3.4 Basic Controller and DRAM Configuration ************/
0 V& @/ I& ~! x DDR_SDRFC = 0x0000515C; // enable configuration5 y( r6 i( {' C& F, E" A* J
/* DDR_SDTIM1 = 0x1557B9BD; */* j$ n- o. R: n- r( e0 L( ~# e' z+ b
TEMP = 0;% g8 H/ R$ G7 f0 Z
TEMP |= 0x09 << 25; // T_RP bit field 28:25; g, g2 k- Y% Z5 ?1 f
TEMP |= 0x09 << 21; // T_RCD bit field 24:210 Y& R# e" b8 u) r. k) C c6 f9 l
TEMP |= 0x09 << 17; // T_WR bit field 20:17
6 ~9 h) r# T$ B) S Q TEMP |= 0x17 << 12; // T_RAS bit field 16:12. _3 t+ n; N1 ] h1 J
TEMP |= 0x20 << 6; // T_RC bit field 11:6. \ Y2 n0 E1 I1 V; p
TEMP |= 0x1 << 3; // T_RRD bit field 5:3
+ Q# V5 }7 L/ O( \- d% Z: k TEMP |= 0x4; // T_WTR bit field 2:09 K D! \6 o3 t& h0 C
DDR_SDTIM1 = TEMP;
0 L6 f1 P& k" C8 p% u /* DDR_SDTIM2 = 0x304F7FE3; */
/ {9 v5 `9 O- V; `( i TEMP = 0;* @9 B% J9 E8 n4 {; C. s6 f7 q
TEMP |= 0x3 << 28; // T_XP bit field 30:28/ w1 a. z8 ^4 A! Q, P
TEMP |= 0x71 << 16; // T_XSNR bit field 24:16
$ b2 a* O/ ?! s! J TEMP |= 0x1ff << 6; // T_XSRD bit field 15:6
6 ~4 b* V7 R& A( L TEMP |= 0x4 << 3; // T_RTP bit field 5:3
/ x. |- V& T7 d+ ~) D TEMP |= 0x3; // T_CKE bit field 2:0) c# P( K2 y) F+ J4 }6 R& b! Y( k8 P
DDR_SDTIM2 = TEMP;
) L* U5 {4 u4 t0 N n3 v# X! e0 p /* DDR_SDTIM3 = 0x559F849F; */
+ r1 A) g; J7 ?3 p8 F1 L) U TEMP = 0;8 T Q0 v. G1 {* s* S( m
TEMP |= 0x5 << 28; // T_PDLL_UL bit field 31:28 (fixed value)$ A7 @- |) g4 _% `7 t+ I
TEMP |= 0x5 << 24; // T_CSTA bit field 27:24 (fixed value)
# D2 W( n' c8 {% X& ^& A m TEMP |= 0x4 << 21; // T_CKESR bit field 23:21
4 {% p( R7 o: [8 W TEMP |= 0x3f << 15; // T_ZQCS bit field 20:15' m- X! R @) g& a; u8 T, u" n! Z
TEMP |= 0x6A << 4; // T_RFC bit field 12:4
# o& }5 ^9 L6 @, g( t- ~9 y TEMP |= 0xf; // T_RAS_MAX bit field 3:0 (fixed value)
6 A8 k1 R; e/ n# Q: C+ f# | DDR_SDTIM3 = TEMP;4 h: E. m8 n' O7 {% ?
DDR_DDRPHYC = 0x0010010F;
( m4 G( x/ p3 {- k4 C/ m( \ DDR_ZQCFG = 0x70074c1f;
$ {" e; `7 K1 y3 `/ _4 a DDR_PMCTL = 0x0;8 o* J8 b: N* k
//DDR_SDRFC = 0x0000144F; // enable configuration
2 E* x3 i5 S; t* M a /* DDR_SDCFG = 0x63077AB3; */
) [2 } U7 k- i2 ]" C0 W5 g: Y /* New value with DYN_ODT disabLED and SDRAM_DRIVE = RZQ/7 //0x63222A32; // last config write DRAM init occurs */
4 H) |8 \/ F9 B5 F1 W4 Z2 N TEMP = 0;
8 W h; n' X, e3 m5 S2 L( w TEMP |= 0x3 << 29; // SDRAM_TYPE bit field 31:29 (fixed value)
- |9 F0 ]: y* X8 a TEMP |= 0x0 << 27; // IBANK_POS bit field 28:27
- } K# F5 q9 f w3 w TEMP |= 0x2 << 24; // DDR_TERM bit field 26:24$ v+ e3 R: m5 b) J7 c+ }
TEMP |= 0x2 << 21; // DYN_ODT bit field 22:21
0 V6 z8 W, W9 w; Y* u# {1 J/ v TEMP |= 0x1 << 18; // SDRAM_DRIVE bit field 19:18
! U, u6 H3 t o TEMP |= 0x3 << 16; // CWL bit field 17:16% Q7 v+ j4 f, @9 s( `
TEMP |= 0x1 << 14; // NM bit field 15:14 z* T' c& @+ K3 v6 H% D! z, ?5 |
TEMP |= 0xE << 10; // CL bit field 13:10
( ^2 l- n; w: E TEMP |= 0x5 << 7; // ROWSIZE bit field 9:7: G3 g9 R. q) `6 w( ~4 m
TEMP |= 0x3 << 4; // IBANK bit field 6:42 v) g7 D; I G' E0 A7 L: a
TEMP |= 0x0 << 3; // EBANK bit field 3:35 A- s, _% Q% @2 i4 M. y' p
TEMP |= 0x2; // PAGESIZE bit field 2:0& R D8 z( w! j/ b4 _
DDR_SDCFG = TEMP;
; Q+ N9 r s1 e% F# g //Wait 600us for HW init to complete* |$ ]; E3 }4 l
Delay_milli_seconds(1);; g/ E6 I2 c* o# ~
DDR_SDRFC = 0x0000144F; //Refresh rate = (7.8*666MHz)
5 p# s& d5 o" r$ j /**************** 4.2.1 Executing Partial Automatic Leveling ********************/4 r$ z' [$ x8 M. N: n! C
DDR_RDWR_LVL_RMP_CTRL = 0x80000000; //enable full leveling
) ^" D2 }, U1 e g( w/ |$ ^ DDR_RDWR_LVL_CTRL = 0x80000000; //trigger full leveling - This ignores read DQS leveling result and uses ratio forced value
" z9 b7 w. u8 a) Q# Z //(0x34) instead- i* i6 A. N1 H* }0 M u! Z7 v2 s8 P
//Wait for min 1048576 DDR clock cycles for leveling to complete = 1048576 * 1.5ns = 1572864ns = 1.57ms.
1 u& H9 X6 A B1 B# N, A //Actual time = ~10-15 ms5 I6 s6 e H4 x& l
Delay_milli_seconds(1);
- j( s4 q4 C8 S; C2 Z6 T" i) _( _ |