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

9 M1 q) K; i  I0 N9 R( z
9 m9 j, n7 h; j
图1 PLL图示

6 R: b0 J" [, X' U1 ^* a9 }( A$ b1       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时钟的配置
6 B6 l- d/ f& R#define PLL2_PLLD 0   // Must be less than 64/ C0 R8 z9 r! ~8 a* A
#define PLL2_PLLM 19  // Must be less than 4096
* }$ M5 Y1 O! }9 U0 E7 {4 n9 Q# G) k  N5 s: Q, ~
DDR3PLLCTL1 |= 0x00000040;  // Set ENSAT bit = 1. n4 d) i% v+ G4 H/ V
DDR3PLLCTL0 |= 0x00800000;  // Set BYPASS bit = 1
/ d$ |" t5 L2 c9 X# x$ r; I- a3 H. y+ f" S
// Clear and program PLLD field9 Z. F& ]! ?: q% {6 o# c' o
DDR3PLLCTL0 &= ~(0x0000003F);
5 E: k1 A0 j7 W! H4 T9 I) UDDR3PLLCTL0 |= (PLL2_PLLD & 0x0000003F);) H$ D3 D' Q. W9 k: h
// Clear and program PLLM field
: X9 t: z) Q1 R. A8 iDDR3PLLCTL0 &= ~(0x0007FFC0);; B, J9 p5 o' v4 j3 K* m
DDR3PLLCTL0 |= ((PLL2_PLLM << 6) & 0x0007FFC0 );
/ W& Z; }$ \% d+ i' O  M/ H4 n% B% Q
0 K( F. X: i6 v+ S: Q# U1 V. @' p# Z// Clear and program BWADJ field
4 M, u  v0 s, C6 g( c) NPLL2_BWADJ = ((PLL2_PLLM + 1) >> 1) - 1;
" k& f1 I, R' \( ~6 ^DDR3PLLCTL0 &= ~(0xFF000000);1 L3 H6 v/ M0 O) e
DDR3PLLCTL1 &= ~(0x0000000F);
0 ~- ?: E" w. ADDR3PLLCTL0 |= ((PLL2_BWADJ << 24) & 0xFF000000);
- \- M9 J0 V" c+ jDDR3PLLCTL1 |= ((PLL2_BWADJ >> 8) & 0x0000000F);9 d1 _$ d/ B- ?

" ?+ ?. ^1 Q- B  MDDR3PLLCTL1 |= 0x00002000;    // Set RESET bit = 1; N; r1 \- B5 R5 a& j4 F
for(i=0;i<10000;i++); // Wait at least 5us for reset complete
$ {  e; h8 `0 z4 a0 ]5 @# @: m9 y( T6 G6 N% E% {1 s7 K7 T, x
DDR3PLLCTL1 &= ~(0x00002000); // Clear RESET bit1 \& v; Q4 ]3 r0 `2 a
for(i=0;i<70000;i++); // Wait at least 50us for PLL lock
. [7 p- l- Z7 H& S$ ^" T- |
! u$ j! h$ s2 cDDR3PLLCTL0 &= ~(0x00800000); // Clear BYPASS bit = 0
7 I4 a. U8 g  M' _% L

' R& l% }! f) b+ I2,DDR3控制器配置
  F' p) o! o. J7 g& w' W, j   int i,TEMP,startlo, stoplo,starthi, stophi;) {; W/ g6 |8 S* w5 d8 t
    KICK0 = KICK0_UNLOCK;0 c1 C# z* [! H8 g8 p8 ?0 m8 |" w
    KICK1 = KICK1_UNLOCK;% Z& Z3 s/ h  I
    /* Wait for PLL to lock = min 500 ref clock cycles.
9 G1 N% P0 f% B$ T  p: E% f* t       With refclk = 100MHz, = 5000 ns = 5us */+ C/ \) m3 p4 s9 O; G1 U
    Delay_milli_seconds(1);% u0 M) T) V$ g1 m8 [( w
    /***************** 3.2 DDR3 PLL Configuration ************/9 T" }3 V" c) b4 Z. L- A, D$ D
    /* Done before */4 u, {  l  L  j  s6 k- T

; z& W  }% C# I5 m. f( h+ m    /**************** 3.3 Leveling register configuration ********************/- Y$ |- {+ a+ i
    DDR3_CONFIG_REG_0 &= ~(0x007FE000);  // clear ctrl_slave_ratio field& q2 C4 j3 f7 K$ E8 P4 Y. A8 h
    DDR3_CONFIG_REG_0 |= 0x00200000;     // set ctrl_slave_ratio to 0x100
: K: C/ L4 H7 U7 `    DDR3_CONFIG_REG_12 |= 0x08000000;    // Set invert_clkout = 1  H5 C" b8 x1 ?0 Z/ g
    DDR3_CONFIG_REG_0 |= 0xF;            // set dll_lock_diff to 15

% @7 D! v( t4 o$ \$ |1 Q; x  R8 C# I8 P
    //From 4.2.1 Executing Partial Automatic Leveling -- Start
5 i/ T0 E" l3 V) O/ r    DDR3_CONFIG_REG_23 |= 0x00000200;    //Set bit 9 = 1 to use forced ratio leveling for read DQS& P4 J: Y* ^' d  \% g) W
    //From 4.2.1 Executing Partial Automatic Leveling -- End9 j8 c5 h1 M3 i4 [) U; _, k4 l2 v
    //Values with invertclkout = 1
* V: _/ I& |2 i9 W% H6 t6 v# r6 ~    /**************** 3.3 Partial Automatic Leveling ********************/0 n; W$ W$ c+ i
    DATA0_WRLVL_INIT_RATIO = 0x00;3 V) i( ~- Q! D( c% Z: s! I
    DATA1_WRLVL_INIT_RATIO = 0x00;
+ d) B: t2 V! J# f, }$ S1 w0 e    DATA2_WRLVL_INIT_RATIO = 0x00;7 t8 V5 t2 ^% K: l/ n. R
    DATA3_WRLVL_INIT_RATIO = 0x00;
* y7 `4 R, s7 L; _    DATA4_WRLVL_INIT_RATIO = 0x33;7 K# M* R$ S/ U$ {
    DATA5_WRLVL_INIT_RATIO = 0x3A;2 `! J" y- ~1 _% M! _. [. F. g3 T
    DATA6_WRLVL_INIT_RATIO = 0x2C;% b# P  k" L- B7 |
    DATA7_WRLVL_INIT_RATIO = 0x2C;0 ~1 N' o# G7 p" L1 F6 C  c7 \
    DATA8_WRLVL_INIT_RATIO = 0x21;  f) [) b9 ]1 e0 Z9 j, l( \& _6 y
    DATA0_GTLVL_INIT_RATIO = 0x00;, E3 U6 A- `6 t3 [
    DATA1_GTLVL_INIT_RATIO = 0x00;
, r# d# w. C# u5 C4 O9 ?/ c    DATA2_GTLVL_INIT_RATIO = 0x00;4 W/ I/ q' w4 y
    DATA3_GTLVL_INIT_RATIO = 0x00;- O: V* ~1 K* D! P
    DATA4_GTLVL_INIT_RATIO = 0xB7;
) B- W: W) V% [; L. }- \3 }% j    DATA5_GTLVL_INIT_RATIO = 0xB1;
7 c5 E8 q) p8 |3 R2 `    DATA6_GTLVL_INIT_RATIO = 0xA4;
; U- t9 B: J8 y" l: Z9 k# d    DATA7_GTLVL_INIT_RATIO = 0xA4;: |& n, E2 e+ U$ r' u
    DATA8_GTLVL_INIT_RATIO = 0x98;; k* s# X* K: U) P  q
    //Do a PHY reset. Toggle DDR_PHY_CTRL_1 bit 15 0->1->0
6 f  g( h3 W& H2 m9 E    DDR_DDRPHYC &= ~(0x00008000);  a  C* ?- K3 J3 L" e5 s/ q3 P
    DDR_DDRPHYC |= (0x00008000);7 j* d+ ]$ L8 Y
    DDR_DDRPHYC &= ~(0x00008000);
# @) h1 u' U/ i9 q. ~' z    /***************** 3.4 Basic Controller and DRAM Configuration ************/
+ y' V" M. f# `; u* g    DDR_SDRFC    = 0x0000515C;    // enable configuration
( e" M* z0 M3 w* B1 n1 `9 f    /* DDR_SDTIM1   = 0x1557B9BD; */
5 [& l8 l4 l# L" |8 ]9 S    TEMP = 0;
# t, v# C; x3 M, ]- c& i) F    TEMP |= 0x09 << 25; // T_RP bit field 28:25; s4 m4 Q; l; G- m: \& C  E1 v
    TEMP |= 0x09 << 21; // T_RCD bit field 24:21
3 O  f3 [$ y* U. z    TEMP |= 0x09 << 17; // T_WR bit field 20:17
9 O3 I" }# l: K    TEMP |= 0x17 << 12; // T_RAS bit field 16:12& U- O7 @, T) X! K- J! x# ^
    TEMP |= 0x20 << 6; // T_RC bit field 11:67 ^; |" M% t1 p* E
    TEMP |= 0x1 << 3; // T_RRD bit field 5:3
. l2 ]5 |4 s1 Z& ?5 O/ a    TEMP |= 0x4; // T_WTR bit field 2:0
  R: S+ e* U- s# [0 d" n  j, K    DDR_SDTIM1 = TEMP;, {1 Q  }  N; x
    /* DDR_SDTIM2   = 0x304F7FE3; */6 ]' P) }$ U- @
    TEMP = 0;
* q! B8 r* Y# g2 e7 K# N6 B$ d- T    TEMP |= 0x3 << 28; // T_XP bit field 30:28
( Y- [% X; P6 Q5 G    TEMP |= 0x71 << 16; // T_XSNR bit field 24:161 S, ?  x: W- d( o% n/ Y3 J- u% `
    TEMP |= 0x1ff << 6; // T_XSRD bit field 15:6
+ G% R( l; p! ]% U" b    TEMP |= 0x4 << 3; // T_RTP bit field 5:3) j6 }$ E( o) O0 p' P8 w$ w- W
    TEMP |= 0x3; // T_CKE bit field 2:0
1 U; D' q- h$ F% H3 o$ W    DDR_SDTIM2 = TEMP;* u- O, j7 L6 j( e+ w8 f( f
    /*  DDR_SDTIM3   = 0x559F849F; */; I" B, H) n; @
    TEMP = 0;
. z0 r/ ]( ^/ I8 j3 W& e6 Z8 [- H    TEMP |= 0x5 << 28; // T_PDLL_UL bit field 31:28 (fixed value)/ a) o  U: B! n( w5 T3 A6 u4 U
    TEMP |= 0x5 << 24; // T_CSTA bit field 27:24 (fixed value)
1 g& ]' T5 n8 h" r+ s; a" J    TEMP |= 0x4 << 21; // T_CKESR bit field 23:21
+ ?* G( A% a& y/ a    TEMP |= 0x3f << 15; // T_ZQCS bit field 20:15
; `1 b5 u9 C( O8 v" |$ s: Z+ `8 z    TEMP |= 0x6A << 4; // T_RFC bit field 12:48 n6 w- X( C" G7 Y" k. t% V
    TEMP |= 0xf; // T_RAS_MAX bit field 3:0 (fixed value)
  p& ]5 W" J* x# P: Q( ?    DDR_SDTIM3 = TEMP;' B' i6 ~5 Z( N3 e# l
    DDR_DDRPHYC  = 0x0010010F;/ z( `6 A' G5 B
    DDR_ZQCFG    = 0x70074c1f;
; T# a3 h$ I0 ~& V$ b1 i) L    DDR_PMCTL    = 0x0;
  d, v: ?8 h9 p: Q" m" D* X6 c    //DDR_SDRFC = 0x0000144F; // enable configuration2 N. V! q0 {- ?' s! @+ _, i- x
    /* DDR_SDCFG    = 0x63077AB3; */
3 W6 p( d7 a; s    /* New value with DYN_ODT disabLED and SDRAM_DRIVE = RZQ/7 //0x63222A32;    // last config write DRAM init occurs */
" @" X  G- E; z$ s2 W    TEMP = 0;# s; E) Z. `7 J- s+ u% |4 K) E. t
    TEMP |= 0x3 << 29; // SDRAM_TYPE bit field 31:29 (fixed value)! V9 D0 d0 s; }: F6 ~* k0 m- u
    TEMP |= 0x0 << 27; // IBANK_POS bit field 28:27- k/ `- h+ j0 z% F* c  p3 Z
    TEMP |= 0x2 << 24; // DDR_TERM bit field 26:24- X" J- E% D+ p1 v! O6 J
    TEMP |= 0x2 << 21; // DYN_ODT bit field 22:21
: ^- g* y5 X; I0 v! {5 O    TEMP |= 0x1 << 18; // SDRAM_DRIVE bit field 19:18) o5 m+ n, R  e. k) Q7 z  u. V
    TEMP |= 0x3 << 16; // CWL bit field 17:162 Q) R! g. N/ ~8 A  V8 ^
    TEMP |= 0x1 << 14; // NM bit field 15:14
. p3 N2 I# k# v' U5 F. u' @    TEMP |= 0xE << 10; // CL bit field 13:10% [! b! `/ n% u; S
    TEMP |= 0x5 << 7; // ROWSIZE bit field 9:7) A0 G4 A0 K8 t9 S1 v2 @
    TEMP |= 0x3 << 4; // IBANK bit field 6:4
/ K4 A( y) v4 Y- O( j    TEMP |= 0x0 << 3; // EBANK bit field 3:3
) B2 B8 f) E/ p8 D$ _8 o    TEMP |= 0x2; // PAGESIZE bit field 2:0" t$ `: R1 i* w2 A- E4 y
    DDR_SDCFG = TEMP;
) \9 g0 ?. S+ i) R+ d    //Wait 600us for HW init to complete
5 g& R- `: S$ z* D' b1 l) V% }    Delay_milli_seconds(1);
0 S7 U0 U' P" p) h( u; c/ @6 E    DDR_SDRFC = 0x0000144F;       //Refresh rate = (7.8*666MHz)7 ]% ~0 \- r4 Q2 f6 J
    /**************** 4.2.1 Executing Partial Automatic Leveling ********************/
! G  O) T5 v5 i    DDR_RDWR_LVL_RMP_CTRL = 0x80000000; //enable full leveling" ^, t  ~6 a6 D. f" C( \9 ^
    DDR_RDWR_LVL_CTRL = 0x80000000; //trigger full leveling - This ignores read DQS leveling result and uses ratio forced value  . e+ {. n3 X2 Y. n
    //(0x34) instead4 n% h% J/ L$ B1 t+ X6 l
    //Wait for min 1048576 DDR clock cycles for leveling to complete = 1048576 * 1.5ns = 1572864ns = 1.57ms.3 K+ Y9 P) k, O
    //Actual time = ~10-15 ms% O; \( c/ V% z0 c  ~& ]5 ?2 `
    Delay_milli_seconds(1);
( y, A0 g/ k* o% e( o$ y! J/ Z% H

该用户从未签到

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-23 22:39 , Processed in 0.171875 second(s), 26 queries , Gzip On.

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

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

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