EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6655时钟PLL配置与ddr3的配置 1 时钟概述PLL与PLL控制器的逻辑组成和处理流程如图1所示。PLL控制器能够通过PLLDIV1到PLLDIV16这些分频器灵活便利的配置和修改内部的时钟信号。PLL控制器也包含PLLM和SECCTL寄存器,如图1所示,这些寄存器能够配置好PLLM,OUTPUTDIVIDE和BYPASS的输出。PLL控制器决定DSP核心,外设或者其他模块的输出时钟。
# ~4 s& h' f4 \( J! H; M图1 PLL图示
/ }6 ]$ a2 F# r6 `7 ~: e6 D, A1 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时钟的配置3 h9 l3 T% Y0 r2 n" s- X
#define PLL2_PLLD 0 // Must be less than 64
" A* \, [4 e) s& N#define PLL2_PLLM 19 // Must be less than 4096
8 z5 I, a. _8 h9 c$ s% \1 }7 D6 ]) q' g8 @0 E5 C4 {" T
DDR3PLLCTL1 |= 0x00000040; // Set ENSAT bit = 1
+ `/ ?6 _; T% ]# P" D% R0 ~9 A; `DDR3PLLCTL0 |= 0x00800000; // Set BYPASS bit = 15 W2 i' _; X, _' ?: y. B
* y0 ] r n" r) \
// Clear and program PLLD field
1 n7 a ]' c6 o B, L4 R" h; w; ^DDR3PLLCTL0 &= ~(0x0000003F);# P+ O! X0 Y/ W, _
DDR3PLLCTL0 |= (PLL2_PLLD & 0x0000003F);$ `, \ o0 \/ ?5 v
// Clear and program PLLM field
+ |( w3 h3 h+ tDDR3PLLCTL0 &= ~(0x0007FFC0);! a; ^: ^# N2 w$ {* t
DDR3PLLCTL0 |= ((PLL2_PLLM << 6) & 0x0007FFC0 );- C$ n8 A) h1 f
. o( S# L6 @' ^7 d( C7 X
// Clear and program BWADJ field% M# b% c* o7 _4 E
PLL2_BWADJ = ((PLL2_PLLM + 1) >> 1) - 1;2 Q9 g8 H V5 T+ {
DDR3PLLCTL0 &= ~(0xFF000000);: W/ N. X; R. A, e. Y
DDR3PLLCTL1 &= ~(0x0000000F);0 l% h. T1 S( A" k3 x
DDR3PLLCTL0 |= ((PLL2_BWADJ << 24) & 0xFF000000);+ }3 A9 t( x& T9 E) x, ^ S, T
DDR3PLLCTL1 |= ((PLL2_BWADJ >> 8) & 0x0000000F);1 \& |8 n2 E; R. Z+ B
9 F& |3 I7 ~' ]DDR3PLLCTL1 |= 0x00002000; // Set RESET bit = 1
/ U5 t* T r/ h8 o w; efor(i=0;i<10000;i++); // Wait at least 5us for reset complete5 O3 a2 e9 {; v; ~( e
6 E0 m) I2 k; H8 A+ \, b) BDDR3PLLCTL1 &= ~(0x00002000); // Clear RESET bit( c- k; F. f1 e3 a" z- S+ s9 c# Z" ~
for(i=0;i<70000;i++); // Wait at least 50us for PLL lock+ D2 {# p+ V4 O' h4 P1 X& g( ^
' [6 O3 j( l" w' R
DDR3PLLCTL0 &= ~(0x00800000); // Clear BYPASS bit = 0
: @* E0 N2 q- q. F! V+ b/ J- l' s, d9 T
2,DDR3控制器配置
+ l6 D! E0 K4 E& D6 Z. n, B* y8 o. N int i,TEMP,startlo, stoplo,starthi, stophi;
0 \0 r1 E' r( Y# ~6 g5 { KICK0 = KICK0_UNLOCK;
* o- w* }$ t3 n% A6 f KICK1 = KICK1_UNLOCK;
; a" s9 g* K- r5 d/ ?0 U /* Wait for PLL to lock = min 500 ref clock cycles.
7 |1 u+ A! q6 m$ E) L7 q With refclk = 100MHz, = 5000 ns = 5us */
$ R' {7 ]8 p9 j2 o Delay_milli_seconds(1);
' @/ J; z" w O9 x /***************** 3.2 DDR3 PLL Configuration ************// Y& b1 I# @8 z/ R; A
/* Done before */9 L! ^& p" q7 ?
; q) X, `' \/ A1 Z! N/ i /**************** 3.3 Leveling register configuration ********************/
# j" y. V! l( }2 c DDR3_CONFIG_REG_0 &= ~(0x007FE000); // clear ctrl_slave_ratio field
6 ~' S, W% s3 q3 E* b DDR3_CONFIG_REG_0 |= 0x00200000; // set ctrl_slave_ratio to 0x100# u% \ B* s6 H, F6 R
DDR3_CONFIG_REG_12 |= 0x08000000; // Set invert_clkout = 1
3 g# [- ~' i C i( I# b DDR3_CONFIG_REG_0 |= 0xF; // set dll_lock_diff to 158 y, W1 y' h( l3 [% F! C+ f, x) }- k) c
; L1 c$ G3 n' P
//From 4.2.1 Executing Partial Automatic Leveling -- Start p2 a' [3 o3 l+ p! w8 e
DDR3_CONFIG_REG_23 |= 0x00000200; //Set bit 9 = 1 to use forced ratio leveling for read DQS% h, M4 T6 E% `# Z7 G
//From 4.2.1 Executing Partial Automatic Leveling -- End
( W0 G/ H9 S0 i, X% X //Values with invertclkout = 1
' M/ b' D. r" y4 t ~3 S# x- { /**************** 3.3 Partial Automatic Leveling ********************/: A3 `: t- _& P/ r3 @+ _7 f# Y8 \
DATA0_WRLVL_INIT_RATIO = 0x00;; Q6 G" K& D7 \ f1 P
DATA1_WRLVL_INIT_RATIO = 0x00;; \- m" I- b: L. y! J! n# P
DATA2_WRLVL_INIT_RATIO = 0x00;
' l- p( l' {: A9 Q6 p" L' j DATA3_WRLVL_INIT_RATIO = 0x00;
! _4 ~2 _( e9 V: x5 G/ w DATA4_WRLVL_INIT_RATIO = 0x33;
" b- K L7 v' U" M* ?! ? DATA5_WRLVL_INIT_RATIO = 0x3A;
9 C3 z3 I; s. t$ q. x3 P) o# @. w- g DATA6_WRLVL_INIT_RATIO = 0x2C;
) c. A: q, W! f5 K. ?" B DATA7_WRLVL_INIT_RATIO = 0x2C;; P+ m, M. `3 [0 M
DATA8_WRLVL_INIT_RATIO = 0x21;* {6 i/ E( M7 V: U$ n0 c8 {) N
DATA0_GTLVL_INIT_RATIO = 0x00;
+ H/ B- F4 \ b DATA1_GTLVL_INIT_RATIO = 0x00;$ P3 c7 I9 v7 j- ~: I# l( I
DATA2_GTLVL_INIT_RATIO = 0x00;
2 ~& Z' d. b7 S9 N6 t6 A4 i DATA3_GTLVL_INIT_RATIO = 0x00;
, G' v4 ?# @+ h3 s, M. H DATA4_GTLVL_INIT_RATIO = 0xB7;
* D9 r$ k) G- L DATA5_GTLVL_INIT_RATIO = 0xB1;
7 h" Y! n7 j( V9 d DATA6_GTLVL_INIT_RATIO = 0xA4;
7 N( L. i8 t7 u# ?' j' U/ w DATA7_GTLVL_INIT_RATIO = 0xA4;
0 N8 @1 n% [8 Y* X: C. c9 Z DATA8_GTLVL_INIT_RATIO = 0x98;
4 O' I( V3 D- T$ p //Do a PHY reset. Toggle DDR_PHY_CTRL_1 bit 15 0->1->0
( Q9 I4 \! y, @# _ DDR_DDRPHYC &= ~(0x00008000);
* N* ?9 x1 U, k DDR_DDRPHYC |= (0x00008000);' i( U2 @/ I' Q* e
DDR_DDRPHYC &= ~(0x00008000);
1 N5 b$ j3 t2 e2 P, U) n /***************** 3.4 Basic Controller and DRAM Configuration ************/2 }' G9 L+ }& @, z- G8 E `: r
DDR_SDRFC = 0x0000515C; // enable configuration: v* U) P9 M7 F/ ?' R4 a# E \0 Z2 G
/* DDR_SDTIM1 = 0x1557B9BD; */2 f- r8 b# O. C$ \$ w5 `
TEMP = 0;
- q9 p* X& a# d, |! T TEMP |= 0x09 << 25; // T_RP bit field 28:25
# t: n2 M1 u' L+ k6 ^# ~+ K* | TEMP |= 0x09 << 21; // T_RCD bit field 24:21
0 X# w3 `+ S0 }4 m% q% o TEMP |= 0x09 << 17; // T_WR bit field 20:17( g; b! F) m7 `& p+ ?. l/ D3 Q
TEMP |= 0x17 << 12; // T_RAS bit field 16:12
7 } b& c. J$ l- X7 P. y TEMP |= 0x20 << 6; // T_RC bit field 11:6
' o; A( I0 ]# L4 y7 S TEMP |= 0x1 << 3; // T_RRD bit field 5:3
& V; N- n3 r+ M' f* I0 F" h TEMP |= 0x4; // T_WTR bit field 2:0
( l5 G1 a0 e, G: c DDR_SDTIM1 = TEMP;- B& Y* g( L% ^0 Q$ Q# B* s# @
/* DDR_SDTIM2 = 0x304F7FE3; */
' K; c( H: q# l TEMP = 0;
5 x; G) n/ }; X& n* j. q TEMP |= 0x3 << 28; // T_XP bit field 30:28$ O0 D/ z( I" _1 i) i8 i# H, Q
TEMP |= 0x71 << 16; // T_XSNR bit field 24:161 L5 @8 D! n2 l. x
TEMP |= 0x1ff << 6; // T_XSRD bit field 15:6& z2 [: v) v* _6 k
TEMP |= 0x4 << 3; // T_RTP bit field 5:3
7 R! q7 O4 N' e! j4 v3 L2 ~6 i TEMP |= 0x3; // T_CKE bit field 2:0; Z4 L5 X$ I' Y# p
DDR_SDTIM2 = TEMP;
+ P* `" i' C8 |- c" {' }# U8 t/ Y- j /* DDR_SDTIM3 = 0x559F849F; */! v% m _- A1 U, w. h2 F
TEMP = 0;* C+ `5 Q* m0 d+ r' L8 t# j, C9 I
TEMP |= 0x5 << 28; // T_PDLL_UL bit field 31:28 (fixed value)( T, O- q2 E( P/ i
TEMP |= 0x5 << 24; // T_CSTA bit field 27:24 (fixed value)% y7 {( |9 V5 ~7 c; F0 x8 b
TEMP |= 0x4 << 21; // T_CKESR bit field 23:21: Q" C- V0 }, k# C
TEMP |= 0x3f << 15; // T_ZQCS bit field 20:15, l3 O7 b! z1 |
TEMP |= 0x6A << 4; // T_RFC bit field 12:4, Y* v8 r" n9 o9 S& P3 S( R$ ]* b
TEMP |= 0xf; // T_RAS_MAX bit field 3:0 (fixed value)+ k2 i6 S. Q; m- C% P5 D0 _! V" p/ p
DDR_SDTIM3 = TEMP;
1 f" T. ?2 k# z3 P" k8 w DDR_DDRPHYC = 0x0010010F;
0 v7 T1 ^' H) m D DDR_ZQCFG = 0x70074c1f;
/ Z% r" Y# q% q q9 [ DDR_PMCTL = 0x0;
1 U$ C0 t* x- X9 O //DDR_SDRFC = 0x0000144F; // enable configuration' [1 Y: g/ m D& Y
/* DDR_SDCFG = 0x63077AB3; */1 t: }1 e3 g" k
/* New value with DYN_ODT disabLED and SDRAM_DRIVE = RZQ/7 //0x63222A32; // last config write DRAM init occurs */
$ {0 j6 e# e. L/ W TEMP = 0;
5 G2 q9 f- R- Q c0 t. x( T TEMP |= 0x3 << 29; // SDRAM_TYPE bit field 31:29 (fixed value)
6 @+ M6 k1 `9 { X( c$ V1 W8 S4 a TEMP |= 0x0 << 27; // IBANK_POS bit field 28:275 s1 \' X: |7 T! Y5 m
TEMP |= 0x2 << 24; // DDR_TERM bit field 26:24
. D% c! `3 R! r2 F, }" T TEMP |= 0x2 << 21; // DYN_ODT bit field 22:21( `; D) n/ b0 C
TEMP |= 0x1 << 18; // SDRAM_DRIVE bit field 19:18' b. ], M1 T, ]9 ^3 `
TEMP |= 0x3 << 16; // CWL bit field 17:167 n0 Q4 f# T6 w9 f- ]/ n
TEMP |= 0x1 << 14; // NM bit field 15:14% b6 j% ?/ ]# Z
TEMP |= 0xE << 10; // CL bit field 13:10
5 O1 j5 ^4 N" @$ \0 f2 P5 `" g TEMP |= 0x5 << 7; // ROWSIZE bit field 9:72 G8 D& A: n7 f# _
TEMP |= 0x3 << 4; // IBANK bit field 6:48 @3 s3 E$ \2 [% w2 A' b' [1 B- Z
TEMP |= 0x0 << 3; // EBANK bit field 3:3
( w3 z0 g |" }) X( ~3 w TEMP |= 0x2; // PAGESIZE bit field 2:0
7 C- a: ]) G! p+ K }$ d DDR_SDCFG = TEMP;, @( K$ F3 K+ P$ U2 H
//Wait 600us for HW init to complete6 x7 ?' ]! _% U# r* b
Delay_milli_seconds(1);
7 h0 k* z1 D$ ?: T* W0 q+ t, B DDR_SDRFC = 0x0000144F; //Refresh rate = (7.8*666MHz)
4 _ u6 s* g6 I# ~, r0 R /**************** 4.2.1 Executing Partial Automatic Leveling ********************/) ~* F: \7 s% W+ T3 Y
DDR_RDWR_LVL_RMP_CTRL = 0x80000000; //enable full leveling4 [7 D8 @: ]( y8 d D
DDR_RDWR_LVL_CTRL = 0x80000000; //trigger full leveling - This ignores read DQS leveling result and uses ratio forced value
D" |; I& Y6 G- \5 ~; b' D9 | //(0x34) instead) A% I; m% O+ ]- h2 v6 P
//Wait for min 1048576 DDR clock cycles for leveling to complete = 1048576 * 1.5ns = 1572864ns = 1.57ms.# R# @% a* B' n3 W
//Actual time = ~10-15 ms: m; x( Q! ]% T5 x9 S
Delay_milli_seconds(1);7 p/ [0 ^/ m* h4 A
|