EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6655时钟PLL配置与ddr3的配置 1 时钟概述PLL与PLL控制器的逻辑组成和处理流程如图1所示。PLL控制器能够通过PLLDIV1到PLLDIV16这些分频器灵活便利的配置和修改内部的时钟信号。PLL控制器也包含PLLM和SECCTL寄存器,如图1所示,这些寄存器能够配置好PLLM,OUTPUTDIVIDE和BYPASS的输出。PLL控制器决定DSP核心,外设或者其他模块的输出时钟。 5 O. D2 U4 ~! `- P- m
图1 PLL图示 # Z! q' G+ l3 Q
1 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 o1 N0 [: j+ z) l
#define PLL2_PLLD 0 // Must be less than 648 h6 |- z* [. C
#define PLL2_PLLM 19 // Must be less than 40969 k+ q; X0 F3 b
8 Z- B2 |4 A( L O# XDDR3PLLCTL1 |= 0x00000040; // Set ENSAT bit = 1
" c3 p4 C, M$ S; _7 D$ NDDR3PLLCTL0 |= 0x00800000; // Set BYPASS bit = 1
) M' m4 X& I5 \: r ]8 j* I2 |) m! b0 T
// Clear and program PLLD field8 c/ ?! Y% T2 f, `% S
DDR3PLLCTL0 &= ~(0x0000003F); j0 I: r) D0 X$ `# U& R) ?$ ]
DDR3PLLCTL0 |= (PLL2_PLLD & 0x0000003F);2 ^* v8 s1 d1 s6 x0 x# D
// Clear and program PLLM field; |" T2 k F: Z2 q2 X& m( i
DDR3PLLCTL0 &= ~(0x0007FFC0);, }- s2 v7 h7 _3 m
DDR3PLLCTL0 |= ((PLL2_PLLM << 6) & 0x0007FFC0 );
Y/ g; v. w2 F0 H- g* b0 Y9 G F5 i8 F P
// Clear and program BWADJ field* s- t7 n/ {- x8 F0 t4 g1 A; ]
PLL2_BWADJ = ((PLL2_PLLM + 1) >> 1) - 1;. B, j! o& Y2 H! x7 m
DDR3PLLCTL0 &= ~(0xFF000000);& u; d0 M4 c0 C x
DDR3PLLCTL1 &= ~(0x0000000F);
" O$ v) c$ T' S2 y+ b' R! sDDR3PLLCTL0 |= ((PLL2_BWADJ << 24) & 0xFF000000);
9 c3 _+ p I+ m& dDDR3PLLCTL1 |= ((PLL2_BWADJ >> 8) & 0x0000000F);
1 u# S) ^1 ?9 ]' G, O2 }. K7 W; K2 H! a% \6 _& l6 K, a) S7 Y
DDR3PLLCTL1 |= 0x00002000; // Set RESET bit = 1/ I3 Q8 t1 c) X" ]# G4 d! B2 D
for(i=0;i<10000;i++); // Wait at least 5us for reset complete
: `0 @& T/ |1 N- m: ~' ?* C3 J" ^/ h' f6 I! T
DDR3PLLCTL1 &= ~(0x00002000); // Clear RESET bit
3 }5 _! }+ X/ ~; m3 @7 ffor(i=0;i<70000;i++); // Wait at least 50us for PLL lock
+ l4 L4 z- @% g' M$ F( v
- B. X% f0 u$ `8 {" XDDR3PLLCTL0 &= ~(0x00800000); // Clear BYPASS bit = 0& ? \9 D A! F1 L& U! a5 W( Z2 I
) [1 h7 T) M T0 F, K0 u9 i" G9 X
2,DDR3控制器配置
7 J( e$ j% |9 ? int i,TEMP,startlo, stoplo,starthi, stophi;4 E7 S6 O, f& N0 o& o& C f
KICK0 = KICK0_UNLOCK;
1 D5 [- x l- [' T# S/ U2 i KICK1 = KICK1_UNLOCK;$ y* z$ p. z1 O# [& {# `, ?. i
/* Wait for PLL to lock = min 500 ref clock cycles. m7 g+ w' t i* b0 v
With refclk = 100MHz, = 5000 ns = 5us */
/ s, V9 q" a' }; ]6 ? Delay_milli_seconds(1);2 O, o4 r) g! l& p. f' I) w
/***************** 3.2 DDR3 PLL Configuration ************/! C1 I6 p4 c# i/ G9 E, H
/* Done before */+ H2 d( s) q! W8 m
% Y9 @# u; T6 I/ P5 d/ x5 w /**************** 3.3 Leveling register configuration ********************/
$ F$ v# u V# s$ H! U( ~- m DDR3_CONFIG_REG_0 &= ~(0x007FE000); // clear ctrl_slave_ratio field
3 D% w* U2 @8 o( m J4 C7 E- A DDR3_CONFIG_REG_0 |= 0x00200000; // set ctrl_slave_ratio to 0x100' \: q# @+ G2 N" B P2 i# |0 Q
DDR3_CONFIG_REG_12 |= 0x08000000; // Set invert_clkout = 15 p. E C6 Q) ?/ J
DDR3_CONFIG_REG_0 |= 0xF; // set dll_lock_diff to 15
/ x$ I6 Y, s/ g$ Z$ x- c# }% W& T" h9 D: C+ z% ]" q3 s m
//From 4.2.1 Executing Partial Automatic Leveling -- Start) P8 y0 m( ~0 _) e p
DDR3_CONFIG_REG_23 |= 0x00000200; //Set bit 9 = 1 to use forced ratio leveling for read DQS- `" ~; x- B+ i4 p
//From 4.2.1 Executing Partial Automatic Leveling -- End2 l! v& v p: ~ j4 n
//Values with invertclkout = 13 x2 B2 T7 Q- }7 @: `
/**************** 3.3 Partial Automatic Leveling ********************/
6 h0 @% |) _5 R; l G+ J DATA0_WRLVL_INIT_RATIO = 0x00;
. }" B. \! v( V) b1 f3 v) G1 b DATA1_WRLVL_INIT_RATIO = 0x00;
0 I _3 V. _$ u# t/ x4 _ DATA2_WRLVL_INIT_RATIO = 0x00;1 g/ v/ ], ^( ~3 ]0 o0 _
DATA3_WRLVL_INIT_RATIO = 0x00;
/ g- {( `1 ?" I m# r1 Z5 G DATA4_WRLVL_INIT_RATIO = 0x33;: _- v# U5 J$ ^; h, k( ?) u
DATA5_WRLVL_INIT_RATIO = 0x3A;
( o/ G( U4 U h+ f2 f+ {3 X DATA6_WRLVL_INIT_RATIO = 0x2C;
* P5 M( H1 \# Y/ U# i1 X DATA7_WRLVL_INIT_RATIO = 0x2C;
M0 C2 r' O5 p- r1 M$ p& E2 |. g DATA8_WRLVL_INIT_RATIO = 0x21;" e; g1 {( Y/ ^9 o M
DATA0_GTLVL_INIT_RATIO = 0x00;
+ U5 [% W; u2 x+ a8 E DATA1_GTLVL_INIT_RATIO = 0x00;
0 a5 P7 t0 ]" R* S+ D1 F DATA2_GTLVL_INIT_RATIO = 0x00;
) s8 m1 S4 a. I( @ DATA3_GTLVL_INIT_RATIO = 0x00;
) V4 {, m+ o/ N3 Y4 Q2 _9 r DATA4_GTLVL_INIT_RATIO = 0xB7;
, [9 D c# K. ]3 [6 y1 R DATA5_GTLVL_INIT_RATIO = 0xB1;
% k6 F; V* O0 g9 h( r& E DATA6_GTLVL_INIT_RATIO = 0xA4;" ^; l. d4 C5 F
DATA7_GTLVL_INIT_RATIO = 0xA4;' P& A9 ]! C' j( q5 y. v/ H/ S
DATA8_GTLVL_INIT_RATIO = 0x98;
( k& F/ R, B4 Z1 |" [/ I! o //Do a PHY reset. Toggle DDR_PHY_CTRL_1 bit 15 0->1->0: C% a1 {7 m& |" I
DDR_DDRPHYC &= ~(0x00008000);
, U5 n/ p( A* [/ \0 L8 V DDR_DDRPHYC |= (0x00008000);5 e& w }% `- x( ]8 g3 \9 P
DDR_DDRPHYC &= ~(0x00008000);1 t( H) g; @& q' G5 }: p1 I+ n
/***************** 3.4 Basic Controller and DRAM Configuration ************/: V5 E/ }7 |1 J1 y4 e0 J7 Z
DDR_SDRFC = 0x0000515C; // enable configuration) x# u4 N' E9 w2 ^ A& G
/* DDR_SDTIM1 = 0x1557B9BD; */
% w( `' C( T% R- b TEMP = 0;
- _4 W. t# ]9 L0 L$ s/ E TEMP |= 0x09 << 25; // T_RP bit field 28:253 `" W: U- j3 @& h
TEMP |= 0x09 << 21; // T_RCD bit field 24:21: z9 i7 b+ V: _& U! x9 Y$ f& ~
TEMP |= 0x09 << 17; // T_WR bit field 20:17
' L/ ~8 x+ r' ]5 f$ T2 E3 Y. { TEMP |= 0x17 << 12; // T_RAS bit field 16:121 ~/ p9 y! I9 c9 m% K4 v" N* H
TEMP |= 0x20 << 6; // T_RC bit field 11:6
! {0 f$ R/ H3 v6 ^% C; C. J9 t TEMP |= 0x1 << 3; // T_RRD bit field 5:3
$ @) ~9 t/ V# P. N4 s TEMP |= 0x4; // T_WTR bit field 2:0
! Q. }7 l- D: k8 k2 m DDR_SDTIM1 = TEMP;% Y8 N J% f3 _' \, q8 t3 D S
/* DDR_SDTIM2 = 0x304F7FE3; */
3 r6 E' s, A& p% } TEMP = 0;" \$ [) g) {7 s/ j. h
TEMP |= 0x3 << 28; // T_XP bit field 30:28
& N1 b3 a% U6 i! m: a3 B1 t TEMP |= 0x71 << 16; // T_XSNR bit field 24:16: b6 w; U; b% n7 [& N& p
TEMP |= 0x1ff << 6; // T_XSRD bit field 15:6
0 |; }, T5 o ~3 T TEMP |= 0x4 << 3; // T_RTP bit field 5:3& F5 e. d }9 [) X
TEMP |= 0x3; // T_CKE bit field 2:0) h3 _5 R; @# x
DDR_SDTIM2 = TEMP;8 W8 U% d# J/ r8 g$ [
/* DDR_SDTIM3 = 0x559F849F; */
p- Y' k3 P' ?& c TEMP = 0;
+ C& M2 Z. N; |, u TEMP |= 0x5 << 28; // T_PDLL_UL bit field 31:28 (fixed value)! |& f. C& n+ r+ d$ ~# ~) x
TEMP |= 0x5 << 24; // T_CSTA bit field 27:24 (fixed value)9 [ a( q0 c8 w( |- u4 J1 O
TEMP |= 0x4 << 21; // T_CKESR bit field 23:21
% g% o/ Z% `7 Y& ]$ U TEMP |= 0x3f << 15; // T_ZQCS bit field 20:156 t6 ^% K6 F2 G9 }( O
TEMP |= 0x6A << 4; // T_RFC bit field 12:4
7 a1 A5 R; t+ i! N3 [ TEMP |= 0xf; // T_RAS_MAX bit field 3:0 (fixed value)6 ]- _( f6 i# Y1 ~. S
DDR_SDTIM3 = TEMP;) v1 c9 k- r/ w
DDR_DDRPHYC = 0x0010010F;
; N$ N, H! R( b e1 ~+ l DDR_ZQCFG = 0x70074c1f;7 M6 H9 `4 L; r9 y- B
DDR_PMCTL = 0x0;
) z( ~- I( O( M) o j //DDR_SDRFC = 0x0000144F; // enable configuration) m- Q, F, _4 H( a0 _6 R
/* DDR_SDCFG = 0x63077AB3; */
4 J& o0 e. o/ k* W6 c* C /* New value with DYN_ODT disabLED and SDRAM_DRIVE = RZQ/7 //0x63222A32; // last config write DRAM init occurs */% z% k0 ]$ p- w: I
TEMP = 0;9 U4 ^! b# ]6 K( H' ^
TEMP |= 0x3 << 29; // SDRAM_TYPE bit field 31:29 (fixed value)
! X( a7 J K: ]- _( \% W' \ TEMP |= 0x0 << 27; // IBANK_POS bit field 28:27: p r% L) z4 B% [, D
TEMP |= 0x2 << 24; // DDR_TERM bit field 26:244 j9 h* q$ f8 i, s8 q" p% V
TEMP |= 0x2 << 21; // DYN_ODT bit field 22:21 ?3 T* W7 `! X, c" `
TEMP |= 0x1 << 18; // SDRAM_DRIVE bit field 19:186 V) E2 r9 O7 ~' r0 ?
TEMP |= 0x3 << 16; // CWL bit field 17:16, f+ w. i2 t. i( x9 U ^
TEMP |= 0x1 << 14; // NM bit field 15:144 ^: p- \! t& l2 S# M* m( R8 I
TEMP |= 0xE << 10; // CL bit field 13:10
3 K+ V' s! c1 I _9 q TEMP |= 0x5 << 7; // ROWSIZE bit field 9:78 b- ^# y2 W% l T2 h# Q2 M0 G8 K
TEMP |= 0x3 << 4; // IBANK bit field 6:4( F+ L& r$ n5 D
TEMP |= 0x0 << 3; // EBANK bit field 3:3
8 I0 p2 i& h C# n1 Y5 {( k3 B' | TEMP |= 0x2; // PAGESIZE bit field 2:0: h( g" n$ b7 b9 d
DDR_SDCFG = TEMP;
; X, V+ Q% ^2 ] w //Wait 600us for HW init to complete! Z' M, j1 {! G1 n' C' @
Delay_milli_seconds(1);
. m% i6 o% |/ \ DDR_SDRFC = 0x0000144F; //Refresh rate = (7.8*666MHz)
0 U/ `! R6 f0 M' Q9 x- |$ ? /**************** 4.2.1 Executing Partial Automatic Leveling ********************/
2 E+ a/ m' ~8 K3 A$ m) l0 C2 [ DDR_RDWR_LVL_RMP_CTRL = 0x80000000; //enable full leveling
' c3 }& h$ i/ h& R DDR_RDWR_LVL_CTRL = 0x80000000; //trigger full leveling - This ignores read DQS leveling result and uses ratio forced value $ p& b- S3 b$ u' U+ r; z0 B1 M
//(0x34) instead; J! e* l0 K# n( u% [, W- ?/ _
//Wait for min 1048576 DDR clock cycles for leveling to complete = 1048576 * 1.5ns = 1572864ns = 1.57ms.' f x0 _- `# O' w/ t, |; ]
//Actual time = ~10-15 ms" z! `( w( G' d& S+ a* Q' |& E. t
Delay_milli_seconds(1);5 j9 a& E( v6 z5 i# O R! E, \: }
|