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

SDRAM操作代码分析

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 grand 于 2021-11-26 15:54 编辑   y0 j% K1 T2 n) Y5 @, l# e5 j( E

) F8 D  T6 G7 D不多说先放代码:
* h3 k8 w% N2 i) @* s- M! [0 l. Q5 _; O0 E: C7 u3 j3 W" ?- o  _

8 j4 N3 F, M6 ?! A<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>
% x4 V0 o# X% v2 _5 z. R7 l#include <csl_pll.h>
4 e$ i+ @+ J. i5 Y) g6 F  V#include <csl_emif.h>% t& K5 {, l# j$ y7 z$ K) Y
#include <csl_chip.h>7 \! [( t3 E* E( R
#include <stdio.h>$ @2 ]0 I6 v% x" r8 Z

5 d% C$ G7 ]; s* ?+ h% nUint16 x;
5 q% A- @1 d' t% w! i7 xUint32 y;9 C! V. z% G: w; h: f
CSLBool b;
# p8 r! @7 [: q# o1 @unsigned int datacount = 0;
0 ^) y, ?7 C/ l1 T1 Gint databuffer[1000] ={0};
+ x9 N7 U8 M/ x/ o' D0 `int *souraddr,*deminaddr;
! M* ]* D8 W! E* T$ g1 j/*锁相环的设置*/
8 P. u1 Y2 y3 Z6 t  _PLL_Config  myConfig      = {$ b% J, h8 ^, H4 c% {' ?
  0,    //IAI: the PLL locks using the same process that was underway 8 f: @- i3 L8 k, @6 j7 ^
                //before the idle mode was entered* j, ]* O: K" s: S3 y% R
  1,    //IOB: If the PLL indicates a break in the phase lock, ' P' ^2 @( g1 ~( O
                //it switches to its bypass mode and restarts the PLL phase-locking ( i, @) ]5 W6 {4 v+ x6 L7 E$ i: b
                //sequence
  q0 V" y! d5 X1 p) n, B7 b6 L  20,    //PLL multiply value; multiply 20 times
% U+ \( C- A7 \  x4 h1 }  |  1             //Divide by 2 PLL divide value; it can be either PLL divide value + W6 u- p7 M( F, x* p
                //(when PLL is enabled), or Bypass-mode divide value6 J+ B* u% T: X# l, A1 k$ o9 _
                //(PLL in bypass mode, if PLL multiply value is set to 1)' k' s% o2 R" u
};
# ^# o6 r" C' J4 Q/*SDRAM的EMIF设置*/) P" ]  Q, x) o4 W
EMIF_Config emiffig = {- F' b3 I) ]  Y) @: V( s
  0x0021,     //EGCR  : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence' W+ @, S! l) z' X& B4 a- h
              //          the WPE = 0 ,forbiden the writing posting when we debug the EMIF7 v) ~# W( b5 u  N
              //        the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin; d) o& Z6 a# X7 ?
              //        the NOHOLD = 1,HOLD requests are not recognized by the EMIF ' k2 u  A( \' G' [7 Y
  0xFFFF,    //EMI_RST: any write to this register resets the EMIF state machine
3 \/ t3 W, v+ L3 t" j. Y, P  0x3FFF,    //CE0_1:  CE0 space control register 1: ]* A& w* i9 i! s* n1 K9 k
              //        MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width* ]1 H8 F, u& u
  0xFFFF,   //CE0_2:  CE0 space control register 2* |) q& f$ w/ I0 X
  0x00FF,   //CE0_3:  CE0 space control register 3
/ a$ D, B! l4 X1 J1 k              //        TIMEOUT = 0xFF;& p" F( A2 J3 b; M2 p# ?1 a( I6 x
  0x7FFF,    //CE1_1:  CE0 space control register 1
, p' i9 |  J4 a1 @# y: R- w  0xFFFF,    //CE1_2:  CE0 space control register 24 u1 E9 A9 H7 K: H
  0x00FF,    //CE1_3:  CE0 space control register 3
! ~' h; Q1 C# E; A9 c4 |5 _8 b  
9 C, G: J' ]: [$ N  G1 {3 U2 e( q5 L  0x7FFF,    //CE2_1:  CE0 space control register 12 ]1 O$ r9 H: l# w
  0xFFFF,    //CE2_2:  CE0 space control register 2/ V( w1 Y( K; n8 C+ K/ e
  0x00FF,    //CE2_3:  CE0 space control register 3
9 K6 @1 b" p, B' Z  d! }: ]  
7 v6 F' P, I3 k/ b+ i3 o$ W9 L  0x7FFF,    //CE3_1:  CE0 space control register 1; [( t' h9 J9 j5 O# I' P' f) W
  0xFFFF,    //CE3_2:  CE0 space control register 2- ?- L0 m* I; g
  0x00FF,    //CE3_3:  CE0 space control register 3) N0 K9 k: i$ q- n
  + E) {  Q7 n; x* h7 |: B
  0x2922,   //SDC1:   SDRAM control register 1
8 M4 Y+ v- L) m9 |              //          TRC = 8     - f* s' Q* O( e# R6 _  t9 }; z$ Q7 x3 v
              //        SDSIZE = 0;SDWID = 0) i( E# M  _4 T; `; U7 l
              //        RFEN = 16 \. r4 h9 Y, s7 R, r
              //        TRCD = 2% n7 m9 a) {- a2 x; K/ i4 j
              //        TRP  = 2
( R) N1 t4 j3 \- v) N+ x  0x0410,    //SDPER : SDRAM period register: ?! k3 e: w8 E
              //          7ns *4096
* r2 @4 f) P2 T, |; E/ [  0x07FF,    //SDINIT: SDRAM initialization register1 N  L% ~! Z: X$ I& o  M9 f, n
              //        any write to this register to init the all CE spaces,: ^1 @* q9 D& c$ Y. O* w* t
              //        do it after hardware reset or power up the C55x device  Q. b8 t. l( K% h$ X
  0x0131    //SDC2:      SDRAM control register 2" s9 h- Y7 ^# u) s! F% I9 s
              //        SDACC = 0;. L# s+ u7 z  `- ]" v1 i' @% M# I
              //        TMRD = 01;9 w0 |$ y1 Y% T6 Z5 g
              //        TRAS = 0101;' m; E. G$ O# O7 v9 |+ V
              //        TACTV2ACTV = 0001;                                : K+ y) N% b+ A5 J6 _3 e0 T
  };
" k  h- f6 P8 F/ l/ p6 e
8 D! @1 c: q6 X9 m
. u( \" O/ M6 C3 |) wmain()  I) l- \( I# A: c( Y1 O
{
  [  J9 P# ]8 o( ^' d    unsigned int error=0;" R, {& }" ?( Q% h
    /*初始化CSL库*/    3 X1 m% x, }9 B" \) o8 n( g: b# p
    CSL_init();" ~4 \* b+ [8 R( D8 G+ M$ i0 j2 k5 Z
   
: d* V% Y5 }# A: F$ i1 J. K    /*EMIF为全EMIF接口*/* p  e6 _6 Z" J7 f/ G
    CHIP_RSET(XBSR,0x0a01);$ d- y# }2 l1 b, V+ T5 L
    * [! P/ B; e# Q% p! Z' y6 w
    /*设置系统的运行速度为120MHz*/' c4 `1 W1 [3 k2 E
    PLL_config(&myConfig);+ l/ Z: I# N8 x# H
   
8 {8 T9 t5 f0 u. @7 G. U    /*初始化DSP的外部SDRAM*/: |8 V! z9 `- d8 |
    EMIF_config(&emiffig);# |2 s' B5 T, |4 Y8 {  a) I
    /*向SDRAM中写入数据*/
0 d/ t+ m$ E$ G
0 y  F, |" h' F1 [4 }, _  L7 d3 L1 }7 J    souraddr =  (int *)0x40000;
2 K! h* N& A( t  m    deminaddr = (int *)0x41000;
2 _5 h5 i) J! }6 ]    while(souraddr<deminaddr)* h0 w4 [, `$ c% J3 Q  g! X
    {
, d# T) I" r3 ]. E4 e        *souraddr++ = datacount;   
# J  K( p2 t& ^6 E( p  x        datacount++    ;( I# U. K/ y; h0 w* O6 F/ t$ H
    }, ?+ \: Z0 A: ?& i% e3 ^: I
    /*读出SDRAM中的数据*/( Y- l% Z; e% `. y' |
    souraddr =  (int *)0x40000;
& S, r; x8 [( {( ~" v' O    datacount = 0;
5 N) m. s: C7 O: w) F% S+ T    while(souraddr<deminaddr)
6 h" Y5 ?. |- t% K+ {* _    {6 u5 S6 F$ q; q" X8 ]; G5 [( \
        databuffer[datacount++] = *souraddr++;% q6 `: d3 K! \# w. z
        if(databuffer[datacount-1]!=(datacount-1))
! r, d. m* f- Z1 `( a: v; H            error++;
  q& \* g/ Y1 R. d    }4 Q6 R5 W$ h# @' V* w0 o# R
2 q5 y; E$ g3 Q7 d. ?
    while(1);8 B- u+ z6 `( ?
}  p9 c$ _7 k1 O$ }& U. [  v# v( p
/*************************</span></span>
- U% M* G! S8 r, \  S* L$ U; y下面分部分分析:
* e( ]' r- }/ ?* P, o" G4 a; x" _锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的
* i, _. v+ T1 T" \) L4 G9 p5 R) C  Z9 U
, y7 D! c- ]- ]! U9 d% K
PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,
* E8 L- s) t6 S' |; U
$ O# T' O: x9 Z1 x. N: u9 z在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。& k% z) F  @! e9 L
# u  A5 s& _0 z( d! |" C4 K: F: m2 B/ W
IAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle
0 j( Y8 ?) \: }9 Q) L8 l1 c3 ~
( q6 }9 n. P. Q) A& Lmode was entered。0 H6 L( h. Z) R
( a0 q; v& {; v2 j2 o- v. O, W3 s
翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。  L6 q" w5 Q, G( t4 V
8 K! m, U; w8 e) k; q
IOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。
0 h, }. O7 Z) Y9 S- H5 PPLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍( Q7 B6 r  F( s; O
PLL DIVLL分频位。plldiv=1,输入频率分频2: A. V- H4 @4 Q6 X
我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。7 a8 t- K9 }4 g' f6 d9 o
SDRMA的EMIF设置:6 N4 i5 a  F$ {8 _# w" Y
EMIF_Config结构体在csl_emifA.h中定义6 \$ r! y$ ~4 `) o1 Y; p
, j+ J$ N% ~& R8 C

8 ]3 Q& V$ c" b, k) u, N结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
1 A7 J7 R2 u/ b+ T% S4 x
# B% k$ k, K4 Q" J: M  r! i; B在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。6 m$ a5 C2 Q0 r- z0 g$ a
# a% N/ A# P$ M
5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,
% s( w0 C/ g8 C' X3 P" g- }+ f7 d3 r/ o
EMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于
& n, x' `3 C6 ]7 ?0 |, `2 l+ N; d% E0 b, H/ U
cpu的时钟频率(120mhz),
' E: f% O3 t1 q! q2 R# l
$ w8 z0 O# x" l) l) b5 O4 {& l) @) u但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,1 c# {4 c! V$ Z, m; U
$ r  ^( S+ ]" t0 [; W
但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。
  b% W' \- ]* B3 o$ a$ U4 M- J+ g7 |7 T
" s5 n- s; u+ i+ Q0 ?4 D+ y8 UEMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。1 m3 }1 H3 o' q% j0 t

# O8 P& O6 n8 |. {3 d; |: n& m7 _CE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map ! \+ a. ^# v3 g# Q% R
被分成4个CE空间,' L" s% U. x$ @1 U; X2 Q0 q, S: \
每个CE空间都3个CE控制寄存器,2 U/ Z$ P: Q0 d* |3 ]
分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。9 w: `' I- E5 t: B. |& I
我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,$ u+ f/ D% r8 L" x  q8 B
只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。& ]+ ?  P: {6 p" _! D
+ e1 B: k) D0 O/ n2 B7 D$ J

$ R( d: `% p. w- ?0 fSDRAM寄存器配置:
( L1 K+ g; I! v8 E9 i: ]SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,
6 e- f" g+ l! x0 k4 O$ P9 H这要结合SDRAM的厂家提供的时序资料来配置。
& g+ B' ^: p) s, w9 [; @8 l' W& j" T) D, _
( A2 l& j+ X5 X& Y; Y- k+ @) h& t
这里就举一个例子,其他的类似。
% r, a3 d: z! T# ]% h+ wSDC1=0x2911,TRP[3:0]=0010,6 j. v. R* k5 j3 Y! l8 P
TRP = (tRP/CLKMEM) − 1:: u3 R" [0 r) G
查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。
, G9 A9 F* o$ k/ x0 j8 t4 ]1 [- K$ A, \7 I: V" [: g7 N  w  Y, A

1 I0 m) c  w/ n- e/ E+ CMain函数分析
9 ^: X$ ]$ w, v8 u. h2 @; cCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
0 w, B# F) V# p1 x2 p( o CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。; M" ]4 H: k' T* N1 o/ s
ox0a01就是将EMIF配置成全emif模式。( y- d2 X% ]  L$ p) ?# _
souraddr =  (int *)0x40000;是SDRAM起始地址, c( H. f: v( i  K& q
deminaddr = (int *)0x41000;结束地址
. n  M$ A6 _% V4 J( c: |+ O接下来的程序就是写,读数据了。& A: m" Z8 R& S  i0 `! a0 i

) A4 D$ i4 J* B5 ~2 [2 n" M5 o1 i0 u5 I0 ]' ?

该用户从未签到

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 00:44 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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