|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 grand 于 2021-11-26 15:54 编辑
" `# D7 m6 h5 y/ v1 m% O: {. }% \
8 i) K) u Z; w; |" q( [8 Z# E不多说先放代码:% {, J& B/ B+ k: s- r3 c
& H7 x: M) Y2 ~/ L9 C
8 F; L9 i- O. k0 j<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h># u, I5 s6 [+ D0 o0 n, I
#include <csl_pll.h>8 `; R2 b, ^: c4 p; |$ L- l* N: q* X
#include <csl_emif.h>: c$ q: } v/ G$ K H1 c
#include <csl_chip.h>) E. N ^( X0 n8 G
#include <stdio.h>
! T& k- z3 N3 D Z! l, u 1 Z$ W' j+ L1 X, `0 ]
Uint16 x;) ]- r+ p3 u! L; r5 O
Uint32 y;" c h% L+ {" b
CSLBool b;
, l" T, |1 J, ^0 \% Y5 }# m& kunsigned int datacount = 0;7 \8 L3 g0 W S9 d; m% F I! V
int databuffer[1000] ={0};) Y2 c- g* I5 `! i
int *souraddr,*deminaddr;; |' ?- C; p( J! w" J( x* a# Z4 w; O
/*锁相环的设置*/: L$ H" G, \( d4 [4 \
PLL_Config myConfig = {1 }: q) e, Z* R ?8 B! k- n ?( ]4 [
0, //IAI: the PLL locks using the same process that was underway , h! i6 A: L/ B
//before the idle mode was entered, w/ h: A3 S0 ], L
1, //IOB: If the PLL indicates a break in the phase lock, ! f5 r# F- K+ v+ E4 r' w d
//it switches to its bypass mode and restarts the PLL phase-locking
$ K" P$ {/ H; E% h# [( r //sequence
$ ]7 y4 v- ]1 c' B 20, //PLL multiply value; multiply 20 times
! r/ m- H: Z9 O! \; i5 g* L 1 //Divide by 2 PLL divide value; it can be either PLL divide value ! ]1 }7 C9 |0 S0 `& G
//(when PLL is enabled), or Bypass-mode divide value# N$ d; ?+ T6 |4 v/ Q
//(PLL in bypass mode, if PLL multiply value is set to 1)
' _( j; t" |. ]+ W}; i# R5 ^9 h. L* ~5 E
/*SDRAM的EMIF设置*// A6 X9 U$ @% ?* v5 V- z
EMIF_Config emiffig = {
6 T# J. o+ B' l 0x0021, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence
- y7 v2 n3 b# R" F" F8 ^, U // the WPE = 0 ,forbiden the writing posting when we debug the EMIF
! o$ b' _: ]3 w/ q! U4 Z$ a // the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin% `8 v, l9 M+ }& Y4 X+ z
// the NOHOLD = 1,HOLD requests are not recognized by the EMIF , p1 y! d: `# z1 Q
0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine: {( p7 R. F# n+ D4 @0 K! R
0x3FFF, //CE0_1: CE0 space control register 1
( y! M4 a3 {7 Y, s; X# Y // MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width
5 q" X+ \- B5 I1 g7 v 0xFFFF, //CE0_2: CE0 space control register 2! q* M. k- \ t- M8 [3 b! q6 h" ~
0x00FF, //CE0_3: CE0 space control register 3
2 K! V& X. ~9 t4 q/ [ // TIMEOUT = 0xFF;
! J# C% |6 ^5 t 0x7FFF, //CE1_1: CE0 space control register 15 O; z) D: v) E
0xFFFF, //CE1_2: CE0 space control register 28 l+ I. I( O! K( K
0x00FF, //CE1_3: CE0 space control register 3
: `4 o' I9 d, G; ~5 B ; e; A8 Y* j( K9 j, ~; S
0x7FFF, //CE2_1: CE0 space control register 1& ~. ]( N+ V6 g3 j4 W+ b
0xFFFF, //CE2_2: CE0 space control register 2
3 f* p. H. c, `. H7 f 0x00FF, //CE2_3: CE0 space control register 3
$ {* Z% F3 w1 J% U" G
& G7 W0 z4 p" h: K: ~6 z3 j+ Y* W 0x7FFF, //CE3_1: CE0 space control register 1
0 r) p+ G+ ?- \ 0xFFFF, //CE3_2: CE0 space control register 2. a) p4 f a5 J- r
0x00FF, //CE3_3: CE0 space control register 3
; ^4 P9 U. H6 l# {3 o+ N 0 l6 e2 h" W" W3 ?* Y# a8 e
0x2922, //SDC1: SDRAM control register 1$ j1 n( h0 [. a: y* Z
// TRC = 8 $ M1 J1 Y) z$ @6 c3 P+ ~7 A
// SDSIZE = 0;SDWID = 0% N6 y( {/ D' A$ T
// RFEN = 1( e6 @5 f4 Z. @/ W
// TRCD = 2: S1 O9 G; W4 g0 x( L4 ^% r
// TRP = 2& o: D; @8 j! q. d
0x0410, //SDPER : SDRAM period register( A5 c$ \0 p ?' g
// 7ns *4096
& W) a8 E0 I3 `2 @! Z; o 0x07FF, //SDINIT: SDRAM initialization register6 q3 ~$ p) G/ c
// any write to this register to init the all CE spaces,: e0 [8 O# \4 ~' D6 m3 \- g' T
// do it after hardware reset or power up the C55x device, ]+ q2 e4 N" {* }/ S
0x0131 //SDC2: SDRAM control register 20 ]/ T" V% e1 ?" q- x
// SDACC = 0;
, J X& c2 W4 Q; e // TMRD = 01;/ c8 G/ H x5 Y) K: {2 x" C# D
// TRAS = 0101;
: l# u) q7 I9 n& b // TACTV2ACTV = 0001;
9 A. _5 {* \8 k' p a };- I* h+ W9 Z8 {; }5 X( o
. ~* W [$ O' F2 A
2 i" k |* C( g* M3 v. Smain()+ I) i- o6 s2 G- Y4 |, \! H; o
{
" u% `7 V: M2 e# n unsigned int error=0;1 Z& W1 _0 c/ ?5 w. c
/*初始化CSL库*/ $ r1 K* I" O$ z. W6 p
CSL_init();
& f4 b' J+ S4 I3 k( R; d 5 f$ k$ U$ {7 {6 z
/*EMIF为全EMIF接口*/
3 b' y$ l& r7 g! m5 r CHIP_RSET(XBSR,0x0a01);
- l2 Y, o5 _; i0 }$ b6 [# h) i |# }
3 }! c- t) O' b0 b7 e$ S& ~+ h /*设置系统的运行速度为120MHz*/1 R5 ?9 G- K; Z0 e' W
PLL_config(&myConfig);
# F! T, W: I7 }8 G: X. I " p; O5 o6 b% a; b* }
/*初始化DSP的外部SDRAM*/
0 F# X" `* F1 M9 g0 @ EMIF_config(&emiffig);6 }' M, H0 l* L- f$ d% K* i4 Z6 g2 Q8 T7 A
/*向SDRAM中写入数据*/
1 P8 y- }0 ^: h+ i. _, j! ]! ^ N
0 T: a: x8 |' M souraddr = (int *)0x40000;' Q9 G b: M6 O% R
deminaddr = (int *)0x41000;
5 n- K# c; w0 H: N+ n while(souraddr<deminaddr)
9 _% f/ [8 ]7 ?: ~3 b! k# N1 C4 ? {
: k. B2 K5 M: x *souraddr++ = datacount;
, Z! b7 l4 P: n* C0 X% U datacount++ ;; M5 u7 ~% r$ i
}
& I6 o( m4 w/ j /*读出SDRAM中的数据*/; Z3 A: x% e1 c( b
souraddr = (int *)0x40000;
( z0 P: j! q: g- B datacount = 0;
0 T1 }+ V- I2 Z" m3 d while(souraddr<deminaddr)
# A' P- _: d$ W6 q) x0 ?' R$ A; ? {" O# u5 c8 C7 R$ H8 y
databuffer[datacount++] = *souraddr++;- Z [# B2 k: ]9 a3 z
if(databuffer[datacount-1]!=(datacount-1))6 S4 b; n1 B) T- r
error++;7 h9 K& c9 z7 S$ c1 E" j
}. F: X7 Q9 r4 J* [$ s B
1 u$ h \9 ?% {' L3 P, u
while(1);7 d& V) R# X. m5 ?
}$ ?2 k, G2 i' W
/*************************</span></span>
/ F/ \2 U2 _9 t" j1 `+ v9 m9 @下面分部分分析:2 M9 h5 D! s0 n6 A, l" q) C4 h: [* k
锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的, K, t/ S+ {: a- J9 p/ J; l
) i. I: }: c' J& W- _; u1 n! M2 C* E! z. m
PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,1 J4 X/ {0 ~; W+ h/ f6 G
5 e: O7 _+ M/ [, g5 p5 @
在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。) W% T1 X }) ~9 L: v: F. K+ Y
, U8 r% r0 d: j5 N, UIAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle
& D# ?+ C3 z7 Z4 Z' C! R( Q: p0 J) m0 W8 D( u$ N. J
mode was entered。' N: Q P- p; ]
6 L) c) }/ ^$ ~8 G+ B- j* F翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。$ _4 g. K( @; X5 [9 S
7 b' a" I( M, G; T+ y
IOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。6 K' U6 Q% `: `- D3 |* l9 q
PLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍
0 K0 S: h/ T DPLL DIVLL分频位。plldiv=1,输入频率分频2
6 a8 m' U3 {. J% E8 V+ W4 h2 I我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。" c! ^5 y% m- _. [0 p
SDRMA的EMIF设置:8 b. g2 Q6 a! e2 Y) Z7 [& y, j3 L
EMIF_Config结构体在csl_emifA.h中定义" \) w/ G7 I" }9 a# ^
i M0 x7 Y4 j+ d ( ]+ C- t1 D r' E: U
结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
$ K6 K1 l! u! q% R$ R" y3 X; J
& d; s! p' s% W/ m在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。 B, Q8 L2 R1 I( E
; ~8 E0 g* K9 N' z/ X9 I H$ A/ @
5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,
! m+ K) e2 K- _
& C% [, N" O$ b8 P# A. Z: iEMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于
9 @: k( u3 d( S# k$ ^8 E+ d' @: K# E3 C' `& G& B
cpu的时钟频率(120mhz),# `4 k! E9 @+ h, {; V2 D2 {
* u' X+ X" l3 B7 c6 ]- u; L但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,
3 _4 L2 v- z3 B9 m
. b0 W" e# b4 X0 D r0 `: |% f/ e# f但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。
5 ~8 k. M& Z) U0 z# U: P& Q5 Z' ?3 c9 E# J& B7 _5 s# H6 D
EMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
. U8 T5 e) @ ]- h( ~ `/ d2 Q# h- m& C, g: u& P
CE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map
1 d- c: ]; F. C, O" i被分成4个CE空间,5 Z* J7 k3 Y% S) `' j) N: S
每个CE空间都3个CE控制寄存器,
, Z+ w6 v$ |6 b. q分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。4 x( T! c) \: o1 M
我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,
/ {7 \/ u) K2 w) ~# q' s v3 o" _+ b只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。
# _& o% l$ \- t6 [! q7 `6 d% K
2 f; B2 r6 y" y1 V; _
# y( l. i2 p' a& ~$ U& j1 _& u* gSDRAM寄存器配置:
2 Q- p" \& ~2 ]8 W4 S# l ~% \SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,8 {, \3 U; s& L0 s
这要结合SDRAM的厂家提供的时序资料来配置。2 [. k9 x8 d, t5 v1 H& i! x
8 [, Z5 K- c5 L5 Q9 P 2 S B4 C \0 a
这里就举一个例子,其他的类似。
1 \, x6 P1 f; ]7 Y% z' a3 vSDC1=0x2911,TRP[3:0]=0010,7 j8 r9 h% b1 {$ u
TRP = (tRP/CLKMEM) − 1:3 @. o0 n" ?6 y
查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。
( E1 c- ]$ x) d, B6 q9 }8 r0 f; p6 v0 d7 |
: T7 `) ~5 z# W S$ K: N5 c2 N4 b/ W
Main函数分析
" Z- z* q; R5 E- X V; q! LCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
( u7 s) t. o& [ F9 u1 i3 n; k CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。: N W( W' N2 e% h0 q4 P
ox0a01就是将EMIF配置成全emif模式。4 f5 V8 d! `7 N: ^9 b- }7 f
souraddr = (int *)0x40000;是SDRAM起始地址; v1 U/ J5 j7 S0 A, A$ i
deminaddr = (int *)0x41000;结束地址* S% `% q/ h9 P2 R5 j6 N* g' @
接下来的程序就是写,读数据了。/ C$ f, I* Y1 Q' M/ {4 [
& p6 d6 q2 ?/ V$ P) j+ L! ~
8 |' H- `$ K$ v$ _+ {! G% V1 z; Q+ v |
|