找回密码
 注册
关于网站域名变更的通知
查看: 358|回复: 2
打印 上一主题 下一主题

TIC665x主时钟配置和DDR3控制器配置

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-20 14:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
6655时钟PLL配置与ddr3的配置
1       时钟概述
PLL与PLL控制器的逻辑组成和处理流程如图1所示。PLL控制器能够通过PLLDIV1到PLLDIV16这些分频器灵活便利的配置和修改内部的时钟信号。PLL控制器也包含PLLM和SECCTL寄存器,如图1所示,这些寄存器能够配置好PLLM,OUTPUTDIVIDE和BYPASS的输出。PLL控制器决定DSP核心,外设或者其他模块的输出时钟。

" Q9 S* ]* w* ?3 H) K
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, \: }

该用户从未签到

2#
发表于 2021-10-20 14:38 | 只看该作者
PLL控制器决定DSP核心,外设或者其他模块的输出时钟

该用户从未签到

3#
发表于 2021-10-20 16:46 | 只看该作者
PLL和PLL控制器的初始化在设备复位后由软件配置
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-13 04:13 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表