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

SDRAM操作代码分析

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-11-26 13:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
本帖最后由 grand 于 2021-11-26 15:54 编辑 ( ]+ M( F: M; y& Y

* [: \! k+ E$ v0 L8 r不多说先放代码:
, P% v) E) k3 L( E: z: f
& f$ Y. ~' I. T) j
4 H% i  Z. W4 d. H<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>2 |# j7 g( W2 \; Z- |' `
#include <csl_pll.h>% ?; `, I6 ~# H9 t" J3 C( F3 r
#include <csl_emif.h>
8 O% ^; x/ H3 X# a#include <csl_chip.h>
& b9 [  F# w2 V/ ]#include <stdio.h>
% P6 T' U/ X; |% ?
# a- z$ I. [# O( o! A% [1 K" ]Uint16 x;
/ t, w( [: p3 d8 _5 W9 R: uUint32 y;+ d( m- @4 r8 q$ b3 f4 z5 B7 f# n
CSLBool b;' @! i% I+ P0 Z0 u& A
unsigned int datacount = 0;
0 p' k' q( X1 A: E; J0 S! @int databuffer[1000] ={0};
2 O  O" s  B0 l9 H9 bint *souraddr,*deminaddr;
# X$ l3 T' d" q/*锁相环的设置*/$ P6 p, z! ]  `4 E7 N/ N$ J3 h
PLL_Config  myConfig      = {7 N) f+ T, b$ G  O, o( E. K/ s# W2 _
  0,    //IAI: the PLL locks using the same process that was underway
+ E+ t/ f/ H: K" _5 ^                //before the idle mode was entered9 X* B2 ?' |: @8 u* @
  1,    //IOB: If the PLL indicates a break in the phase lock, 3 j2 }' U9 t+ S1 h
                //it switches to its bypass mode and restarts the PLL phase-locking
! ], n4 J0 P6 \! i0 \7 G                //sequence
6 b. U7 Z. I2 B, c6 |! ]9 W  20,    //PLL multiply value; multiply 20 times3 d) v+ H  C; Q; d
  1             //Divide by 2 PLL divide value; it can be either PLL divide value
( s9 z3 i; C% ?0 h                //(when PLL is enabled), or Bypass-mode divide value) u. h6 g% [' a: q% a
                //(PLL in bypass mode, if PLL multiply value is set to 1)1 t# g% T& Y6 |) k( ]! Z9 _
};: W2 Q6 h5 `$ n; F% J' s
/*SDRAM的EMIF设置*/- R, r8 Z. b% X
EMIF_Config emiffig = {
) v$ S& Z% m6 B  e" V  0x0021,     //EGCR  : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
& P: n9 d: v, {% i& f5 j              //          the WPE = 0 ,forbiden the writing posting when we debug the EMIF
! Y0 w- I0 I9 n              //        the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin* ?2 X: d; R! c
              //        the NOHOLD = 1,HOLD requests are not recognized by the EMIF
4 N  f4 \, K0 }  0xFFFF,    //EMI_RST: any write to this register resets the EMIF state machine
6 d6 i4 J5 A, c3 l/ }5 a: X. [5 d  0x3FFF,    //CE0_1:  CE0 space control register 1
/ C" R4 Z9 R# V  E1 h              //        MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width
& ]4 K/ h% k0 g6 v$ x5 ]  0xFFFF,   //CE0_2:  CE0 space control register 2
$ {& D: }* B6 x+ ~  0x00FF,   //CE0_3:  CE0 space control register 3
, G  i$ S# _4 B6 N1 W3 T              //        TIMEOUT = 0xFF;' T' ~1 B- Z: d6 y8 }% R" y7 V
  0x7FFF,    //CE1_1:  CE0 space control register 1/ D! m8 f. j4 t9 @5 k# `
  0xFFFF,    //CE1_2:  CE0 space control register 2. t6 }! J* M* ?3 G* O9 Q& `$ u
  0x00FF,    //CE1_3:  CE0 space control register 3
* N# Z0 r# ?5 {/ @# G- L/ a- p- T  
, X+ o1 Y7 [6 W! }& ?  0x7FFF,    //CE2_1:  CE0 space control register 1
% W$ O  b- J+ E, g; t" Y  0xFFFF,    //CE2_2:  CE0 space control register 2" {* k5 e% _0 Y3 I3 a2 A) ^% N
  0x00FF,    //CE2_3:  CE0 space control register 3
. n( g7 Z7 ~* T+ I: {$ ~  & U( d8 s( {8 Q! e9 T$ \0 X, f
  0x7FFF,    //CE3_1:  CE0 space control register 1
/ `0 h3 i' b* h- s2 b8 ?  0xFFFF,    //CE3_2:  CE0 space control register 2
( c3 _* g8 ]5 m6 {( G, ~  0x00FF,    //CE3_3:  CE0 space control register 3: ^, y1 J" @' H' L0 r0 N3 N2 P
  3 z# k  o  F: _3 }, q# V; B
  0x2922,   //SDC1:   SDRAM control register 1
% T! x2 b9 `1 O: G# Z/ U              //          TRC = 8     
7 {7 f" W% g2 Z6 p1 K              //        SDSIZE = 0;SDWID = 0. c8 b, J5 S! ~; p* P* m/ ^6 u+ _
              //        RFEN = 12 H! D* [% p. \/ j4 n+ ?( ^7 \
              //        TRCD = 2
; z- W! `  Q4 C! \# ]9 _              //        TRP  = 2% W; y' A9 p0 d3 i
  0x0410,    //SDPER : SDRAM period register
  K( J! P" o  r8 @$ o$ m              //          7ns *4096
7 N$ {4 m* y, M4 q$ s. P8 a% k( A  0x07FF,    //SDINIT: SDRAM initialization register0 s  l5 }1 y1 y# n" Q# e- L
              //        any write to this register to init the all CE spaces,
  {" v9 ^' Z2 A) I              //        do it after hardware reset or power up the C55x device
: c1 e2 L0 L: C6 \7 U5 J% o; A  0x0131    //SDC2:      SDRAM control register 2
. }# E4 U- O  F" X9 R+ U              //        SDACC = 0;
% w5 |- n' a  D% |  V# T              //        TMRD = 01;" L" q; D8 Z* J; R" h1 Y6 I
              //        TRAS = 0101;
$ f2 \* [7 l9 g9 R" y              //        TACTV2ACTV = 0001;                                
  \) I3 @' M; D5 ]* E2 e. d  D  };
' p. ^) c4 j+ A$ t ) [; ?) |2 Q% D
" E' {, H# j+ w1 l0 o. |6 i
main()
. D) |$ l; n+ s* W" t* M- l( T{0 g, L+ g* V5 r$ G$ w6 |
    unsigned int error=0;
" z+ F2 t9 Z2 |    /*初始化CSL库*/   
8 J3 {0 s/ ?: H    CSL_init();
" i3 t, H  {! b8 S; B- y; X    9 ?; W- J7 ?3 Q6 A6 E2 r% r2 z
    /*EMIF为全EMIF接口*/
  v4 T9 [2 _& Z/ O6 k; ~    CHIP_RSET(XBSR,0x0a01);
% H0 J' F& V$ U7 i6 Y. Y6 q   
7 K/ J' d+ W' L5 s( o    /*设置系统的运行速度为120MHz*/, w% m% N6 A0 f& K
    PLL_config(&myConfig);9 w1 e6 }5 a* I5 v( m$ R" K
   
  A. J# @  I6 S* {5 @' h# x2 y7 `    /*初始化DSP的外部SDRAM*/* s5 B* R( o/ R1 _  z0 m4 [- r
    EMIF_config(&emiffig);
5 d$ \7 j9 q/ P+ t  C2 G    /*向SDRAM中写入数据*/3 [5 b0 t/ a! a9 A, o  X" L4 L

9 q# j. v* q( {! D$ c    souraddr =  (int *)0x40000;
; V2 Z0 W  [; Z2 r+ E8 {/ [) f    deminaddr = (int *)0x41000;, m- [: C% Q& {: {- `3 S
    while(souraddr<deminaddr)
+ B6 Y5 U# l$ }2 X) T    {' n7 z( h; ^& p. P: q: U
        *souraddr++ = datacount;   
& B+ j1 P2 f' u6 U; A        datacount++    ;
' T' p4 U. @" a. \1 E3 N    }% h2 i: c& k- J' I" q9 n5 m9 }
    /*读出SDRAM中的数据*/
0 O" I$ q/ B9 Y0 p* B    souraddr =  (int *)0x40000;1 f; t2 s. k, n- y) q& N
    datacount = 0;' a: P5 `8 b4 c) e9 F
    while(souraddr<deminaddr)8 f5 \" b, `5 ?4 a2 J. k) m4 @
    {
" ]6 v5 S, O9 ~0 U' T5 X- a0 h        databuffer[datacount++] = *souraddr++;
. ~" z$ s2 D* p* R  H, s# R        if(databuffer[datacount-1]!=(datacount-1))5 `: e. r9 F- v/ x  Q
            error++;
! O9 y# E' f8 r7 k    }1 T6 \0 ]/ F5 l) W4 W! p
) B. Q" G* s7 w. _. g8 y( t& e
    while(1);- L/ s3 m! B, W' F
}
9 @9 b$ `+ R9 B5 o* H$ }- Y/*************************</span></span>
0 Q, b* M, t  S$ Q! p下面分部分分析:
; K2 g5 G* Z* X! x7 n: M0 |锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的/ j$ |* ~) p( R* c

) }  q% C6 \, i# |  Z# ]
, ^# ?$ z: _' p: B7 @; b/ o PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,7 ^1 g* \( c! G& f, ]# c
  t7 O1 T) n* D1 C! B1 F) g4 C7 ^
在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。4 d) N# L9 v  E2 j

& Z7 M4 o8 I; A: u4 q. y* \+ nIAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle
* j4 ]+ ^6 u7 |/ ~4 j: |; s; ^1 R1 I* N: Z/ o. P; I2 I
mode was entered。, U1 s1 w- r6 c2 [/ T
# b& h6 b! b" p
翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。
9 I  J* @0 `2 f( f1 o/ x6 t
3 P) U, J- Z3 `; i8 E, uIOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。
% S! y$ d. y* s  i- r) TPLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍
) L" d  f) t8 z) T& RPLL DIVLL分频位。plldiv=1,输入频率分频2
! R2 c% f; A; M  C9 u, l我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。" L: b7 n8 p/ Q9 o( [) e
SDRMA的EMIF设置:
! U/ M! h1 S0 ^EMIF_Config结构体在csl_emifA.h中定义3 S, Z; z, s5 ?9 h: b- N& q9 }

: ?$ p9 D) ?8 T8 l/ \
3 J$ O- A& {' @) S3 l2 t结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
* @' J( `) b! z9 ~" J5 l* a0 g: }: n  S' [2 s" t
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。4 o! m  A2 l; d3 ?  ~

9 C! M. _4 J  |: x% O5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,+ U4 s+ u* V4 t, q& t/ L- c6 H1 [
+ `' Y/ X7 m; n/ Y) Q
EMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于
3 r4 Z: d5 ^& L: b8 b2 F$ @
' R8 T  I% H0 a  e& q6 e3 }5 Icpu的时钟频率(120mhz),/ u' c( d" P( |3 J7 p$ D- {

* {/ T9 a% S. m  f, q但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,2 n, m2 H- F& n
# ~8 U! |. G/ g/ U  `  m: n/ _
但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。' q1 A5 @- H; Z' D, a

) Z9 e) P2 a7 Q  g+ U) C' XEMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
$ L" [* f: f' R, e, e$ L
" b  k# m7 A& R) KCE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map 6 Y6 L) v8 ~; j" A2 O, B$ e
被分成4个CE空间,
: W! p. |, F+ D6 v每个CE空间都3个CE控制寄存器,; E& E+ {8 K' a5 e0 T1 @
分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。
7 y- }5 s  e; H7 U( b) L3 v; K. s7 {我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,( |$ }/ `  ~7 A, @# f, s* M" r, }! f
只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。( y* r& n! u6 X) f. V# ~  y" g
& `- M$ F+ D$ o, |
1 A# r9 [# Y3 P: z
SDRAM寄存器配置:( p, W! M1 S* d- Y0 u) n3 I
SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,+ Y& R. l, x* b: v; M2 L
这要结合SDRAM的厂家提供的时序资料来配置。
6 t7 f0 G! r0 h% U+ p% D( M2 s% Q9 W7 L6 C7 `/ w
+ E) _9 b  `& x( |* D5 S
这里就举一个例子,其他的类似。
; W' W/ F) \6 [SDC1=0x2911,TRP[3:0]=0010,
$ ]2 _6 Y2 i3 |. b TRP = (tRP/CLKMEM) − 1:
1 R7 \6 P$ M4 A  ~4 ~0 K查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。. S: d4 D! J) W, Y* v

# ]5 N  A1 Y" m+ |  d9 z
0 |3 ]2 ^: {: j+ `3 X) X, GMain函数分析
2 e2 \; H5 p% B- {7 }2 w0 xCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
, R- P$ x0 u( v& ^0 J) m CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。& X! L2 v3 l' W' Q$ _
ox0a01就是将EMIF配置成全emif模式。
1 \' M" m3 D6 P/ o" c# U souraddr =  (int *)0x40000;是SDRAM起始地址% B7 v% [" U6 S; l8 j1 g3 w" O/ H
deminaddr = (int *)0x41000;结束地址8 J1 F6 F8 N6 X. m$ e0 W
接下来的程序就是写,读数据了。
7 G  K: d5 Y2 l& u) l& a+ ~; L3 r) H0 v3 b7 l+ r) L' U
7 Q+ z! }& C! g: f) ~: [

该用户从未签到

2#
发表于 2021-11-26 15:06 | 只看该作者
使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次

该用户从未签到

3#
发表于 2021-11-26 15:55 | 只看该作者
ox0a01就是将EMIF配置成全emif模式

该用户从未签到

4#
发表于 2021-11-26 15:55 | 只看该作者
在进入空闲模式之前PLL lock使用相同的方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 03:27 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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