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

SDRAM操作代码分析

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 grand 于 2021-11-26 15:54 编辑 6 T! }: I* F: Y  f3 V
! l" ~/ O( K( L' ]% q, C
不多说先放代码:
4 Y% f8 r" q4 p  ^4 \* V; @" O2 ^0 Q% v# R3 ~, |7 Z# P
+ q( D, I% G$ D$ x+ Y
<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>' ^9 y1 h( x( t! b7 A% d" x
#include <csl_pll.h>
, X% m) C8 w! ?& J" g#include <csl_emif.h>
4 w: g! K$ D5 o#include <csl_chip.h>
/ D' E7 y* Q. O; _#include <stdio.h>
. L+ o  @; j' h$ k2 _ 0 z; c1 ]+ S0 N: i( I( z
Uint16 x;$ z. q( F  o9 S. L4 {5 `& r" Q( X! j
Uint32 y;
- M% K2 Q- w2 {; f: TCSLBool b;7 T& y% A1 M8 X0 \+ i$ ~
unsigned int datacount = 0;/ e4 a2 d* E! @% Q5 j4 t
int databuffer[1000] ={0};8 r8 e) ]9 O% v% i: w0 F* H9 w  z
int *souraddr,*deminaddr;
% f' t! P, |, f" u% a/*锁相环的设置*/
7 K8 h+ Y/ o2 k+ C- hPLL_Config  myConfig      = {
1 F+ d8 v$ L) T% L5 f! E; O, C/ X" ~  0,    //IAI: the PLL locks using the same process that was underway
  P& I8 r0 \. ~0 G$ y5 l                //before the idle mode was entered
3 S1 l, c; ~4 ~: }' }9 S  1,    //IOB: If the PLL indicates a break in the phase lock, ' m* {& k/ D* W* g: L% E' R# l
                //it switches to its bypass mode and restarts the PLL phase-locking
+ n) h2 q! b( t8 X                //sequence# j1 @0 d& c3 J5 K2 h* n/ d
  20,    //PLL multiply value; multiply 20 times, K4 U1 [$ U# r8 f; \' k( v$ D
  1             //Divide by 2 PLL divide value; it can be either PLL divide value
! n1 q6 g/ a% D                //(when PLL is enabled), or Bypass-mode divide value9 \; c4 B; d6 \; \& g* ^
                //(PLL in bypass mode, if PLL multiply value is set to 1)
; ^/ K% @: i6 S% {};6 Q( W! w1 \) M7 a+ @- E/ |
/*SDRAM的EMIF设置*/
6 B& E% h- W$ D, }EMIF_Config emiffig = {
% O0 Y# u, j5 w5 U: }6 M% U. Z  0x0021,     //EGCR  : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
; t3 d4 t' U( F2 g- N5 r: D              //          the WPE = 0 ,forbiden the writing posting when we debug the EMIF2 A9 c) ~& \* I, m0 M! m6 a; _
              //        the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin( s0 R* `( l/ \2 G7 Z. q! r
              //        the NOHOLD = 1,HOLD requests are not recognized by the EMIF 0 _! d/ p3 p8 @  N7 u0 X
  0xFFFF,    //EMI_RST: any write to this register resets the EMIF state machine$ U* o1 ?. q$ C, @$ K. H
  0x3FFF,    //CE0_1:  CE0 space control register 1. A3 p8 g) K! J/ A2 r3 q
              //        MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width
4 ]6 l' j: V8 A7 k3 n8 C& v% K% L  0xFFFF,   //CE0_2:  CE0 space control register 2  k& I- d) W" {. o
  0x00FF,   //CE0_3:  CE0 space control register 3
9 `) p6 E, ]7 g8 t              //        TIMEOUT = 0xFF;
2 D/ D6 v- U! R: {  0x7FFF,    //CE1_1:  CE0 space control register 1
5 B( J9 @2 k% O) [# j3 Q  M! p3 V  0xFFFF,    //CE1_2:  CE0 space control register 2- P  W' ~' G7 }- `* g) [# d9 A, I
  0x00FF,    //CE1_3:  CE0 space control register 3
# T4 p* }) l7 T) M* m' ?; r  1 U  ~& X" _  V. E1 N
  0x7FFF,    //CE2_1:  CE0 space control register 1% z9 }; ^4 v; f, _
  0xFFFF,    //CE2_2:  CE0 space control register 2/ y  u% v+ f' D
  0x00FF,    //CE2_3:  CE0 space control register 3- R/ Y4 F( V8 h7 E  t% b
  
; U, k& y# f! ^  I  0x7FFF,    //CE3_1:  CE0 space control register 1" V' X" f4 J8 \: B* c
  0xFFFF,    //CE3_2:  CE0 space control register 20 I& \2 ?. }6 h
  0x00FF,    //CE3_3:  CE0 space control register 39 V( J7 F6 L# T$ x3 ]' e
  8 @0 }; o# ?7 A/ I8 V0 `, H# g
  0x2922,   //SDC1:   SDRAM control register 1
. P: q5 t9 p. T              //          TRC = 8     
6 b3 h( p9 F7 R. v# w! U9 X              //        SDSIZE = 0;SDWID = 0) [4 ]1 d( ^8 c/ W; |. w5 K( r/ ?
              //        RFEN = 1
2 ]. ?- V; x2 H* T- a4 e5 H              //        TRCD = 2
* Y  W! V2 X+ N5 `- q0 B1 U0 r              //        TRP  = 2+ V) E: r0 v+ O
  0x0410,    //SDPER : SDRAM period register
; E) D- h/ j& U+ O              //          7ns *40965 F. s2 Z  P7 m& C% J
  0x07FF,    //SDINIT: SDRAM initialization register
# c) U9 L  }7 R% Y0 s1 c3 e              //        any write to this register to init the all CE spaces,
5 [$ I2 z: y4 a9 d; w; {2 K( d! j$ P              //        do it after hardware reset or power up the C55x device5 S( ]( G+ v9 p& W4 m
  0x0131    //SDC2:      SDRAM control register 2
8 b- {8 P5 n: x4 F% F% T              //        SDACC = 0;
. f  ^  `$ I: ]$ `& f              //        TMRD = 01;* T. l) C( O& v
              //        TRAS = 0101;
- E4 X; G1 a& B; p. z6 J, X              //        TACTV2ACTV = 0001;                                  V" W/ f: ]+ U  K
  };/ Q! X5 ]5 T  k4 U

: ]* _# b+ ~- W( Z7 `$ x6 o
% j, E$ [9 F1 @8 @) Tmain()
% _! P+ A6 Q+ X8 Y& ^$ s{
- W" Z1 ^) Y6 S; M    unsigned int error=0;( S, x8 d6 X# {
    /*初始化CSL库*/    4 X8 d: j8 F% G
    CSL_init();
1 b, T6 l* ^3 r: Y8 k0 o   
6 x7 i" r' y6 C! c. y  _    /*EMIF为全EMIF接口*/7 c- t8 i% ^6 ^! C
    CHIP_RSET(XBSR,0x0a01);% ^( B' Y; `. |1 \5 s3 y
   
# M  T: n$ F, E: |8 h    /*设置系统的运行速度为120MHz*/
. A7 w6 t% ~, Y3 ~    PLL_config(&myConfig);7 f2 N# n; Z4 K: A0 o$ z' V1 S
   
7 A( j2 i! [% C0 c/ U9 A2 g    /*初始化DSP的外部SDRAM*/( ~4 L4 V3 R% {* i% C  j6 R
    EMIF_config(&emiffig);2 x, T* z: i* v% q' ]8 P$ `
    /*向SDRAM中写入数据*/
  z* {$ i: ?+ t
, B/ y: }* a4 O    souraddr =  (int *)0x40000;# I' j" s/ a/ `0 z+ U9 p4 V
    deminaddr = (int *)0x41000;
' C+ c5 g, z5 T2 l+ ?( }    while(souraddr<deminaddr)0 K) l& h! D! x; y' }  t
    {, }- t8 x2 W% d! x
        *souraddr++ = datacount;    ! T/ t& t. [5 n; c8 B' X
        datacount++    ;, I8 L; `& J, l  y. O) F9 R
    }
3 B( M; N. i. d# v6 |/ _# d: d    /*读出SDRAM中的数据*/1 L  {1 u/ o, s3 F1 E
    souraddr =  (int *)0x40000;
. d7 ^* Y2 r' {- o2 p: L    datacount = 0;$ X3 D% o6 |1 F
    while(souraddr<deminaddr)
- E( a, f1 r% m    {7 S# G& U) h7 M! U
        databuffer[datacount++] = *souraddr++;
/ c" s: F6 a* L0 O0 M        if(databuffer[datacount-1]!=(datacount-1))
% E. l8 j& I8 U! J% K            error++;- Z6 k' [1 J/ `/ [% n, [3 b9 i
    }
" w  n* T& }& ~3 w2 k, C1 `% p
1 Y$ Y& A( O" ^8 e, U4 s    while(1);6 N/ B: H& X" u! r; S
}& O3 \- e; x9 A7 z
/*************************</span></span>
' B: r3 |* h% I( x  ]1 R下面分部分分析:
5 d$ K( b8 y! |( [& m锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的' }- J0 h3 i' l& S. @) ?# r
+ g3 B8 i2 O. S0 D5 n+ j3 ^

9 x2 P; y8 F& T! q PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,
- p' \: c, {4 v
  f  Q2 v6 K" B0 k在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。  t# z9 I8 S0 R5 H, k
# W9 K/ I% a3 F9 y2 {5 Q
IAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle $ E: u: Y' m: h& W% v3 V

) ?% _4 x7 F. i1 qmode was entered。3 ]) L" v: B2 ]

3 [, [3 `# ~3 m' x4 ^6 ]翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。0 _; S9 t8 V; o1 I! P
% m$ `. i5 I4 Z0 {& w- `3 m
IOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。
5 U8 r& F4 @, g. ]7 G! @6 @PLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍
' a- v/ Z0 }" ?0 ^# tPLL DIVLL分频位。plldiv=1,输入频率分频2
' [, v# E' S* N( l1 A: p我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。
/ d3 j5 J( Z8 R% mSDRMA的EMIF设置:
4 P, ?- W2 K. h1 [EMIF_Config结构体在csl_emifA.h中定义* Y) O$ P+ H9 c. `
2 i2 W4 V3 ~8 @/ \

$ o+ m/ m; i  R: ]2 X8 M结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
# C2 t# H* O( X! D3 f% Q* M  G& c: j
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。& N, _8 }* B$ N, h( v  V4 I

$ N) U. ~: V3 U. U$ g8 W! c2 }3 S. t5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,
1 h  T4 H# {2 {1 y. @8 s% x" Q
/ V+ h1 b7 D7 d* E) wEMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于8 C$ l) R  x% k/ v: K% C

0 D) _1 t2 v. ^8 Mcpu的时钟频率(120mhz),
5 `& ?  O0 l8 V  m# G5 H" m6 T& K: R- g- o+ w3 P0 F
但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,
, ^3 j' G; \9 g! `  v  S1 H- I) Z8 r0 N; m" b$ \
但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。$ t1 D/ k( M3 o% o2 ^/ d

/ `$ N6 v3 n7 X$ v/ REMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
4 r* s! ?* d  a. b# l1 [+ y. ~) h
( y: C/ U) T* I( y6 KCE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map
! c, I: o: f- f5 ]4 Y$ {被分成4个CE空间,
* w# M) F; N% {6 G3 \' e* L( E每个CE空间都3个CE控制寄存器,# V$ f8 ]1 h8 s9 F
分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。+ m8 Q# h# T/ {& j0 R: \: P
我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,
8 f& V7 l& S) P/ P5 s. z. N- U只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。
+ M8 Z) ^" [% G( @
) G7 Z0 }6 q9 g" u1 X : |* q6 Z7 ]2 V3 J% e; e$ w
SDRAM寄存器配置:
, v& P# j9 N4 V. |" A& [& A/ m# USDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,$ N/ f0 e* J1 i% U2 O
这要结合SDRAM的厂家提供的时序资料来配置。8 B4 @! Z  i6 U
- P/ j8 |" O: }" y6 j8 |

& e/ s- u! c8 t3 B3 ^这里就举一个例子,其他的类似。0 E9 ^# U* w! B$ h+ w0 f7 s
SDC1=0x2911,TRP[3:0]=0010," R' l* u) o8 ?; x- E; L6 E7 b
TRP = (tRP/CLKMEM) − 1:
" x6 m  T  q1 H2 e" v6 N4 [查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。; k' V  A3 q/ J% v$ Q$ e9 Q

1 B# Q* l& N0 l& O0 w+ A   m  H. G( g/ {' u  }. k; o% i) Q
Main函数分析& L4 I4 B( W, |6 o4 H$ t
CSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。- L, ]; ~* ~; l
CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。" z, M" h- V5 W( C9 B  W1 G
ox0a01就是将EMIF配置成全emif模式。
* ]' V/ R4 C! A6 x! p souraddr =  (int *)0x40000;是SDRAM起始地址
0 x0 P, `6 I4 X0 V, O! [ deminaddr = (int *)0x41000;结束地址: k; N: i. F( V7 }
接下来的程序就是写,读数据了。
4 ?1 e$ A+ g& Y8 ?9 L! E- [5 g/ b* |: O( q
; ~! y! h( ]5 S; R

该用户从未签到

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-6-21 00:03 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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