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

SDRAM操作代码分析

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 grand 于 2021-11-26 15:54 编辑
, ?9 X& H6 h  ?" s/ O1 q9 p
1 f( B6 w$ e; F% ]7 B不多说先放代码:: n5 S2 |! H5 l( e' M+ l- X# a
( C8 z5 X' `! k2 m: z, }9 C) g
1 ^1 F1 W% q% T7 v  P- j9 J: Q
<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>
9 @& O( a) Z7 s1 b- ^* Q( Q$ I#include <csl_pll.h>
) ]4 z4 f5 o2 ^# s# n& N#include <csl_emif.h>
* e1 U' K% g7 G* a+ `#include <csl_chip.h>
. v3 s, d6 R3 {9 Z+ \# d6 V#include <stdio.h>
& ^& A; Y' o) D, p' ^
, }( T& ^( c' I  I$ v" FUint16 x;0 D. i0 P5 o% y+ ]
Uint32 y;
, B+ `) e5 m3 r4 r# }CSLBool b;# Y+ E) w0 ?! \( h
unsigned int datacount = 0;  r: U  Z" M. P% Y& W. p/ A
int databuffer[1000] ={0};. F+ m+ |2 P9 c/ E: s; ^4 _
int *souraddr,*deminaddr;
: f  l, G$ g$ e, N/ p+ n/*锁相环的设置*/
" `# r& `4 }7 Y& X, e( l% oPLL_Config  myConfig      = {$ N; M  S9 `+ P/ U* h" g
  0,    //IAI: the PLL locks using the same process that was underway
" p/ ~9 e, w( }6 J3 k* n                //before the idle mode was entered
/ j8 }7 A5 W: G1 F  1,    //IOB: If the PLL indicates a break in the phase lock, & L$ A. i! Q$ \- L7 N
                //it switches to its bypass mode and restarts the PLL phase-locking
& a* b8 x" c/ @& x& }, I% J0 K                //sequence
3 K  z0 f/ ]0 `7 z4 }4 ]1 t2 F  20,    //PLL multiply value; multiply 20 times5 O0 O. z% \* \' p0 u
  1             //Divide by 2 PLL divide value; it can be either PLL divide value ' N5 A! \# H5 i# j0 G9 K4 t
                //(when PLL is enabled), or Bypass-mode divide value% t6 w( |- d6 q6 b0 }1 n
                //(PLL in bypass mode, if PLL multiply value is set to 1); C$ G6 G2 u+ }  |
};
6 h, ?/ p+ r! _. `6 Q/*SDRAM的EMIF设置*/$ i# g* x- c: ]
EMIF_Config emiffig = {
$ I' r0 w1 u' x* u  0x0021,     //EGCR  : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
9 @) m$ n" d6 P' Y5 z, i: [: i              //          the WPE = 0 ,forbiden the writing posting when we debug the EMIF
2 \% S* X( s' N8 e) {/ O1 ]/ b: p% j$ u  t              //        the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin. P' |" E7 @  @
              //        the NOHOLD = 1,HOLD requests are not recognized by the EMIF
, G/ B7 a6 Y! _# m7 g  0xFFFF,    //EMI_RST: any write to this register resets the EMIF state machine4 g6 H6 U% I6 O& F/ w6 r
  0x3FFF,    //CE0_1:  CE0 space control register 1
. q( |" n/ }9 V) n              //        MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width8 u" \( y4 e/ @
  0xFFFF,   //CE0_2:  CE0 space control register 23 v& D. B/ ^- G& F: w( P
  0x00FF,   //CE0_3:  CE0 space control register 3
' o1 H2 g7 ^9 u/ I/ Y# S9 K              //        TIMEOUT = 0xFF;
, O! j# p% x) [( ?  |  0x7FFF,    //CE1_1:  CE0 space control register 1! e5 n. I; n+ w; N8 w
  0xFFFF,    //CE1_2:  CE0 space control register 2
0 }! m. h7 ?6 D& z5 W8 @  0x00FF,    //CE1_3:  CE0 space control register 34 R' E! Y" }$ {5 `9 Z
  
; m  i  B+ I2 F  c6 f. E7 q# P  0x7FFF,    //CE2_1:  CE0 space control register 1
' y0 u2 `/ P( B& V1 w/ m5 Q! Y. v  0xFFFF,    //CE2_2:  CE0 space control register 2
0 d7 m8 Y! W( v. v" t! [  0x00FF,    //CE2_3:  CE0 space control register 3
# X5 I, n0 j; D( C  
: ]0 }9 H# _2 x  0x7FFF,    //CE3_1:  CE0 space control register 1
, {; @4 n( D- J" i' N4 ~# k9 K  0xFFFF,    //CE3_2:  CE0 space control register 2# e/ u% J# Z% w  V8 t+ v
  0x00FF,    //CE3_3:  CE0 space control register 3
& I( T( P( Q$ S4 V  
$ }  S( Z+ G7 @) v: P" Z  0x2922,   //SDC1:   SDRAM control register 1& @) v  S- w) U( Z
              //          TRC = 8     
& l! C( k" U( w4 b; g' j4 l" s( J              //        SDSIZE = 0;SDWID = 0% }! u! G% O: {
              //        RFEN = 1
0 \9 L' p0 [0 G              //        TRCD = 2
& x+ k3 y( J3 V2 ]" x: ?              //        TRP  = 2
9 M' s- P2 [$ g% W, T. S  0x0410,    //SDPER : SDRAM period register' E/ b, y" W+ B
              //          7ns *4096( `% N% L3 k- m2 e# F3 k2 a. T
  0x07FF,    //SDINIT: SDRAM initialization register
6 X3 T" l# u* m5 s* h: c+ [2 }              //        any write to this register to init the all CE spaces,& v( J0 U% E  i
              //        do it after hardware reset or power up the C55x device( f$ L/ U* m3 j# X
  0x0131    //SDC2:      SDRAM control register 2
) k3 _8 W) p4 |" p( i: a              //        SDACC = 0;
& k$ t; q- q# q( {5 x$ N              //        TMRD = 01;! B) i* Z0 Z- r
              //        TRAS = 0101;
" B% s4 D( V0 [/ ~7 W: y              //        TACTV2ACTV = 0001;                                
2 Z3 `  d+ H, u" N, s  };+ I# H7 z- t; J5 {& F  I
. n# i% ^; }. }6 _4 }2 B! R
' M& v( ]* \4 b8 @/ p# u& g
main()
) i5 }2 R0 k. J/ B: I7 a{2 O$ ]0 s$ Q9 f
    unsigned int error=0;8 {6 e' P" A0 H: q( T$ C
    /*初始化CSL库*/   
) ^) F7 X7 z3 W) M! O* r    CSL_init();8 D6 q! e6 ^+ X" o9 C2 w1 S
    6 C0 O% C0 a/ O- W, J
    /*EMIF为全EMIF接口*/
* M# W' C! b" c    CHIP_RSET(XBSR,0x0a01);! q0 a- S& a* X6 R' t! R+ m# R
   
9 i! a2 {3 E" F( p% i    /*设置系统的运行速度为120MHz*/) B; X+ ?8 m3 C" i- [
    PLL_config(&myConfig);
( x" {9 F3 |9 _; k    $ f& L8 Z! k. I  w1 ]3 J0 q
    /*初始化DSP的外部SDRAM*/' W, c& |! w5 h) J
    EMIF_config(&emiffig);
% R" Z' D- Y) y* ~    /*向SDRAM中写入数据*/0 Q  ?- i1 z6 ]( h$ o6 {6 ?

( C4 R* L5 |% N/ i7 }) m    souraddr =  (int *)0x40000;
1 t/ M0 B4 l. {( p; i8 `8 A* C    deminaddr = (int *)0x41000;6 E8 s+ Z' O  @' {0 J% p
    while(souraddr<deminaddr)
5 Z+ K2 o% G+ m3 ]1 Z    {% M/ R! F) b0 @5 Z2 I  v
        *souraddr++ = datacount;   
' a2 `1 E9 m  ]' s2 a3 V( E        datacount++    ;, @4 \! v1 t& t4 m9 z! v7 a, w7 z
    }
" d; S( F2 @$ e6 \+ b0 M( O    /*读出SDRAM中的数据*// a/ J2 K3 D% C. z1 d7 u2 I$ t# m: ~
    souraddr =  (int *)0x40000;+ |* J$ K8 s4 A: A; ]: ]  D, F
    datacount = 0;
2 v8 E$ z) H" v7 G8 j5 n    while(souraddr<deminaddr)
2 x4 S+ v5 ]+ d; S! u2 e    {; D7 i% V7 A. [2 F
        databuffer[datacount++] = *souraddr++;
' l# U, R. ]. i        if(databuffer[datacount-1]!=(datacount-1))6 M. n* g5 |1 i1 _- y
            error++;! G1 N5 R- Y5 y6 K
    }3 |' i7 H+ m; s% T+ A
6 F7 l9 G  f' @2 A5 Y
    while(1);8 T5 U$ ?7 U+ K
}
0 S7 T# K" ~7 N/*************************</span></span>
% h  t, X9 B( C& F& m5 L下面分部分分析:! H+ U2 m4 V  a& {) _
锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的
. Y& M$ x* g3 e0 l. M  @( b7 G; W) i# |8 D: b9 K) l
4 ^# b- K% v3 g! k* r) l5 g* U0 E
PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,
0 t* m. ^' o0 |* R! |% K% q
8 k. g" T+ ?: E: m; x. T在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。/ f6 a& B- z' b1 U3 o. T

# G( U/ h( \/ O+ ~+ I4 ?& h, j5 Y1 bIAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle 3 `+ x3 [/ U, B, l7 `

- r7 ]5 A7 b1 s( o- Dmode was entered。
4 \2 c; \" ~! A7 V7 r0 c, B/ w1 @+ B/ j
翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。
2 p1 }$ ]8 R9 S; q, ^1 ~$ T# Y- o3 G
IOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。
0 Z/ j5 e9 I* h7 s! r4 aPLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍
; f9 ]  \6 o/ f7 V* [' T* [0 Q( b( IPLL DIVLL分频位。plldiv=1,输入频率分频23 I( B* c4 f% V
我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。
" t& Z5 u* }6 H$ e6 {SDRMA的EMIF设置:
  g3 }$ [' h+ m8 w$ T. T: a! jEMIF_Config结构体在csl_emifA.h中定义
. \4 a: T+ V. X+ O  w: V/ ^5 w7 N, v3 \, G- N& ]- e/ F* [
2 e( ?  K2 V& n4 T( ?  i- O
结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,0 b8 m7 _, C5 Y7 }9 O* H
; X9 ^6 v4 Z. g0 \/ a
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。
" H; ?' @4 N! H' K2 t7 O+ }' d' _6 z
5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,) t7 ]+ y7 X3 `0 j( o
3 f# V# l: w3 Z7 z
EMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于: J; S- q7 E# M

6 d/ x9 H' N& ~5 z. Hcpu的时钟频率(120mhz),
+ x( k/ ^# d. _8 Q' l
7 V6 |5 u6 g' e( h" G7 |5 K8 b! \+ C但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,) E7 _$ ^& E$ z
, Q! e! n' b- r
但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。
9 a8 O" _  N4 x: I$ c2 g! ~! p$ h1 O3 j! Q9 \8 O) s
EMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
8 _/ x8 K9 Y# U5 m* w% Z) u
: R' T+ ~1 F. L  b0 @1 U/ NCE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map
5 f6 J9 C3 d: S. p2 V被分成4个CE空间,
5 m6 A( ?8 j8 W每个CE空间都3个CE控制寄存器,
( `2 a8 B" P3 g; q# {分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。4 o( d% [5 F3 w3 _9 t6 _
我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,
$ q& T! I, O6 C只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。5 L8 z! J  K: _3 N  B* ~
7 n( ]3 e* D- b9 g; ^( [
( X5 I/ G1 q  g, O
SDRAM寄存器配置:- Z7 e) q8 |" q6 G4 n
SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,  `% O* ?; l( X$ W
这要结合SDRAM的厂家提供的时序资料来配置。& s- x- A" n4 S3 P; `) i
% Z! C" ~% K! a; _  K2 M. ^6 x1 W
0 F2 [# k7 y# Q0 F8 {8 c4 A
这里就举一个例子,其他的类似。8 n- ?5 f. p* Q. `5 w, T& j
SDC1=0x2911,TRP[3:0]=0010,
( \  n! e% {% k) J TRP = (tRP/CLKMEM) − 1:( [; h% o: C6 D( m& w% f3 T4 X
查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。" f/ `1 R4 F" p

: ]% ^. E! e( M! r& o3 j
5 o& D* _% q6 b* e" ~2 W$ X0 W5 cMain函数分析
& U" x1 F1 I% _: fCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
; d0 ~' j  X% S1 w$ ?# v CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。& u! V2 }0 @) h) h" U9 |/ m* D0 O
ox0a01就是将EMIF配置成全emif模式。
. o! b5 D  `# b) ~1 i souraddr =  (int *)0x40000;是SDRAM起始地址
- C% ~; z  E/ x* F" @' r3 F9 X4 ? deminaddr = (int *)0x41000;结束地址! i) {; |8 v9 O- {  D4 p
接下来的程序就是写,读数据了。
( r* b" H& z* b: d  c) {
( Y6 }* _4 m; \. l/ {* |/ }2 |0 k" S$ }; G

该用户从未签到

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

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

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

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