|
|
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
|
|