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

# M$ {* p& n9 \" ]2 y: t

# ~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 15
8 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

该用户从未签到

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-11-24 02:59 , Processed in 0.187500 second(s), 26 queries , Gzip On.

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

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

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