|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 grand 于 2021-11-26 15:54 编辑 ( ]+ M( F: M; y& Y
* [: \! k+ E$ v0 L8 r不多说先放代码:
, P% v) E) k3 L( E: z: f
& f$ Y. ~' I. T) j
4 H% i Z. W4 d. H<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>2 |# j7 g( W2 \; Z- |' `
#include <csl_pll.h>% ?; `, I6 ~# H9 t" J3 C( F3 r
#include <csl_emif.h>
8 O% ^; x/ H3 X# a#include <csl_chip.h>
& b9 [ F# w2 V/ ]#include <stdio.h>
% P6 T' U/ X; |% ?
# a- z$ I. [# O( o! A% [1 K" ]Uint16 x;
/ t, w( [: p3 d8 _5 W9 R: uUint32 y;+ d( m- @4 r8 q$ b3 f4 z5 B7 f# n
CSLBool b;' @! i% I+ P0 Z0 u& A
unsigned int datacount = 0;
0 p' k' q( X1 A: E; J0 S! @int databuffer[1000] ={0};
2 O O" s B0 l9 H9 bint *souraddr,*deminaddr;
# X$ l3 T' d" q/*锁相环的设置*/$ P6 p, z! ] `4 E7 N/ N$ J3 h
PLL_Config myConfig = {7 N) f+ T, b$ G O, o( E. K/ s# W2 _
0, //IAI: the PLL locks using the same process that was underway
+ E+ t/ f/ H: K" _5 ^ //before the idle mode was entered9 X* B2 ?' |: @8 u* @
1, //IOB: If the PLL indicates a break in the phase lock, 3 j2 }' U9 t+ S1 h
//it switches to its bypass mode and restarts the PLL phase-locking
! ], n4 J0 P6 \! i0 \7 G //sequence
6 b. U7 Z. I2 B, c6 |! ]9 W 20, //PLL multiply value; multiply 20 times3 d) v+ H C; Q; d
1 //Divide by 2 PLL divide value; it can be either PLL divide value
( s9 z3 i; C% ?0 h //(when PLL is enabled), or Bypass-mode divide value) u. h6 g% [' a: q% a
//(PLL in bypass mode, if PLL multiply value is set to 1)1 t# g% T& Y6 |) k( ]! Z9 _
};: W2 Q6 h5 `$ n; F% J' s
/*SDRAM的EMIF设置*/- R, r8 Z. b% X
EMIF_Config emiffig = {
) v$ S& Z% m6 B e" V 0x0021, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
& P: n9 d: v, {% i& f5 j // the WPE = 0 ,forbiden the writing posting when we debug the EMIF
! Y0 w- I0 I9 n // the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin* ?2 X: d; R! c
// the NOHOLD = 1,HOLD requests are not recognized by the EMIF
4 N f4 \, K0 } 0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine
6 d6 i4 J5 A, c3 l/ }5 a: X. [5 d 0x3FFF, //CE0_1: CE0 space control register 1
/ C" R4 Z9 R# V E1 h // MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width
& ]4 K/ h% k0 g6 v$ x5 ] 0xFFFF, //CE0_2: CE0 space control register 2
$ {& D: }* B6 x+ ~ 0x00FF, //CE0_3: CE0 space control register 3
, G i$ S# _4 B6 N1 W3 T // TIMEOUT = 0xFF;' T' ~1 B- Z: d6 y8 }% R" y7 V
0x7FFF, //CE1_1: CE0 space control register 1/ D! m8 f. j4 t9 @5 k# `
0xFFFF, //CE1_2: CE0 space control register 2. t6 }! J* M* ?3 G* O9 Q& `$ u
0x00FF, //CE1_3: CE0 space control register 3
* N# Z0 r# ?5 {/ @# G- L/ a- p- T
, X+ o1 Y7 [6 W! }& ? 0x7FFF, //CE2_1: CE0 space control register 1
% W$ O b- J+ E, g; t" Y 0xFFFF, //CE2_2: CE0 space control register 2" {* k5 e% _0 Y3 I3 a2 A) ^% N
0x00FF, //CE2_3: CE0 space control register 3
. n( g7 Z7 ~* T+ I: {$ ~ & U( d8 s( {8 Q! e9 T$ \0 X, f
0x7FFF, //CE3_1: CE0 space control register 1
/ `0 h3 i' b* h- s2 b8 ? 0xFFFF, //CE3_2: CE0 space control register 2
( c3 _* g8 ]5 m6 {( G, ~ 0x00FF, //CE3_3: CE0 space control register 3: ^, y1 J" @' H' L0 r0 N3 N2 P
3 z# k o F: _3 }, q# V; B
0x2922, //SDC1: SDRAM control register 1
% T! x2 b9 `1 O: G# Z/ U // TRC = 8
7 {7 f" W% g2 Z6 p1 K // SDSIZE = 0;SDWID = 0. c8 b, J5 S! ~; p* P* m/ ^6 u+ _
// RFEN = 12 H! D* [% p. \/ j4 n+ ?( ^7 \
// TRCD = 2
; z- W! ` Q4 C! \# ]9 _ // TRP = 2% W; y' A9 p0 d3 i
0x0410, //SDPER : SDRAM period register
K( J! P" o r8 @$ o$ m // 7ns *4096
7 N$ {4 m* y, M4 q$ s. P8 a% k( A 0x07FF, //SDINIT: SDRAM initialization register0 s l5 }1 y1 y# n" Q# e- L
// any write to this register to init the all CE spaces,
{" v9 ^' Z2 A) I // do it after hardware reset or power up the C55x device
: c1 e2 L0 L: C6 \7 U5 J% o; A 0x0131 //SDC2: SDRAM control register 2
. }# E4 U- O F" X9 R+ U // SDACC = 0;
% w5 |- n' a D% | V# T // TMRD = 01;" L" q; D8 Z* J; R" h1 Y6 I
// TRAS = 0101;
$ f2 \* [7 l9 g9 R" y // TACTV2ACTV = 0001;
\) I3 @' M; D5 ]* E2 e. d D };
' p. ^) c4 j+ A$ t ) [; ?) |2 Q% D
" E' {, H# j+ w1 l0 o. |6 i
main()
. D) |$ l; n+ s* W" t* M- l( T{0 g, L+ g* V5 r$ G$ w6 |
unsigned int error=0;
" z+ F2 t9 Z2 | /*初始化CSL库*/
8 J3 {0 s/ ?: H CSL_init();
" i3 t, H {! b8 S; B- y; X 9 ?; W- J7 ?3 Q6 A6 E2 r% r2 z
/*EMIF为全EMIF接口*/
v4 T9 [2 _& Z/ O6 k; ~ CHIP_RSET(XBSR,0x0a01);
% H0 J' F& V$ U7 i6 Y. Y6 q
7 K/ J' d+ W' L5 s( o /*设置系统的运行速度为120MHz*/, w% m% N6 A0 f& K
PLL_config(&myConfig);9 w1 e6 }5 a* I5 v( m$ R" K
A. J# @ I6 S* {5 @' h# x2 y7 ` /*初始化DSP的外部SDRAM*/* s5 B* R( o/ R1 _ z0 m4 [- r
EMIF_config(&emiffig);
5 d$ \7 j9 q/ P+ t C2 G /*向SDRAM中写入数据*/3 [5 b0 t/ a! a9 A, o X" L4 L
9 q# j. v* q( {! D$ c souraddr = (int *)0x40000;
; V2 Z0 W [; Z2 r+ E8 {/ [) f deminaddr = (int *)0x41000;, m- [: C% Q& {: {- `3 S
while(souraddr<deminaddr)
+ B6 Y5 U# l$ }2 X) T {' n7 z( h; ^& p. P: q: U
*souraddr++ = datacount;
& B+ j1 P2 f' u6 U; A datacount++ ;
' T' p4 U. @" a. \1 E3 N }% h2 i: c& k- J' I" q9 n5 m9 }
/*读出SDRAM中的数据*/
0 O" I$ q/ B9 Y0 p* B souraddr = (int *)0x40000;1 f; t2 s. k, n- y) q& N
datacount = 0;' a: P5 `8 b4 c) e9 F
while(souraddr<deminaddr)8 f5 \" b, `5 ?4 a2 J. k) m4 @
{
" ]6 v5 S, O9 ~0 U' T5 X- a0 h databuffer[datacount++] = *souraddr++;
. ~" z$ s2 D* p* R H, s# R if(databuffer[datacount-1]!=(datacount-1))5 `: e. r9 F- v/ x Q
error++;
! O9 y# E' f8 r7 k }1 T6 \0 ]/ F5 l) W4 W! p
) B. Q" G* s7 w. _. g8 y( t& e
while(1);- L/ s3 m! B, W' F
}
9 @9 b$ `+ R9 B5 o* H$ }- Y/*************************</span></span>
0 Q, b* M, t S$ Q! p下面分部分分析:
; K2 g5 G* Z* X! x7 n: M0 |锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的/ j$ |* ~) p( R* c
) } q% C6 \, i# | Z# ]
, ^# ?$ z: _' p: B7 @; b/ o PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,7 ^1 g* \( c! G& f, ]# c
t7 O1 T) n* D1 C! B1 F) g4 C7 ^
在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。4 d) N# L9 v E2 j
& Z7 M4 o8 I; A: u4 q. y* \+ nIAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle
* j4 ]+ ^6 u7 |/ ~4 j: |; s; ^1 R1 I* N: Z/ o. P; I2 I
mode was entered。, U1 s1 w- r6 c2 [/ T
# b& h6 b! b" p
翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。
9 I J* @0 `2 f( f1 o/ x6 t
3 P) U, J- Z3 `; i8 E, uIOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。
% S! y$ d. y* s i- r) TPLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍
) L" d f) t8 z) T& RPLL DIVLL分频位。plldiv=1,输入频率分频2
! R2 c% f; A; M C9 u, l我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。" L: b7 n8 p/ Q9 o( [) e
SDRMA的EMIF设置:
! U/ M! h1 S0 ^EMIF_Config结构体在csl_emifA.h中定义3 S, Z; z, s5 ?9 h: b- N& q9 }
: ?$ p9 D) ?8 T8 l/ \
3 J$ O- A& {' @) S3 l2 t结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
* @' J( `) b! z9 ~" J5 l* a0 g: }: n S' [2 s" t
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。4 o! m A2 l; d3 ? ~
9 C! M. _4 J |: x% O5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,+ U4 s+ u* V4 t, q& t/ L- c6 H1 [
+ `' Y/ X7 m; n/ Y) Q
EMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于
3 r4 Z: d5 ^& L: b8 b2 F$ @
' R8 T I% H0 a e& q6 e3 }5 Icpu的时钟频率(120mhz),/ u' c( d" P( |3 J7 p$ D- {
* {/ T9 a% S. m f, q但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,2 n, m2 H- F& n
# ~8 U! |. G/ g/ U ` m: n/ _
但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。' q1 A5 @- H; Z' D, a
) Z9 e) P2 a7 Q g+ U) C' XEMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
$ L" [* f: f' R, e, e$ L
" b k# m7 A& R) KCE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map 6 Y6 L) v8 ~; j" A2 O, B$ e
被分成4个CE空间,
: W! p. |, F+ D6 v每个CE空间都3个CE控制寄存器,; E& E+ {8 K' a5 e0 T1 @
分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。
7 y- }5 s e; H7 U( b) L3 v; K. s7 {我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,( |$ }/ ` ~7 A, @# f, s* M" r, }! f
只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。( y* r& n! u6 X) f. V# ~ y" g
& `- M$ F+ D$ o, |
1 A# r9 [# Y3 P: z
SDRAM寄存器配置:( p, W! M1 S* d- Y0 u) n3 I
SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,+ Y& R. l, x* b: v; M2 L
这要结合SDRAM的厂家提供的时序资料来配置。
6 t7 f0 G! r0 h% U+ p% D( M2 s% Q9 W7 L6 C7 `/ w
+ E) _9 b `& x( |* D5 S
这里就举一个例子,其他的类似。
; W' W/ F) \6 [SDC1=0x2911,TRP[3:0]=0010,
$ ]2 _6 Y2 i3 |. b TRP = (tRP/CLKMEM) − 1:
1 R7 \6 P$ M4 A ~4 ~0 K查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。. S: d4 D! J) W, Y* v
# ]5 N A1 Y" m+ | d9 z
0 |3 ]2 ^: {: j+ `3 X) X, GMain函数分析
2 e2 \; H5 p% B- {7 }2 w0 xCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
, R- P$ x0 u( v& ^0 J) m CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。& X! L2 v3 l' W' Q$ _
ox0a01就是将EMIF配置成全emif模式。
1 \' M" m3 D6 P/ o" c# U souraddr = (int *)0x40000;是SDRAM起始地址% B7 v% [" U6 S; l8 j1 g3 w" O/ H
deminaddr = (int *)0x41000;结束地址8 J1 F6 F8 N6 X. m$ e0 W
接下来的程序就是写,读数据了。
7 G K: d5 Y2 l& u) l& a+ ~; L3 r) H0 v3 b7 l+ r) L' U
7 Q+ z! }& C! g: f) ~: [
|
|