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