标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: " R q7 ^: J- ~ B1 f1 r; c#define PING_PONG_ACNT 1 " i. g+ y( v3 u, ^+ e& n" z, n) B#define PING_PONG_BCNT 8*32*40 ! |7 e( n0 k" r0 X9 k+ d. y0 f( x
//#define PING_PONG_BCNT 1 % I$ t* }( f! s1 K+ [4 V: n
#define PING_PONG_CCNT 1, i: v0 T0 v7 \8 S+ s
#define MCASP_BASEADDR 0x01D000005 u8 N) e% d( K q, W5 ~
#define Mcasp_RXEVENTQUE (0u)9 p% m, S4 ^# ~; ]" t. _
9 j* |4 v# d, o5 V, d% G6 z
/* OPT Field specific defines */# ~3 l: C0 t& x/ O
#define OPT_SYNCDIM_SHIFT (0x00000002u)1 U1 e' A. B% M. z; g
#define OPT_TCC_MASK (0x0003F000u) 2 `" ~ I$ N& j$ P$ v' W$ J#define OPT_TCC_SHIFT (0x0000000Cu) 4 c- W1 A$ A* J; M4 u: S3 a$ o2 s#define OPT_ITCINTEN_SHIFT (0x00000015u)& H- R, R u- g# ]3 v
#define OPT_TCINTEN_SHIFT (0x00000014u)! o: d" t( X# b! f5 e
0 H1 o$ @" W1 y' m& s
char ping_buffer[PING_PONG_BCNT]; 3 z" O. ^7 z# n3 h1 d8 Qchar pong_buffer[PING_PONG_BCNT];$ j. k% [9 W) V) G% W u" H& {
' |0 p* H$ R+ B' v& r0 j
. Q1 T) [$ d; U) P
& ~( b& u4 d5 B! `- x# v, m 0 ] P$ |! Q( s" Z4 s1 Xstatic void ys_edma3_init()1 G9 c- ]' k: Y9 y3 I
{1 I/ R( z( ~) A: E9 Z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( h3 R6 v6 I/ o6 N
EDMA3_DRV_Result result = EDMA3_DRV_SOK; 0 U" k& C! p) i; v7 ^0 g7 ]% Z EDMA3_DRV_Handle hEdma;: Z' K" e( i1 K2 ~; X
uint32_t chId = 0;. b- t) C+ a* X0 l. p& _8 P
uint32_t tcc = 0;, E' [% c. p- l0 u% {" E& N
! G) O4 [) X5 | print2arm("edma3 driver init...",0); ' T" g1 l ?: Y) F w+ n3 V: N1 s9 _9 p, Z( W; @
hEdma = edma3init(0,&result); . a/ N# y5 t/ c4 y/ F if(hEdma) 8 L( P! w$ M2 a P+ V/ g { / q: [: Y8 K( g5 z5 f2 u6 G print2arm("edma3init() Passed.",0); o, ? i. k9 G, _0 W
}3 P+ N/ A q6 f( Z
else " J9 Q1 ?4 p, H! r$ a0 z8 }) D { & L4 E1 T7 L+ j8 H: d print2arm("edma3init() Failed.",0); ( C2 x6 ?- K' v! ` }) w4 c) y) ^' @" W
. Z5 E* d/ ~; q$ Q, o* r8 K( c
if (result == EDMA3_DRV_SOK) , z" e9 E4 \) j! V; g } { 0 i( \* P1 ~6 p- B( _1 c result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, * W- o. m0 i. L! z; q (EDMA3_RM_EventQueue)0,8 t6 ]+ v% a# I2 w+ u
&edma3_isr, NULL);: R( e3 g$ T: w$ H& l1 j0 D
}+ n e. j' P' s, l
5 T- }' t0 ^1 W/ W2 k8 A if(result == EDMA3_DRV_SOK)+ x( @8 F; m% F3 R
{' n; D" W; p* L. I/ K Q* x) ~1 a7 u
paramSet.srcBIdx = 0;8 K, y% E; ]- ^& D' B4 u* y
paramSet.destBIdx = 1; 6 s$ W! F% M# T* E paramSet.srcCIdx = 0; 7 J+ u4 L! T8 l. F4 b7 T" V paramSet.destCIdx = 0;+ m; [6 b' j7 u6 ^
paramSet.aCnt = PING_PONG_ACNT;# V9 z2 E4 M" f# l* }
paramSet.bCnt = PING_PONG_BCNT; S/ f3 Z6 Y6 `% J- ]4 y
paramSet.cCnt = PING_PONG_CCNT; ( j g& H! O. O1 \. X. J : k% ^+ R7 W6 P( Z' p
/* For AB-synchronized transfers, BCNTRLD is not used. */! q" _; V" g5 Z+ \4 l, U( T
paramSet.bCntReload = PING_PONG_BCNT; * \- M5 @0 m' {4 U, v ( ?+ u1 z8 e: u4 g3 ~4 s /* Src in constant mode Dest in INCR modes */ % N! O f/ f3 h( i5 t8 T7 ` paramSet.opt &= 0xFFFFFFFDu;- A! N1 b5 E" q5 m5 {9 b
//paramSet.opt &= 0xFFFFFFFCu; , B2 t6 [3 ~ _' o 7 v, R& X% Y; a9 n4 l/ C) s3 e /* Program the TCC */ + D; n2 c ?" k9 i paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); ' [: K0 [9 j7 \* {. }* N2 x9 @4 \. |. A
/* Enable Intermediate & Final transfer completion interrupt */. [! ~9 ] m d% E1 L" M
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); 4 m. F: ^- f6 C. b paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); ( K$ U& o& }4 O2 E0 t9 n' U1 F$ ~/ p* p$ H, y; z: y1 |
/* AB Sync Transfer Mode */& e# f; y! O' w! K" U( e! c7 M
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 g/ j4 V2 M) N) Q/ b
' W: `" m- L# c' o /* Program the source and dest addresses for master DMA channel */( o$ p* L( v5 o6 r
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); ' b2 S; t' q9 h2 K9 |) C& h# O n% c paramSet.destAddr = (uint32_t)(ping_buffer); $ T9 z: g. V- j9 P ; M3 s! {8 @* R6 O, Q2 T /* Write to the master DMA channel first. */3 t8 a$ n/ E6 Z; z
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); 3 Y3 u+ X9 F8 U" T% ]" g } ! W' {; G" z. o- S
* U* r+ b O0 }' \+ s7 C5 P result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); 9 S P; ~2 v$ b9 B 8 a+ k5 }# h3 T0 F if(result == EDMA3_DRV_SOK) 2 ]! B" C* B& j0 i# `# j7 }0 B
{ 1 {2 ?$ j( \6 e3 i2 R' q' w print2arm("edma3 driver init success.",0); $ f/ y/ F1 V$ G$ x+ N } ) _7 x/ t( L+ w+ Z- _
} / I% ^ F2 \; ?6 k" P$ S$ O3 t8 {6 R" f1 v, u$ w7 J, d