|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 grand 于 2021-11-26 15:54 编辑
( U( z8 ]# o+ ?/ {7 |& @. ]% g+ r! x0 A' x6 j' ^. B6 l
不多说先放代码:4 A. d& y0 |/ Y# w
/ C6 [: u0 T* {$ y5 B5 R
1 R: e9 k* S, ~9 t n) Z, ?0 E
<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>
3 M7 \7 ]3 m9 w1 p1 S#include <csl_pll.h>( A- K+ U& m0 D3 s
#include <csl_emif.h>! B4 e' [" ^8 Z: B) x" y
#include <csl_chip.h>- x4 u) t5 G7 [" a
#include <stdio.h>
9 }" U3 l1 E/ a1 M
: U$ m+ v- o; z# t9 e( e9 CUint16 x;
/ s7 c* Q8 n, k+ H( U& lUint32 y;
. o! v4 @8 x6 A/ e9 T9 [' V4 _CSLBool b;
Q; G; e; t. h N: vunsigned int datacount = 0;$ H' U4 T, F% N' W) R
int databuffer[1000] ={0};- H5 F% i& S* q5 }1 q- g) L. W
int *souraddr,*deminaddr; `1 I4 G0 w" ?5 L% S2 u
/*锁相环的设置*/; `3 m' K( f& {% F, g
PLL_Config myConfig = {( T8 ?5 B) u h I0 \% j
0, //IAI: the PLL locks using the same process that was underway - S0 M+ I+ s) H* m3 L
//before the idle mode was entered
* E' y# W% b1 @; r7 H/ U& U 1, //IOB: If the PLL indicates a break in the phase lock,
1 u/ V5 r# z! m! I //it switches to its bypass mode and restarts the PLL phase-locking 3 x) E, [* L7 H4 x% U
//sequence
$ q, B* i8 P2 ` 20, //PLL multiply value; multiply 20 times1 {. l# v* n% @$ k
1 //Divide by 2 PLL divide value; it can be either PLL divide value
2 W2 n. l3 A: [) A; p/ j1 f //(when PLL is enabled), or Bypass-mode divide value
$ c' ~# }8 f D //(PLL in bypass mode, if PLL multiply value is set to 1)
1 J J' ^' B/ E8 L& R};) [3 [5 x/ ?6 G9 @0 s: |
/*SDRAM的EMIF设置*// v9 i9 l$ V4 c4 @+ ?+ u
EMIF_Config emiffig = {
9 n" G1 ?( K0 t: \9 ^: p 0x0021, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
$ @- \: Z: C' i- c2 r6 u* d% m // the WPE = 0 ,forbiden the writing posting when we debug the EMIF
]# x0 K$ V* C, G: w; F // the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin3 J" V' u3 m3 p; p- h# {/ s
// the NOHOLD = 1,HOLD requests are not recognized by the EMIF
7 \. p2 @) ?# b' l% O+ m. I 0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine4 R% L2 ^. o$ Y! c4 L4 n' |
0x3FFF, //CE0_1: CE0 space control register 18 K3 U* b( y0 A) f0 u
// MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width
- H7 |0 B& x `+ P 0xFFFF, //CE0_2: CE0 space control register 2 l9 I4 }. s1 c3 m4 h
0x00FF, //CE0_3: CE0 space control register 33 o* V7 I8 e% p+ @
// TIMEOUT = 0xFF;4 }- o& {1 _7 N* R- X3 d3 t
0x7FFF, //CE1_1: CE0 space control register 1
1 I! h0 G0 e; u% C+ q, C& h7 \ 0xFFFF, //CE1_2: CE0 space control register 2
' h# [' ]* F6 y1 `' f 0x00FF, //CE1_3: CE0 space control register 3% \3 W3 A u& q0 B2 r6 j1 B
# u9 X4 P! p/ b# P
0x7FFF, //CE2_1: CE0 space control register 1/ g" P2 x$ R" s9 z( b2 H
0xFFFF, //CE2_2: CE0 space control register 2
$ K! p: g" [7 t8 ~% x7 } 0x00FF, //CE2_3: CE0 space control register 3
+ _) u; H# h$ j. ~
7 D8 \$ E- k' J d 0x7FFF, //CE3_1: CE0 space control register 1' T0 e6 j5 R1 `, W9 ~% j
0xFFFF, //CE3_2: CE0 space control register 2
( [, j( v# e6 J5 @+ Q. F 0x00FF, //CE3_3: CE0 space control register 3# u0 d# {* [, j" @$ o8 Y( C
/ b# U; |& S/ [# M9 }$ S0 r) Z
0x2922, //SDC1: SDRAM control register 1# S- S2 f! m( w7 |; Z8 M9 r8 m
// TRC = 8 ! `5 A' c& R5 ^6 ^4 D
// SDSIZE = 0;SDWID = 0
' {5 D( A9 O2 M2 Q3 y3 @; I // RFEN = 1
: ` J3 h( O5 B // TRCD = 2* }3 l- g) D `9 U, a8 H
// TRP = 26 ?6 R k3 G% j+ O; g! B
0x0410, //SDPER : SDRAM period register/ K; B. ?$ x4 J
// 7ns *40968 P' `- [% L, K5 X$ m3 o: \
0x07FF, //SDINIT: SDRAM initialization register& A/ \$ a( g9 A3 y
// any write to this register to init the all CE spaces,
5 p2 l0 c* T7 n/ e0 j! l% p // do it after hardware reset or power up the C55x device( g& T/ p k, N& D. K. M, b8 z: K' U
0x0131 //SDC2: SDRAM control register 2
- M9 J: t v" J // SDACC = 0;# S; ?# ^" x; u; O6 z6 a
// TMRD = 01;% f# s- }+ K; T4 ^. K5 X0 m
// TRAS = 0101;9 G" S5 s! X6 j, P
// TACTV2ACTV = 0001; 9 O {. p# y j1 M) @9 i: K
};
# l1 r+ j* b2 X
4 W& z" z" o2 c6 B# Y+ \' ~
0 H( J- N Z% c0 \6 V6 G5 umain()
7 d+ Y. f3 L ~# [/ F& ? Q, X5 q) C' K+ n{ ~# E" B: `) ^5 V+ m
unsigned int error=0;
7 G: j, y) o3 N" O2 Q8 Y9 C /*初始化CSL库*/ 3 c* w5 J! T) X) _/ i; j' a; Y
CSL_init();' |( }; ?; l- u& P; ]
, i1 [( O6 B/ X1 Q3 u# e! ] /*EMIF为全EMIF接口*/
) ?+ H- {2 O/ p" b5 N: X- K CHIP_RSET(XBSR,0x0a01);7 s3 ]9 T3 N1 u4 _- [" T
. ?3 |7 N N( r( c. o, i% K* c
/*设置系统的运行速度为120MHz*/! ]1 a6 g! y3 _
PLL_config(&myConfig);
4 G5 a8 z- p& y5 t# O9 C; t # ^# @$ e- Z7 Y, A
/*初始化DSP的外部SDRAM*/
" O6 s" E( [7 g, } EMIF_config(&emiffig);
. t* Y' H0 G& y7 R$ I7 [' ^ /*向SDRAM中写入数据*/' N$ O @8 q; ?9 t4 V; B
) `9 W8 u. W9 S: v5 T C, M' l5 n5 n souraddr = (int *)0x40000;" @1 g6 l( q% Y- j
deminaddr = (int *)0x41000;. R: s n5 Q$ `" Y# Y/ e8 o6 p
while(souraddr<deminaddr)( q4 w' R, l% X) ]! |( R/ P$ ^/ c
{
- F+ f7 n, o, y$ { *souraddr++ = datacount;
$ r6 f7 C& |7 e% V5 s% d datacount++ ;7 ] r7 W& J& U
}
" }- I% R/ r/ x6 f/ o8 W /*读出SDRAM中的数据*/
2 f# p3 g: Y; y souraddr = (int *)0x40000;1 {$ R+ [- N- F4 O1 q* ^1 n4 }9 f
datacount = 0;
' g( k9 c3 ^. D: F- [1 \ while(souraddr<deminaddr); e# j9 r* ^. Y8 S$ [# \
{
7 R& N" y1 R3 _) J- p* D: F databuffer[datacount++] = *souraddr++;
: G3 V6 [5 n/ t if(databuffer[datacount-1]!=(datacount-1))9 Z! t2 J, f* i) n. A- q% N! I
error++;% P+ E/ w/ Q2 A9 Q/ |# R) {: R% L
}8 _# o: u6 m5 W: k- t0 m v
* q. u$ A: Y1 @ H- _: P2 r' H
while(1);5 r8 t, M0 }7 U3 t, P: _! T
}. E$ ]; Q) `+ b' m$ R; z) ~2 t3 X3 K* i
/*************************</span></span>
9 N9 o/ L* D+ O: N; i( W下面分部分分析:
( U6 A9 C) J- @9 o: O: Q锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的
" ~5 V! J: g# ^- C) v4 t1 [! ~. I$ W6 K! ^" K, L
1 _0 ^1 |' O/ l2 K, c& D) j$ s
PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,
% B4 w( Z4 s7 Q: s, |. k
. ^9 D) \! L1 |: h在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。
0 `0 W6 s# e3 l9 I' i* n9 z
3 u j% z* U, t( nIAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle 0 a: A5 a4 x% u) Y3 _8 ~
2 b9 n6 S ]" b6 S5 }
mode was entered。
5 O# ^. o3 ]' G" t- ^5 ~
3 H: a& B8 q6 b4 @' i1 A6 z# z翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。
+ f( d& j! D# ?: {% b* x$ w
) q' K" ?9 o+ L0 `, V& dIOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。
: g# s+ O" ?0 cPLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍- J& X# N7 Q: d$ f1 T$ K/ W6 V6 X+ J& }
PLL DIVLL分频位。plldiv=1,输入频率分频2
. z5 i9 ~5 a5 W. R! M/ {我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。8 i3 T9 n2 e( _+ t
SDRMA的EMIF设置:
7 g8 u$ |0 p+ {& m3 q4 \/ `& eEMIF_Config结构体在csl_emifA.h中定义
& H2 a* ?/ X$ k- S A
. u6 ^+ C) X( |. |! t9 G
' Z/ y* C, G" b% a+ ^5 q, b& ?结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
3 G8 H6 T4 f' A7 ^% L. z( u2 f; O6 @3 t
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。
$ G" r% H, l6 P% G# h! E* h. y+ F$ I1 I
5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,! S" v( J5 t5 h* P8 e
3 e: t7 c4 i0 Y s. w: ?
EMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于
# N# y8 H' E' g9 ~5 @# N
) b4 U$ X. j% L: D3 T0 \cpu的时钟频率(120mhz),8 a2 y8 p6 q* s8 \
# X3 V% j" }9 Y% u- |/ ?7 ~但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,
/ G/ A- H* ~6 ]! y6 t" ^4 d
* k) K1 ^7 p0 D/ K; h) C4 K但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。& n) T8 G5 }* F, c7 |4 Z( \
: _# K: j6 {+ `3 O+ aEMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
# D7 q1 s; S$ k6 N- p) ^, t, S0 J+ ^- l5 Y1 k3 o4 }
CE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map 9 z, M8 z0 I) D( |3 O# p/ f
被分成4个CE空间,* k0 w- b$ N4 i* j
每个CE空间都3个CE控制寄存器,2 a$ Q, y; V# l7 U8 f8 z2 K
分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。
% d1 z& `- A5 I+ ~我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,9 `, i5 P8 ^& v
只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。
' w* v9 K# b6 N" {6 P! Z9 h: i: D1 r: V
; {; q/ {. F6 o
SDRAM寄存器配置:
" u$ H: }* u9 q/ RSDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,, R- ?( n. Y, X2 z0 D( m
这要结合SDRAM的厂家提供的时序资料来配置。/ Q+ x2 w& d& m# |- Y; S1 K: i' K) K
! t1 t: V: [8 R0 z5 F1 ~
3 }+ C. l# x0 Y/ X' ?5 a6 |这里就举一个例子,其他的类似。
1 k `7 p2 f+ k5 a9 HSDC1=0x2911,TRP[3:0]=0010,
4 {' `, [% |: G, [! J% B' h N TRP = (tRP/CLKMEM) − 1:
& E# u7 G( d9 N查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。9 Z* z k; d4 X' U' E
/ u' i1 {5 i& g# E
: a7 Y& ?; `0 N% LMain函数分析$ f) \6 o4 g k9 B5 |) s- z: h8 U
CSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
- `: O! }. i) E, F/ o CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。6 A1 Y: a9 P8 y- E) w# Y. y
ox0a01就是将EMIF配置成全emif模式。
% A9 h7 F3 ] I" X! C' W8 i souraddr = (int *)0x40000;是SDRAM起始地址6 u! |) l$ R' x8 _* `$ ~6 Z
deminaddr = (int *)0x41000;结束地址
+ n( ?& B0 m1 x$ O" L) X9 a接下来的程序就是写,读数据了。3 O1 k4 ]5 x1 P4 p+ ~
; j' q" ]3 i$ y; ~" @; t# X9 ~$ N8 k' I5 ^6 V; V
|
|