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

SDRAM操作代码分析

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 grand 于 2021-11-26 15:54 编辑
+ Q' m5 o! `# F# D% U5 p* l: [$ e9 i% j; _* [4 K% n/ |3 i3 N: W
不多说先放代码:
7 i; {' \  }! k( T" x1 ]" k% B
4 R& J; c6 Y8 s( t" H. h) x  N0 _
/ w% R0 @, r& J3 P% P' A<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>! f2 {% G5 K4 g" D" p
#include <csl_pll.h>
. o" I# ]1 `. e9 E1 b#include <csl_emif.h>
* ^% u  u8 c4 ?% t. k#include <csl_chip.h>
& i8 U& H! [+ w6 B9 H( \#include <stdio.h>7 M, m" L* i0 D4 J7 C

/ p, q  q$ ^2 d  kUint16 x;! m5 c8 J9 ?( q9 s, h3 s1 G" r- L1 w& ^: i
Uint32 y;9 Q/ G$ E$ [" B
CSLBool b;! m9 D4 L$ Q$ o% I
unsigned int datacount = 0;8 t# ]$ v: y( e! R/ W; v
int databuffer[1000] ={0};2 N: U4 W' [1 b
int *souraddr,*deminaddr;) }+ J6 a0 j2 f2 @6 b5 g
/*锁相环的设置*/
8 i3 G( ^# ^4 y* b. ^$ ]2 y5 X# ^PLL_Config  myConfig      = {, n- @# t& t( f- C5 ~. Y" h
  0,    //IAI: the PLL locks using the same process that was underway # e) ^  u+ {% y! Z% `0 h9 x5 L  y
                //before the idle mode was entered
/ _( E9 u- S2 }% z2 {  1,    //IOB: If the PLL indicates a break in the phase lock, 3 V7 Y5 ?# c; i, o6 H5 a
                //it switches to its bypass mode and restarts the PLL phase-locking
  a+ I7 w* U2 z; H, K' i. o. O4 E9 p- n                //sequence
( ^- P' {7 M1 |/ T5 A* W2 J  20,    //PLL multiply value; multiply 20 times
4 b/ X( K' Q+ K; v; c( ~  1             //Divide by 2 PLL divide value; it can be either PLL divide value
$ f% s- I! c  C% M& i- }                //(when PLL is enabled), or Bypass-mode divide value
4 o6 F/ f5 A# D8 E0 c5 |6 e                //(PLL in bypass mode, if PLL multiply value is set to 1)
, m2 A7 ~* n. H, f};- s# }% O2 e, v- A
/*SDRAM的EMIF设置*/
+ W* a" j, Y6 l" U- O) l  k) PEMIF_Config emiffig = {
; e( b5 |; m1 H& K! \! w  0x0021,     //EGCR  : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
% A2 F+ w. R* Y/ l6 E. D1 `* F              //          the WPE = 0 ,forbiden the writing posting when we debug the EMIF6 w5 g7 `6 c4 O7 Z
              //        the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin) u7 m9 c, O6 l; G# @, Y
              //        the NOHOLD = 1,HOLD requests are not recognized by the EMIF
/ B1 h) v7 z( E; }) l! K# I  0xFFFF,    //EMI_RST: any write to this register resets the EMIF state machine- d1 z! }( x, |
  0x3FFF,    //CE0_1:  CE0 space control register 1
+ a9 j" q: C  d" X) r8 z$ v              //        MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width; }+ h5 w5 _/ S( I- @0 X
  0xFFFF,   //CE0_2:  CE0 space control register 2
3 W- ~( O) i8 B  0x00FF,   //CE0_3:  CE0 space control register 3* I1 U$ E  N. b( J" d6 i( y
              //        TIMEOUT = 0xFF;
, D' L, g; C) |# S* S& M  0x7FFF,    //CE1_1:  CE0 space control register 1/ J- J/ E# X( a, v
  0xFFFF,    //CE1_2:  CE0 space control register 2
- {) T, A* I+ ~0 M+ p% u- H  0x00FF,    //CE1_3:  CE0 space control register 3
, {8 V% k& U' q, ?  @: `$ H  4 }% e+ w; B+ O/ k% v* `7 ^7 f
  0x7FFF,    //CE2_1:  CE0 space control register 18 c- n0 o4 G( c8 w5 X
  0xFFFF,    //CE2_2:  CE0 space control register 28 X, ]- f  k# s1 T2 t5 b- l8 J" Y
  0x00FF,    //CE2_3:  CE0 space control register 32 t4 |: @$ \' ?# k
  
3 C+ J, b6 O6 }. G! b  0x7FFF,    //CE3_1:  CE0 space control register 1% V4 Y8 d9 U8 M" a+ R! B
  0xFFFF,    //CE3_2:  CE0 space control register 2$ S6 X! @- E6 m( G$ M; D
  0x00FF,    //CE3_3:  CE0 space control register 3- N" x5 g8 ~4 R
  4 Y. f7 o0 _1 I
  0x2922,   //SDC1:   SDRAM control register 1+ E8 L( E: z$ M: v  J
              //          TRC = 8     
! f! l" @0 y' h4 g              //        SDSIZE = 0;SDWID = 0' v( f6 T) E1 C8 J( }  H) Y; G/ h
              //        RFEN = 1
- \4 l0 Q. i$ n' @              //        TRCD = 2& m+ O' a( X% T0 y% U7 J, O
              //        TRP  = 28 O# J( Y3 w: R1 t" h
  0x0410,    //SDPER : SDRAM period register' p; a. ]' d5 [2 R* e. Q+ ~; v
              //          7ns *4096
) t1 O. @( C( J3 G  0x07FF,    //SDINIT: SDRAM initialization register4 V* ]: j; p1 S5 w* ~1 y
              //        any write to this register to init the all CE spaces,- W" ]" A0 X1 m1 Q7 b/ _
              //        do it after hardware reset or power up the C55x device
  d& R( m4 p9 u: e) @! P/ u: B  0x0131    //SDC2:      SDRAM control register 2
% `7 T, {2 m) z8 t8 x7 ~6 X5 C              //        SDACC = 0;
. g9 A  d6 j& F" K- K+ E              //        TMRD = 01;& \0 r) z, }4 x1 ]
              //        TRAS = 0101;# r) k( n! A6 j- ?( q1 J$ t8 ^
              //        TACTV2ACTV = 0001;                                
0 }- n6 {) x( B; d2 h6 E  };0 g7 c' v6 {- S3 U% g- R* m

) y' Z" t/ o8 |% x9 A ; k, u, Q. H( ^; c1 I* n
main()' A) o" ]8 A9 \% J4 ?; C' q
{
  J. l5 D& ]( \5 ^) [    unsigned int error=0;
* A0 G" }# v9 U0 {    /*初始化CSL库*/   
! d. `# o4 P" C: p0 w0 @2 w# X    CSL_init();7 m- r0 q+ ]4 r- J
   
5 N+ F+ C. Y; o) l6 R. q. O( f* _    /*EMIF为全EMIF接口*/
' J1 J7 S- J, y6 E, K. l$ _& J    CHIP_RSET(XBSR,0x0a01);8 g& a: ^0 u! ~* F* N
   
% `( a1 ?& N$ |- h; I5 X/ W    /*设置系统的运行速度为120MHz*/
1 c/ b3 @% `; h; v% V" L1 s" }    PLL_config(&myConfig);
: m+ D* K& N, C. z& O+ P    7 Z  o, k5 o6 b6 E/ I) @( V2 Z" \
    /*初始化DSP的外部SDRAM*/, q" h9 w0 {3 `4 @& `6 |
    EMIF_config(&emiffig);
+ e+ U) `1 R) I2 V7 @    /*向SDRAM中写入数据*/
+ o9 k* e/ L. t! `1 {: q& w5 Q
6 }  r- G- T* J    souraddr =  (int *)0x40000;
* H- |+ I% Y4 U3 T$ W7 Q9 T5 u    deminaddr = (int *)0x41000;4 {5 ?7 P" Y# [4 X% Z. E9 d4 }
    while(souraddr<deminaddr)
8 f3 @( s; N' O4 J2 x, h* R    {
: D* V0 S# _6 k+ v6 g- {        *souraddr++ = datacount;    2 `9 r* g: J9 ^. C9 G
        datacount++    ;
) H. A+ c' {& |* v2 U    }" m8 \0 Y. o' p2 F- p5 q! k
    /*读出SDRAM中的数据*/0 y0 C; d( G8 e1 ]( w& t: F
    souraddr =  (int *)0x40000;
/ u# w+ ~! i) ]7 `( ]    datacount = 0;
; A# h% R. @4 n: K! W$ d    while(souraddr<deminaddr)+ b' v" V' D+ \
    {
* z0 n9 }0 O: X& c7 m1 y! V5 \' h        databuffer[datacount++] = *souraddr++;
, W6 q" S+ F1 d! K. l/ N' [        if(databuffer[datacount-1]!=(datacount-1))/ x/ |! F& v& E) Y
            error++;- s8 q7 M3 O/ k  f
    }6 ]1 H/ C& g$ }* e  i
) e: l; X+ E" y1 O9 k7 P: e
    while(1);
" X$ G; U5 w8 K; e}2 K6 c3 `3 d( p/ L% v5 v3 `, \8 H
/*************************</span></span>4 N! p- Q7 `- n+ r- T
下面分部分分析:2 l) {4 g( Y8 Z1 r: u. x
锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的1 W1 [. N8 y. u$ Y; O# a

. [4 g" G4 c& T& l# j& \4 V& J7 E6 W2 C8 p/ n) F7 M
PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,
! s8 u2 F7 q; }2 N& h8 K
& G+ \! t# y, ^! J& o在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。3 R* {6 N: Q9 e3 i

8 s! F) k6 A6 R( |$ F8 _IAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle 5 O& j3 ^- j2 m; \- }/ ~
& e' z. G  _- [" c4 ^8 r
mode was entered。
( D" I2 I* b( B
. p8 a9 C- N& K  O4 R2 w& k' F8 m3 R翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。
3 j7 _5 W* M+ D/ m5 |  n4 Q5 V
1 R% L. m) ?# l* o: Y" k+ zIOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。
4 d3 W% d6 s' G* A( P9 S4 @PLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍
& k  g# v" ?" V+ hPLL DIVLL分频位。plldiv=1,输入频率分频2
7 l# _+ u$ Y+ g2 s4 h, \! D: ~我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。- H& W. J7 h# X  G' e# L0 k" ]
SDRMA的EMIF设置:8 S- @& R; o+ S5 S
EMIF_Config结构体在csl_emifA.h中定义
" ^6 A5 `( l& `7 e5 n$ F
) N- h; i0 o3 {' D: \2 i , N5 k- q6 t% g7 P; Q% Y- M
结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,) F  i+ J0 p, ^* R* _, S
% ?8 h, N/ s; p$ [+ ~
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。+ X) S  N2 `  C* f

$ g- `) @( i, `8 @. ]" f! w8 L5 G! e5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,* b6 Q" k; f+ X& Y9 o1 G# F. Z* Q. T

! c2 S3 h) ~# B, y9 d  n' yEMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于# q8 L! m6 g1 \4 S) k% H& ~2 i6 v
# R* R) B  ]6 r+ p9 i
cpu的时钟频率(120mhz),7 d3 c, D, e1 `$ B9 J# S% y5 W
1 n/ v) ?0 h" e& {& l6 Z- j9 g
但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,
% f4 e5 R9 ]! @3 Q* U, v5 G# X# K7 l0 l* g, W
但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。
1 `4 v# @5 U" p$ P7 F1 m4 f. _5 R+ C4 |1 y" U1 H0 G
EMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
$ `# H1 i' i9 h9 F" I% k6 t- u9 z( [) X0 J8 W, E
CE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map + s/ P! N# D% |  ~  D8 O2 z
被分成4个CE空间,
' d& c. L. p( F  ~; ]! ]每个CE空间都3个CE控制寄存器,
5 ?, U5 \3 B6 H" [分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。0 d+ f+ X1 n' t. t' o( [
我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,
% U% o& x* n/ b9 H( Y只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。; `/ j9 T1 b$ A! v
) \  V1 Y9 q. G- Y  @5 S! F
1 @# @0 |; q+ U- `( C' z. w  R
SDRAM寄存器配置:+ p- f- A' C+ D3 ]
SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,
  X9 m0 g: _- H, Y& a& n这要结合SDRAM的厂家提供的时序资料来配置。
# U, W" Q5 d% t3 I- {, T* u4 z# f6 }
9 ^  j, K( }( c7 ^( t1 H4 _6 Z
这里就举一个例子,其他的类似。
! a+ [: A& S2 zSDC1=0x2911,TRP[3:0]=0010,
) o! E" c3 {3 a: L+ z- d TRP = (tRP/CLKMEM) − 1:3 p0 y2 V$ Q) h' Z
查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。
! @. h+ W0 d& B* D3 u& m8 ?! ~2 \2 t- H. a3 j: {& n- ~

, p( v4 X. A; @4 n. O9 fMain函数分析
1 @, d' x# V1 J6 ?3 eCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
8 k/ s) Y( f; s8 F CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。
+ }( P5 D1 C& C+ Q( eox0a01就是将EMIF配置成全emif模式。
; R! {; O' \2 X+ Q souraddr =  (int *)0x40000;是SDRAM起始地址
5 s% v3 M' G) Z deminaddr = (int *)0x41000;结束地址" T5 _5 c* ^. N0 v- @
接下来的程序就是写,读数据了。2 g5 F- Z) A2 E7 F, K7 Z2 u' S
1 V' _: t  e6 n$ k- m% f3 X5 s. n6 t

9 W- P) H- p* }% l/ a! m

该用户从未签到

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 11:33 , Processed in 0.171875 second(s), 24 queries , Gzip On.

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

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

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