|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 grand 于 2021-11-26 15:54 编辑 ! M+ @: O8 Q1 {# |! N6 c6 d6 P
4 n4 D) t/ A- }+ n: ~1 v0 ]9 d不多说先放代码:$ ]5 {5 [ |! [) v( D
( J/ Z( S: j0 n: x# F, n
6 f k9 e. ]$ K, z% R3 Y. }% L
<span style="font-size:18px;"><span style="font-size:14px;">#include <csl.h>
+ ]% a: X) ^) `#include <csl_pll.h>
5 K% M3 V2 G% E' i( L( C [' E: c#include <csl_emif.h>
' k9 l% m0 R0 ?6 d#include <csl_chip.h>$ J c6 j1 `2 \4 I% |( ~6 n' l
#include <stdio.h>
) \. v' o' ~$ H/ Q! _ % n( M1 X+ W: {+ p; B0 _* F ?9 Q* L
Uint16 x;
~! z( f! X) T, I1 H5 k$ a" @$ l3 t2 |Uint32 y;
; A2 w$ n" L% W3 I' |3 H q7 ZCSLBool b;
; I" N2 y) G! f9 P0 G7 V" W) J- A8 G/ munsigned int datacount = 0;8 `# L8 E( `! B7 R" Y" n
int databuffer[1000] ={0};- L) K X: C3 f8 ]& ?; c9 G& n
int *souraddr,*deminaddr;* c7 {- c+ s, S# c: b8 I3 |/ O) N
/*锁相环的设置*/0 f( ]: z$ [$ \( I7 ~
PLL_Config myConfig = {
& l/ A% F: y( n( J2 B5 N 0, //IAI: the PLL locks using the same process that was underway 1 s {! G k& E. D- Y* a6 u
//before the idle mode was entered
4 s' Q' C9 y) { 1, //IOB: If the PLL indicates a break in the phase lock, % s* E7 p+ M; p. J
//it switches to its bypass mode and restarts the PLL phase-locking * U, V* O# e8 U- x; [
//sequence
! T/ ?4 u8 H$ n# I# l w" J$ ?& H+ t$ O 20, //PLL multiply value; multiply 20 times' x( p# C9 C, |; |& I! {7 a" }' D
1 //Divide by 2 PLL divide value; it can be either PLL divide value 7 ~. F5 k1 O3 J$ j
//(when PLL is enabled), or Bypass-mode divide value
' g- f( A7 d# J. E6 M //(PLL in bypass mode, if PLL multiply value is set to 1)7 a2 h; h7 t& S3 V; _
};/ x/ \' q3 H) o
/*SDRAM的EMIF设置*/" z% G m" U* I7 c
EMIF_Config emiffig = {
0 V! A/ P$ P* u" K7 r$ d; l 0x0021, //EGCR : the MEMFREQ = 00,the clock for the memory is equal to cpu frequence% O/ u( d5 Y: [& J; Y( A3 F
// the WPE = 0 ,forbiden the writing posting when we debug the EMIF2 s' H, z3 O0 T$ h ~
// the MEMCEN = 1,the memory clock is reflected on the CLKMEM pin
& F( t2 N( z3 X8 p // the NOHOLD = 1,HOLD requests are not recognized by the EMIF
, E! Y' O1 f: i" j5 H 0xFFFF, //EMI_RST: any write to this register resets the EMIF state machine3 V. f. h7 n5 N. {9 _7 F: m
0x3FFF, //CE0_1: CE0 space control register 1% {2 R. S9 i/ Y& j* S
// MTYPE = 011,Synchronous DRAM(SDRAM),16-bit data bus width
* g3 f1 `4 ^# Z; `% r9 o. A 0xFFFF, //CE0_2: CE0 space control register 29 N1 j# S9 |, K' i, w5 z- |: \' `
0x00FF, //CE0_3: CE0 space control register 3
! _- C9 S& y/ J, y1 j! O // TIMEOUT = 0xFF;# J3 f! [; k1 L ~. t6 \
0x7FFF, //CE1_1: CE0 space control register 1
; k9 {+ M; @7 x 0xFFFF, //CE1_2: CE0 space control register 2
9 P5 M( b: i% F+ N' r8 p2 i4 F 0x00FF, //CE1_3: CE0 space control register 3- K+ k$ W# ]8 I* M$ m4 ?8 P
9 M$ |: m5 l0 q: K( A 0x7FFF, //CE2_1: CE0 space control register 1, r1 f7 Y, h9 v) ?4 C
0xFFFF, //CE2_2: CE0 space control register 2% q0 c3 ?; E! z3 J0 |3 s6 Z- x
0x00FF, //CE2_3: CE0 space control register 3
( ]8 ], b W+ G) b
2 n# d! e, X% T# E 0x7FFF, //CE3_1: CE0 space control register 1
1 N7 _# Q0 ~0 R 0xFFFF, //CE3_2: CE0 space control register 27 e: X/ Z+ t8 n; }: o
0x00FF, //CE3_3: CE0 space control register 31 G& v- P' b0 ]& o8 e) k
4 \ @7 n! Q4 E/ O% h: \3 O4 q; p! L 0x2922, //SDC1: SDRAM control register 14 l6 f( G9 B* a/ w5 F* \- i
// TRC = 8
0 {$ G+ a3 O: @7 Q, g2 U5 n8 N // SDSIZE = 0;SDWID = 0# g/ h0 R8 \0 x) k& X4 R& [/ D
// RFEN = 1
" b3 h8 l) X6 L' G5 h- j, o% ^4 N // TRCD = 27 |. Y, Q0 a/ k- |. o( h
// TRP = 22 l* e0 ]6 Q7 E# y Z, ~
0x0410, //SDPER : SDRAM period register
4 n4 Y/ S. n7 f9 Y" x; m // 7ns *4096* g" y* `* f9 W& }; R: }
0x07FF, //SDINIT: SDRAM initialization register8 o3 E# ^" K+ v# [1 `' a
// any write to this register to init the all CE spaces,' j! e! K* T W, N1 K
// do it after hardware reset or power up the C55x device
4 I' d$ C! N, D( {7 T' _% F 0x0131 //SDC2: SDRAM control register 28 v. e0 Z( Z) ]9 R
// SDACC = 0;0 G. g( u7 D6 Q; c- q
// TMRD = 01;
% R; e9 ~& ~$ p: f$ k // TRAS = 0101;
+ x: @: m2 u5 \, _ // TACTV2ACTV = 0001;
0 _8 n% J0 J1 H0 _) o };6 Z$ h( |' G( q) I2 Q: c3 u) L, w
- t- N: f2 k/ y
6 g8 U6 @7 Y) Z3 b3 i$ s% {% |main()# Y0 `& B; K5 U# c8 M$ q
{
9 o6 X( d5 h3 }& ~; l" M5 h unsigned int error=0;5 |9 ~' I" {+ s' a9 S' r7 N: L: p
/*初始化CSL库*/
: P# w; j" _7 d CSL_init();! B8 i/ T/ C: ^ J! D
) z/ u o* v- a7 U; m+ h, L /*EMIF为全EMIF接口*/( Z% W7 f1 z, e* o! Z
CHIP_RSET(XBSR,0x0a01);3 p- e: d1 T3 k% \/ ]1 ^" G
$ m1 U$ ]8 H1 `, U) j
/*设置系统的运行速度为120MHz*/ I6 D* l$ l/ @) }* |4 e
PLL_config(&myConfig);7 m9 H% G& D3 Y! K( \. s* a
8 t r6 N( {; M) }- W, h7 U /*初始化DSP的外部SDRAM*/
6 x- f7 ~+ i; c& S3 t, T EMIF_config(&emiffig);" b0 e% b u% s3 x. Z
/*向SDRAM中写入数据*/
3 Z0 p; M; M T6 y8 _
/ i5 `' p0 K v* t- R- n A' x% P souraddr = (int *)0x40000;" g3 v2 b0 v$ p& x0 b# T8 P) B8 ~
deminaddr = (int *)0x41000;
- \: P' n5 @! F d) R x% l5 M while(souraddr<deminaddr)
4 Y- V/ x( H- x8 ? {9 q- B" G9 J! H8 K! m
*souraddr++ = datacount;
8 s4 @) e5 B" Z j5 W# _ datacount++ ;* Y- S' g4 G6 }+ z/ x, h
}/ F# }( H$ [1 Y! t8 s8 }
/*读出SDRAM中的数据*/4 J! y) R! d4 @/ b2 ]' R3 T% q
souraddr = (int *)0x40000;5 }7 [: m* o- [& e' c# _) X: p
datacount = 0;2 k& L& ^' [$ |8 i
while(souraddr<deminaddr)4 B, j5 @' f0 N& [1 o: Q4 u* v
{" _8 q: e4 S9 I7 }9 Z
databuffer[datacount++] = *souraddr++;, d( e$ a. Z- S1 D4 r
if(databuffer[datacount-1]!=(datacount-1))
8 a) _$ z" D2 S* P! D7 k error++;: Z- v+ t3 A) }5 d
}
' @: h* ? y0 w7 G( T& _; L3 {) h
5 J6 E7 D7 `" ~( b( f x# J; o while(1);
~8 H3 k) `( M6 ]0 N}
* m; r, R% P' h8 B p0 O6 e$ T* m/*************************</span></span>
, T$ n: {; O* U; ]下面分部分分析:
1 E( V$ [$ a3 {# t锁相环的设置:PLL_Config结构体是在csl_pllA.H中定义的" d# X9 z5 P/ w; E: r0 D* j) W. V
1 h! i5 x: O V+ i
: A2 a4 t+ H( y; Y% o PLL锁相环的配置寄存器Clock Mode Register (CLKMD)的各位的详细描述 在5509A的datasheet里是没有的,/ e3 T# n F6 J; j
$ ~; R5 w7 U! p在overview_spru317f.pdf里有详细介绍,想要的发评论留下方式我发给你。
2 j' t6 D' _) M; r' a# w
4 P* C6 n& b2 `# LIAI:Initialize after idle bit.IAI=0表示The PLL locks using the same process that was underwaybefore the idle
% t( G g8 _6 q* o' k' S2 Z( z1 Q' G/ x5 i- ?# d
mode was entered。9 N) `5 I# A' |$ a7 ]; U8 Y2 C
- `, `9 x3 b( ^" \9 G
翻译过来大致就是在进入空闲模式之前PLL lock使用相同的方式。4 [6 ?% R9 _2 j: \7 J
* K8 ?) ^: w" Q$ U
IOB:Initialize on break bit. IOB=1:时钟发生器选择它的旁路模式并且重启锁相序列。- ?6 \8 q, a( M+ i# H
PLL MULT:pll倍频位。pllmult=20,输入时钟频率倍频20倍/ S8 @8 L4 _ h+ t3 X: e
PLL DIVLL分频位。plldiv=1,输入频率分频2( v8 {4 g$ C9 l: q
我的开发板外接频率是12MHZ,倍频20,再分频2以后系统时钟频率就是12*20/2=120MHZ。
' M( b7 o1 N& E" ]+ K/ Z; {SDRMA的EMIF设置:# M. x+ q4 a: ?0 ~2 c! e: g* {
EMIF_Config结构体在csl_emifA.h中定义
0 E! @1 c4 ~7 h* K. _3 v9 x$ s+ d* E
8 t& `* n# w0 a% s0 H
' v, U5 o* J$ u! ?7 S结构体里每个参数都是寄存器的名字,每个寄存器的具体描述在datasheetemif_spru670.pdf中,
3 W' j5 J; o' _! j5 F/ D* I2 R: \- s2 T+ y( a
在5509A的datasheet中并没有具体的描述,只有寄存器的memory map。
* D6 |7 {- x: J
. o; d# k2 L, {4 O+ Y4 _* b# R5509A的外扩内存映射被分成4个CE片选空间,每个空间可以扩展4Mx16,+ ^8 ` K2 o; F E
, y: |, r. H, K
EMIF Global Control Register (EGCR):MEMFREQ的9-11位是000,CLKMEM的频率就等于
0 {* l- r1 g l% q! M; {7 v+ w# V+ u# n3 L- q
cpu的时钟频率(120mhz),! F1 |7 }) W6 K
7 k* k4 B3 A; c% _ `! v但是对于5509A芯片来说,如果MEMFREQ=000b,SDRAM控制寄存器3的DIV1位必须设置为1,2 w7 A1 b2 Q' B1 b9 f/ F; U! f
' V1 ?$ Z9 T4 ~" L2 i8 a0 K但是结构体中并没有定义SDC3(SDRAM Control Register 3 ),晚上回实验室再补上SDC3的定义试试,应该可以通过。
1 ?3 Y8 N8 ?$ h9 b$ x" m- u5 F
3 y0 c9 ], e1 c) kEMIF Global Reset Register (EMIRST):用默认的0xFFFF就行。
, o9 _. R% [4 m! O8 E' r9 F9 P$ f/ e- ?8 @- B; J
CE Space Control Registers (CEn1, CEn2, and CEn3 in Each CE Space):外部的内存memory map
}5 M+ b: i2 \& m' s( _4 r- s被分成4个CE空间,
/ p" x6 c' O4 A/ ^每个CE空间都3个CE控制寄存器,
4 P4 U* }, s3 i7 R& r$ k# s. x分别是CEn1, CEn2, and CEn3 ,n是表示的4个CE空间,CE0空间寄存器就是CE01,CE02,CE03,以此类推。
- T0 w4 H) a% v( Q- K1 l, ^0 ?我的开发板外接的SDRAM是4MX16的,4M是内存大小,16是数据位宽D0-D15,所以CE0的片选空间被完全占用,# Z. E: o1 B" W* v) o! d/ g. j
只用到了CE0的3个寄存器,其他3个CE空间不适用,也是将CEn1寄存器的MTYPE位设置为0x7FFF(只要MTYPE不是00,01,10,11,认识数值都可以,具体描述看手册)。其他的寄存器数值配置按默认的就可以。% C' }: p q5 N/ v; U* v/ O
9 D- D$ s0 d _" u$ T1 x% Q9 G3 ]
" `3 n3 L0 G, x7 ~4 p
SDRAM寄存器配置:5 O7 b1 b/ q# b' N5 W
SDRAM Control Registers 1 and 2 (SDC1 and SDC2):SDRAM控制寄存器主要就是配置SDRAM的时序,) ~# E ^7 r' q$ n* N2 c
这要结合SDRAM的厂家提供的时序资料来配置。
% q4 Z1 K- O2 w! \
" s' a2 S! t+ d: i ' e# z4 u/ a+ z* X+ C% f
这里就举一个例子,其他的类似。
$ n! ^# D+ h( F4 n+ g$ ?+ g( c0 XSDC1=0x2911,TRP[3:0]=0010,' p* z. e( C+ a
TRP = (tRP/CLKMEM) − 1:
1 x0 e* d; |0 N t& W, I3 n& P' M查看SDRAM的厂家datasheet,查tTP的参考数值,发现,tRP最小值是20ns,CLKMEM的时钟频率就是前面设置的120MHZ,周期t=1/120MHZ=8ns,.tRP=24ns。6 E C# s9 t* b7 _
; K+ h, N# Q) K7 h# ~, z, ^
( \+ l m4 H$ D4 u/ `Main函数分析
& a( e2 W3 t; mCSL_init();使用CSL库必须要用这个函数初始化CSL库,而且只需要初始化一次。
1 T! B1 v: L4 Y- |2 T# y& T CHIP_RSET(XBSR,0x0a01);配置EMIF为全EMIF接口,XBSR是寄存器External Bus Selection Register简称。9 {4 t6 V7 d: Q$ @) d: Y; D4 q
ox0a01就是将EMIF配置成全emif模式。
, d+ t z# x. f souraddr = (int *)0x40000;是SDRAM起始地址
/ f: A: c( E. g deminaddr = (int *)0x41000;结束地址, ] |; i& p D' ^& |7 H
接下来的程序就是写,读数据了。
7 p8 t F& u ~; {# `0 Q, i; E1 o' D. q
) c1 I1 I% P* G- `. s' k |
|