找回密码
 注册
关于网站域名变更的通知
查看: 348|回复: 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核心,外设或者其他模块的输出时钟。
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 15
1 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) _( _

该用户从未签到

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-8-11 17:39 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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