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

SDRAM操作代码分析

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 grand 于 2021-11-26 15:54 编辑 ! M+ @: O8 Q1 {# |! N6 c6 d6 P

4 n4 D) t/ A- }+ n: ~1 v0 ]9 d不多说先放代码:$ ]5 {5 [  |! [) v( D
( J/ Z( S: j0 n: x# F, n
6 f  k9 e. ]$ K, z% R3 Y. }% L
<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>
+ ]% a: X) ^) `#include <csl_pll.h>
5 K% M3 V2 G% E' i( L( C  [' E: c#include <csl_emif.h>
' k9 l% m0 R0 ?6 d#include <csl_chip.h>$ J  c6 j1 `2 \4 I% |( ~6 n' l
#include <stdio.h>
) \. v' o' ~$ H/ Q! _ % n( M1 X+ W: {+ p; B0 _* F  ?9 Q* L
Uint16 x;
  ~! z( f! X) T, I1 H5 k$ a" @$ l3 t2 |Uint32 y;
; A2 w$ n" L% W3 I' |3 H  q7 ZCSLBool b;
; I" N2 y) G! f9 P0 G7 V" W) J- A8 G/ munsigned int datacount = 0;8 `# L8 E( `! B7 R" Y" n
int databuffer[1000] ={0};- L) K  X: C3 f8 ]& ?; c9 G& n
int *souraddr,*deminaddr;* c7 {- c+ s, S# c: b8 I3 |/ O) N
/*锁相环的设置*/0 f( ]: z$ [$ \( I7 ~
PLL_Config  myConfig      = {
& l/ A% F: y( n( J2 B5 N  0,    //IAI: the PLL locks using the same process that was underway 1 s  {! G  k& E. D- Y* a6 u
                //before the idle mode was entered
4 s' Q' C9 y) {  1,    //IOB: If the PLL indicates a break in the phase lock, % s* E7 p+ M; p. J
                //it switches to its bypass mode and restarts the PLL phase-locking * U, V* O# e8 U- x; [
                //sequence
! T/ ?4 u8 H$ n# I# l  w" J$ ?& H+ t$ O  20,    //PLL multiply value; multiply 20 times' x( p# C9 C, |; |& I! {7 a" }' D
  1             //Divide by 2 PLL divide value; it can be either PLL divide value 7 ~. F5 k1 O3 J$ j
                //(when PLL is enabled), or Bypass-mode divide value
' g- f( A7 d# J. E6 M                //(PLL in bypass mode, if PLL multiply value is set to 1)7 a2 h; h7 t& S3 V; _
};/ x/ \' q3 H) o
/*SDRAM的EMIF设置*/" z% G  m" U* I7 c
EMIF_Config emiffig = {
0 V! A/ P$ P* u" K7 r$ d; l  0x0021,     //EGCR  : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence% O/ u( d5 Y: [& J; Y( A3 F
              //          the WPE = 0 ,forbiden the writing posting when we debug the EMIF2 s' H, z3 O0 T$ h  ~
              //        the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin
& F( t2 N( z3 X8 p              //        the NOHOLD = 1,HOLD requests are not recognized by the EMIF
, E! Y' O1 f: i" j5 H  0xFFFF,    //EMI_RST: any write to this register resets the EMIF state machine3 V. f. h7 n5 N. {9 _7 F: m
  0x3FFF,    //CE0_1:  CE0 space control register 1% {2 R. S9 i/ Y& j* S
              //        MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width
* g3 f1 `4 ^# Z; `% r9 o. A  0xFFFF,   //CE0_2:  CE0 space control register 29 N1 j# S9 |, K' i, w5 z- |: \' `
  0x00FF,   //CE0_3:  CE0 space control register 3
! _- C9 S& y/ J, y1 j! O              //        TIMEOUT = 0xFF;# J3 f! [; k1 L  ~. t6 \
  0x7FFF,    //CE1_1:  CE0 space control register 1
; k9 {+ M; @7 x  0xFFFF,    //CE1_2:  CE0 space control register 2
9 P5 M( b: i% F+ N' r8 p2 i4 F  0x00FF,    //CE1_3:  CE0 space control register 3- K+ k$ W# ]8 I* M$ m4 ?8 P
  
9 M$ |: m5 l0 q: K( A  0x7FFF,    //CE2_1:  CE0 space control register 1, r1 f7 Y, h9 v) ?4 C
  0xFFFF,    //CE2_2:  CE0 space control register 2% q0 c3 ?; E! z3 J0 |3 s6 Z- x
  0x00FF,    //CE2_3:  CE0 space control register 3
( ]8 ], b  W+ G) b  
2 n# d! e, X% T# E  0x7FFF,    //CE3_1:  CE0 space control register 1
1 N7 _# Q0 ~0 R  0xFFFF,    //CE3_2:  CE0 space control register 27 e: X/ Z+ t8 n; }: o
  0x00FF,    //CE3_3:  CE0 space control register 31 G& v- P' b0 ]& o8 e) k
  
4 \  @7 n! Q4 E/ O% h: \3 O4 q; p! L  0x2922,   //SDC1:   SDRAM control register 14 l6 f( G9 B* a/ w5 F* \- i
              //          TRC = 8     
0 {$ G+ a3 O: @7 Q, g2 U5 n8 N              //        SDSIZE = 0;SDWID = 0# g/ h0 R8 \0 x) k& X4 R& [/ D
              //        RFEN = 1
" b3 h8 l) X6 L' G5 h- j, o% ^4 N              //        TRCD = 27 |. Y, Q0 a/ k- |. o( h
              //        TRP  = 22 l* e0 ]6 Q7 E# y  Z, ~
  0x0410,    //SDPER : SDRAM period register
4 n4 Y/ S. n7 f9 Y" x; m              //          7ns *4096* g" y* `* f9 W& }; R: }
  0x07FF,    //SDINIT: SDRAM initialization register8 o3 E# ^" K+ v# [1 `' a
              //        any write to this register to init the all CE spaces,' j! e! K* T  W, N1 K
              //        do it after hardware reset or power up the C55x device
4 I' d$ C! N, D( {7 T' _% F  0x0131    //SDC2:      SDRAM control register 28 v. e0 Z( Z) ]9 R
              //        SDACC = 0;0 G. g( u7 D6 Q; c- q
              //        TMRD = 01;
% R; e9 ~& ~$ p: f$ k              //        TRAS = 0101;
+ x: @: m2 u5 \, _              //        TACTV2ACTV = 0001;                                
0 _8 n% J0 J1 H0 _) o  };6 Z$ h( |' G( q) I2 Q: c3 u) L, w

- t- N: f2 k/ y
6 g8 U6 @7 Y) Z3 b3 i$ s% {% |main()# Y0 `& B; K5 U# c8 M$ q
{
9 o6 X( d5 h3 }& ~; l" M5 h    unsigned int error=0;5 |9 ~' I" {+ s' a9 S' r7 N: L: p
    /*初始化CSL库*/   
: P# w; j" _7 d    CSL_init();! B8 i/ T/ C: ^  J! D
   
) z/ u  o* v- a7 U; m+ h, L    /*EMIF为全EMIF接口*/( Z% W7 f1 z, e* o! Z
    CHIP_RSET(XBSR,0x0a01);3 p- e: d1 T3 k% \/ ]1 ^" G
    $ m1 U$ ]8 H1 `, U) j
    /*设置系统的运行速度为120MHz*/  I6 D* l$ l/ @) }* |4 e
    PLL_config(&myConfig);7 m9 H% G& D3 Y! K( \. s* a
   
8 t  r6 N( {; M) }- W, h7 U    /*初始化DSP的外部SDRAM*/
6 x- f7 ~+ i; c& S3 t, T    EMIF_config(&emiffig);" b0 e% b  u% s3 x. Z
    /*向SDRAM中写入数据*/
3 Z0 p; M; M  T6 y8 _
/ i5 `' p0 K  v* t- R- n  A' x% P    souraddr =  (int *)0x40000;" g3 v2 b0 v$ p& x0 b# T8 P) B8 ~
    deminaddr = (int *)0x41000;
- \: P' n5 @! F  d) R  x% l5 M    while(souraddr<deminaddr)
4 Y- V/ x( H- x8 ?    {9 q- B" G9 J! H8 K! m
        *souraddr++ = datacount;   
8 s4 @) e5 B" Z  j5 W# _        datacount++    ;* Y- S' g4 G6 }+ z/ x, h
    }/ F# }( H$ [1 Y! t8 s8 }
    /*读出SDRAM中的数据*/4 J! y) R! d4 @/ b2 ]' R3 T% q
    souraddr =  (int *)0x40000;5 }7 [: m* o- [& e' c# _) X: p
    datacount = 0;2 k& L& ^' [$ |8 i
    while(souraddr<deminaddr)4 B, j5 @' f0 N& [1 o: Q4 u* v
    {" _8 q: e4 S9 I7 }9 Z
        databuffer[datacount++] = *souraddr++;, d( e$ a. Z- S1 D4 r
        if(databuffer[datacount-1]!=(datacount-1))
8 a) _$ z" D2 S* P! D7 k            error++;: Z- v+ t3 A) }5 d
    }
' @: h* ?  y0 w7 G( T& _; L3 {) h
5 J6 E7 D7 `" ~( b( f  x# J; o    while(1);
  ~8 H3 k) `( M6 ]0 N}
* m; r, R% P' h8 B  p0 O6 e$ T* m/*************************</span></span>
, T$ n: {; O* U; ]下面分部分分析:
1 E( V$ [$ a3 {# t锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的" d# X9 z5 P/ w; E: r0 D* j) W. V

1 h! i5 x: O  V+ i
: A2 a4 t+ H( y; Y% o PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,/ e3 T# n  F6 J; j

$ ~; R5 w7 U! p在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。
2 j' t6 D' _) M; r' a# w
4 P* C6 n& b2 `# LIAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle
% t( G  g8 _6 q* o' k' S2 Z( z1 Q' G/ x5 i- ?# d
mode was entered。9 N) `5 I# A' |$ a7 ]; U8 Y2 C
- `, `9 x3 b( ^" \9 G
翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。4 [6 ?% R9 _2 j: \7 J
* K8 ?) ^: w" Q$ U
IOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。- ?6 \8 q, a( M+ i# H
PLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍/ S8 @8 L4 _  h+ t3 X: e
PLL DIVLL分频位。plldiv=1,输入频率分频2( v8 {4 g$ C9 l: q
我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。
' M( b7 o1 N& E" ]+ K/ Z; {SDRMA的EMIF设置:# M. x+ q4 a: ?0 ~2 c! e: g* {
EMIF_Config结构体在csl_emifA.h中定义
0 E! @1 c4 ~7 h* K. _3 v9 x$ s+ d* E
8 t& `* n# w0 a% s0 H
' v, U5 o* J$ u! ?7 S结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
3 W' j5 J; o' _! j5 F/ D* I2 R: \- s2 T+ y( a
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。
* D6 |7 {- x: J
. o; d# k2 L, {4 O+ Y4 _* b# R5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,+ ^8 `  K2 o; F  E
, y: |, r. H, K
EMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于
0 {* l- r1 g  l% q! M; {7 v+ w# V+ u# n3 L- q
cpu的时钟频率(120mhz),! F1 |7 }) W6 K

7 k* k4 B3 A; c% _  `! v但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,2 w7 A1 b2 Q' B1 b9 f/ F; U! f

' V1 ?$ Z9 T4 ~" L2 i8 a0 K但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。
1 ?3 Y8 N8 ?$ h9 b$ x" m- u5 F
3 y0 c9 ], e1 c) kEMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
, o9 _. R% [4 m! O8 E' r9 F9 P$ f/ e- ?8 @- B; J
CE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map
  }5 M+ b: i2 \& m' s( _4 r- s被分成4个CE空间,
/ p" x6 c' O4 A/ ^每个CE空间都3个CE控制寄存器,
4 P4 U* }, s3 i7 R& r$ k# s. x分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。
- T0 w4 H) a% v( Q- K1 l, ^0 ?我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,# Z. E: o1 B" W* v) o! d/ g. j
只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。% C' }: p  q5 N/ v; U* v/ O
9 D- D$ s0 d  _" u$ T1 x% Q9 G3 ]
" `3 n3 L0 G, x7 ~4 p
SDRAM寄存器配置:5 O7 b1 b/ q# b' N5 W
SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,) ~# E  ^7 r' q$ n* N2 c
这要结合SDRAM的厂家提供的时序资料来配置。
% q4 Z1 K- O2 w! \
" s' a2 S! t+ d: i ' e# z4 u/ a+ z* X+ C% f
这里就举一个例子,其他的类似。
$ n! ^# D+ h( F4 n+ g$ ?+ g( c0 XSDC1=0x2911,TRP[3:0]=0010,' p* z. e( C+ a
TRP = (tRP/CLKMEM) − 1:
1 x0 e* d; |0 N  t& W, I3 n& P' M查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。6 E  C# s9 t* b7 _

; K+ h, N# Q) K7 h# ~, z, ^
( \+ l  m4 H$ D4 u/ `Main函数分析
& a( e2 W3 t; mCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
1 T! B1 v: L4 Y- |2 T# y& T CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。9 {4 t6 V7 d: Q$ @) d: Y; D4 q
ox0a01就是将EMIF配置成全emif模式。
, d+ t  z# x. f souraddr =  (int *)0x40000;是SDRAM起始地址
/ f: A: c( E. g deminaddr = (int *)0x41000;结束地址, ]  |; i& p  D' ^& |7 H
接下来的程序就是写,读数据了。
7 p8 t  F& u  ~; {# `0 Q, i; E1 o' D. q

) c1 I1 I% P* G- `. s' k

该用户从未签到

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

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

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

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