标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: & K- T3 F8 |1 P2 A! u#define PING_PONG_ACNT 15 e" n2 d$ t3 z. F! p4 n5 ^2 h u! p9 _
#define PING_PONG_BCNT 8*32*40 . f2 i1 T! s) y4 h
//#define PING_PONG_BCNT 1 1 R4 L9 i l- \#define PING_PONG_CCNT 1 ( \9 i/ h& I+ _3 j' k+ B# P. I; Y#define MCASP_BASEADDR 0x01D00000! A n' T4 D7 u' s
#define Mcasp_RXEVENTQUE (0u)/ l9 W0 t4 Z' q5 l
. n/ C" }$ h8 v
/* OPT Field specific defines */ - X2 z7 j1 K, \2 Q' I l9 `8 P" E#define OPT_SYNCDIM_SHIFT (0x00000002u)3 u6 w( @( S/ e4 e9 h+ Z
#define OPT_TCC_MASK (0x0003F000u) + J9 w$ g9 W2 U/ D/ q# c" f#define OPT_TCC_SHIFT (0x0000000Cu)& y+ \9 Y& D8 c9 C2 P/ y
#define OPT_ITCINTEN_SHIFT (0x00000015u)/ c! n9 }7 G8 {. a' P
#define OPT_TCINTEN_SHIFT (0x00000014u) - N5 Y' e# j' p/ h2 I# X, I2 [: k/ D/ }- }* ~7 T9 y
char ping_buffer[PING_PONG_BCNT]; 5 w2 x5 |4 j# n% \, schar pong_buffer[PING_PONG_BCNT];, G* J: {5 J0 M1 ^: y5 k
! o% v, u) K2 N6 n7 s X1 R+ T* r
% M" [* W# W3 ~) s' u
- z# a! C7 o; @
5 G" I K/ h0 J- V7 _
static void ys_edma3_init() E- H" s# D3 c- [3 ^
{ 4 X, W2 b# A& O A0 i: @5 K EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; * E* {& R9 Q4 p; j1 ? EDMA3_DRV_Result result = EDMA3_DRV_SOK;! a, g+ P. ]) K
EDMA3_DRV_Handle hEdma; $ r! \* ]$ W1 y5 A uint32_t chId = 0;8 a$ k; I8 P" I5 Z2 ^8 f2 R
uint32_t tcc = 0; ! w+ L& p$ f) V G8 N* t& I ) p( w# U* y& ] print2arm("edma3 driver init...",0);, n0 r* Y, f9 b" V2 p% y
, i! x3 n3 O, I8 N- w4 ?/ H
hEdma = edma3init(0,&result); $ R2 y8 a% S% w9 i if(hEdma); D/ k% l: G( j* B
{0 P- C% B# r+ k
print2arm("edma3init() Passed.",0); 1 b( }' W Y' l% x% j }. l) f5 C( Y8 X- C7 ^: B
else3 }/ }! h9 b C( E( x" I: ]
{ z) ~( P. b, t4 z( r5 L print2arm("edma3init() Failed.",0);/ p( X: I" e* B1 l
} ' y5 Z! E. J& k4 j2 f$ q# g / s) o& N# Y0 r# p+ h" c if (result == EDMA3_DRV_SOK)- W- j% o8 i) z! u" k; G5 K, |
{: _9 I+ z. W+ O& E) G6 R" S; \; d
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, 5 I5 P' B! q* u) P+ L1 b (EDMA3_RM_EventQueue)0, $ V0 e' N3 H4 T8 v; K( ` &edma3_isr, NULL);( z3 y% d/ L; B q" T3 L
} & } g2 x( q" i8 E8 m0 t: S' L 8 N* ?& H- D+ F3 W! h' x
if(result == EDMA3_DRV_SOK) ) \2 ?% d- i: u* {1 m { - P# K4 A. N9 |3 P" A9 C, E paramSet.srcBIdx = 0; 1 Q$ l" {( T9 { paramSet.destBIdx = 1;5 J4 v1 }' G9 l5 Q6 b
paramSet.srcCIdx = 0; ' N$ n- ^1 E: r paramSet.destCIdx = 0; ! d7 b: y' P" Q8 i% q paramSet.aCnt = PING_PONG_ACNT;3 y. w2 g# G! d
paramSet.bCnt = PING_PONG_BCNT; + [, `; P4 F) m paramSet.cCnt = PING_PONG_CCNT;/ ^- L) ~7 K! }% k2 X
, z- O* z( Y! X+ M' x
/* For AB-synchronized transfers, BCNTRLD is not used. */. Y5 _8 l) h/ h4 _, @1 A
paramSet.bCntReload = PING_PONG_BCNT; ; E7 S4 x6 f5 r4 U* m' f* d( T/ n0 ]9 j
/* Src in constant mode Dest in INCR modes */ * x8 D( e% P: K$ ]$ E3 @ paramSet.opt &= 0xFFFFFFFDu;( }% y- w" u: o% \+ q# n r
//paramSet.opt &= 0xFFFFFFFCu;5 h9 m! w7 s. Q' C; A- R
/ Q9 A& l$ C- n. h5 W: e2 T
/* Program the TCC */ & A# V' y4 R5 y paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 m- `' l! S( [( P& i4 P, k6 ~
Z3 v6 n3 e2 Q3 d8 {0 I
/* Enable Intermediate & Final transfer completion interrupt */0 Y- ^1 g7 w( g/ ^: Y
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); ( R+ d' p0 J1 b( F0 r4 f/ E; t paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);5 T# P5 F% {* x/ D. ~; a' C- W
P E7 W) e0 `2 k /* AB Sync Transfer Mode */ * a p8 L, @& j: p4 J paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 G" u0 i. |2 s7 ^7 _
. f; H! J( Y X( g( ^, @, I
/* Program the source and dest addresses for master DMA channel */. v5 z9 Q& U: y4 c$ x! @" ~( O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);/ _3 c" E, c1 N- k
paramSet.destAddr = (uint32_t)(ping_buffer);0 r# o7 c1 }& W) L3 d
9 b0 T. s$ Q7 i4 I, B
/* Write to the master DMA channel first. */ 3 _; k6 Q7 G! T! q# \/ c result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);" ~5 B4 R/ y- x: J2 R) u2 g
} 1 S7 B: \+ w6 K- r ]( k5 [( h
1 _6 }$ S/ [- V/ r+ D8 a- a result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 \9 }4 f" x- Y
' `- U# a) w. j" K6 @8 e if(result == EDMA3_DRV_SOK) 0 [( s0 h j( B% R9 c4 Q" Z
{ ! t' B' u# G" u0 a& A) ^8 w; M print2arm("edma3 driver init success.",0);9 }- \' x* x- _9 S: Y
} 0 U r) l/ R3 n# ^+ f" v. v}8 t# d. {) |( h