标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" j; R% B, U* y
#define PING_PONG_ACNT 1 . i; ^% j2 n4 i' K% g+ N#define PING_PONG_BCNT 8*32*40 8 p( ` m. Y" s9 h! m2 G5 |+ a//#define PING_PONG_BCNT 1 7 {) l# J. Y6 N2 P#define PING_PONG_CCNT 19 _+ Z9 H5 w0 j" O! U
#define MCASP_BASEADDR 0x01D00000 ' _9 n, q$ ~. C' Z8 Y#define Mcasp_RXEVENTQUE (0u)( y; f8 z+ ^# F1 p% w
8 S2 N' g# k/ E @' j- j% g/* OPT Field specific defines */1 T3 q% z0 ^4 c" R, |) _
#define OPT_SYNCDIM_SHIFT (0x00000002u) - V% Q7 h2 ]3 f& W- ] D#define OPT_TCC_MASK (0x0003F000u) 7 `! D ]- p2 B# `#define OPT_TCC_SHIFT (0x0000000Cu)9 ^6 L/ |' f" r# k- J
#define OPT_ITCINTEN_SHIFT (0x00000015u)+ ^( U% C/ v/ v W/ S
#define OPT_TCINTEN_SHIFT (0x00000014u) 1 O+ D# c5 ?# a$ G! C/ I, u) t4 G# o0 S2 @9 I; K
char ping_buffer[PING_PONG_BCNT]; 9 A: Q h7 \/ K: f, W6 pchar pong_buffer[PING_PONG_BCNT]; 6 Y2 W: ^8 a8 W4 B# J# ~+ p2 _$ o7 h
& n4 L0 c. ^" r: N 9 i2 {: }; y$ K' j' M" W! Z* ]: ~; y% v % R1 D' \9 V' a6 q1 ~4 @0 l' q' gstatic void ys_edma3_init()8 L+ ?0 V. N. T) H! B0 V! h
{ 0 `( T/ [& Z6 M9 u U% i( D+ k EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- ]) @. a, `4 d1 Q
EDMA3_DRV_Result result = EDMA3_DRV_SOK; # ^7 n& e+ W$ A% n8 u) b0 L EDMA3_DRV_Handle hEdma; 6 m9 f" r5 t' ^# B uint32_t chId = 0; 5 a. v0 Y6 H( V uint32_t tcc = 0; & K& `0 R9 p, p2 X) Z% R: S6 x+ ]
print2arm("edma3 driver init...",0);5 g% K4 [5 W* o1 V# [9 @) u
. P6 U& F# Q" @( V7 n" W
hEdma = edma3init(0,&result); % R& U& L* K* w# L if(hEdma) ) Y! w2 B, r- v6 M6 v! a5 L$ x- n {+ r) G1 x+ r* X H8 \' h- L @
print2arm("edma3init() Passed.",0); 5 g" m$ |$ _9 V }: g1 N9 C; }( e: \8 C6 d% d
else) b" e" `9 M8 ^" E
{ 4 x; [7 k/ P! N# r; s print2arm("edma3init() Failed.",0);& m+ r# y' C5 B" Z1 Q! g1 ?7 X& i' c
} 5 t0 T) a' I0 i; K! u S 9 |+ r+ o4 ~7 V* r& F8 m
if (result == EDMA3_DRV_SOK) 0 k+ z" r4 m) { { & k7 \& p! | s$ e result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,5 q- ] p G. k; m; j
(EDMA3_RM_EventQueue)0, * c. s1 C6 O* z9 t &edma3_isr, NULL);9 C. I; G5 t2 p- N' m
} 2 V, i) t- M. r5 \- v- D3 T5 O5 T ; L1 t) t3 v( J& E if(result == EDMA3_DRV_SOK) , \0 u, X9 l8 |4 r { 5 e- a' ~: s7 S paramSet.srcBIdx = 0; 2 i* v% R! U1 A/ a7 y& H paramSet.destBIdx = 1;6 A8 G/ M( I* q2 a8 }5 P( O& O& ]* {& \
paramSet.srcCIdx = 0;& ?' ^( k4 I# d7 M: z
paramSet.destCIdx = 0;! `% t( C4 [. L% w2 |5 d) L
paramSet.aCnt = PING_PONG_ACNT; - T6 U+ M1 [8 Q9 X paramSet.bCnt = PING_PONG_BCNT;9 z7 Z$ @9 u$ F+ Q3 S
paramSet.cCnt = PING_PONG_CCNT;% v. ^4 B, h8 h* c2 \
5 m! F2 ]/ [2 J! D7 L- |( L( c! z2 S
/* For AB-synchronized transfers, BCNTRLD is not used. */ # c2 F# P+ ~( a6 P paramSet.bCntReload = PING_PONG_BCNT;+ I: q/ X" @. [3 c& w
' ~3 v0 x* s8 w0 a4 R
/* Src in constant mode Dest in INCR modes */& f) ]" D! y. g5 J s
paramSet.opt &= 0xFFFFFFFDu; ) R" G' a* @$ A4 n) z& s D0 i //paramSet.opt &= 0xFFFFFFFCu;9 X7 \; ]- l$ C# B
# t o F* y+ I) z# r" e9 r/ g
/* Program the TCC */ 4 {* c7 l. `3 s. o2 i8 f* x paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); ' e. _: s! D: ~" Y# s# k# p" ^0 l! }6 U' t6 X. L) q" Y" N% q) H
/* Enable Intermediate & Final transfer completion interrupt */. X: A! w2 R5 P, M' b5 t5 i# I
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. x6 f2 s( m- ~7 _2 r- k: b
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 R8 I3 Q9 x5 Z4 H) y ^
4 r2 ?+ @8 ?+ H- b* H /* AB Sync Transfer Mode */ 4 H+ [) x ?! r, s* |" R paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT); & Z, @" B0 S0 t( y. L5 P6 [' z / r6 y. P- F. p9 b# m$ Z* x# h /* Program the source and dest addresses for master DMA channel */ 8 k. h0 X! X! H paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);4 ~* u5 E7 i/ m# X
paramSet.destAddr = (uint32_t)(ping_buffer);; W3 `4 z1 d" ^1 [. g( J
9 p k6 Z; R T1 x1 C+ i
/* Write to the master DMA channel first. */ 8 c9 ?' s6 f; U# k result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); % K' A8 I `+ x$ v& \ } # [! ]" t% x( d
8 P. c- D7 ~+ s) I; f0 p6 A/ o v: c result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); / g! j: G1 s6 V( [ , N1 H1 {' m; m4 T9 w' J if(result == EDMA3_DRV_SOK) . Z4 g& V& ]6 r% G+ t {# v {& Z4 }/ J n N
print2arm("edma3 driver init success.",0); _. M6 v1 ]0 i7 j% Q8 @4 G } 0 e- `6 n5 l6 D3 a}( w5 j5 v+ u. t% U( E
. G) Y& g. E: d5 |/ S. v
) t5 D% T+ A- n5 I8 v( f7 u8 P' _
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 C- p+ S A7 l4 \5 j" t