标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: " t" ?) g+ _, n#define PING_PONG_ACNT 1 + a8 z8 E, E4 x#define PING_PONG_BCNT 8*32*40 / m2 V0 a+ o: k h
//#define PING_PONG_BCNT 1 ) {6 {# w% P5 y, w
#define PING_PONG_CCNT 1 1 N3 C' a8 [4 m- H- J. ?, Q4 ]#define MCASP_BASEADDR 0x01D00000 ) j3 h8 m. p& o z" f#define Mcasp_RXEVENTQUE (0u) 6 L# d' E, R ]3 X0 |- E$ t" e & P) S, D5 o) L/* OPT Field specific defines */8 H; L: Q& A7 n) i7 c) S6 O- ?! m
#define OPT_SYNCDIM_SHIFT (0x00000002u)- }- V1 `7 U$ p
#define OPT_TCC_MASK (0x0003F000u) 7 b; t- P9 X3 Q$ ]1 S" D#define OPT_TCC_SHIFT (0x0000000Cu)0 v+ z7 d7 z7 R) D" C, Y. i' w
#define OPT_ITCINTEN_SHIFT (0x00000015u) # M% m' g/ j5 V0 Q/ `! x3 A#define OPT_TCINTEN_SHIFT (0x00000014u) % {) u9 {" P5 `$ U* ~7 M9 J: g9 @7 R* |( R2 w4 b0 ?
char ping_buffer[PING_PONG_BCNT];9 [1 T% z5 ]4 `1 i* y
char pong_buffer[PING_PONG_BCNT]; ! P* x( ~% R! g* s, R0 l% i5 P0 s4 G+ r$ p) t9 }
) K) v; {0 A* L, X& j c7 R+ ^; N: _ i( {% Y. k9 T( t1 e) b/ O) k, R+ V# X
static void ys_edma3_init()' O6 h: D! o$ k$ X
{: ~. P- N! q1 b u/ S& j, A/ t; A" V
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 x; _2 }/ u s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;' J& i' Z, Z, K' N
EDMA3_DRV_Handle hEdma;& m3 T3 D! s" W x! j( n. |1 s
uint32_t chId = 0; % u! l7 @1 `+ A- ~5 f) V9 _ uint32_t tcc = 0;4 J9 `9 u" ]$ \( O+ x- x; T) ~ _
, _& {5 B! H: ~! T. v print2arm("edma3 driver init...",0);2 x2 g4 r7 O( \: G
6 ~9 X1 C- a; e% m% m8 l% m J hEdma = edma3init(0,&result); 2 `# y9 _0 }+ B% F! H, c if(hEdma) ! ~2 ?. b7 u- \) e, [6 J6 m {* g) F' L& X0 V# F; ?1 w
print2arm("edma3init() Passed.",0); ! O* y/ E" ?6 J } 5 ?8 A( F P Q5 I else / P+ D4 f2 \5 f% J' F { : ~" j% o& C4 P$ c print2arm("edma3init() Failed.",0); 4 p5 D: R3 Z W } 7 u$ n3 I0 R: d# g 5 [: a0 t. n% J) F, i; }* P1 i if (result == EDMA3_DRV_SOK)' {% w1 q- D* a S5 D
{+ q+ m' R+ d; b l% ]
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. W2 r: Q( _" @) a( D3 T r1 Z
(EDMA3_RM_EventQueue)0,4 C" p5 J t+ P ~2 A- h: y
&edma3_isr, NULL); % {5 q6 B. \$ f7 j2 H$ K6 g } 4 n( c! Q+ m9 n6 }. L5 h4 w+ m % p7 E0 S* [1 n4 [0 d+ l if(result == EDMA3_DRV_SOK) 3 N/ ^. b% |0 L' N5 X) ` m { ) G! s: R* N) V paramSet.srcBIdx = 0; 9 g \" c+ K, E' F9 p paramSet.destBIdx = 1; 6 x) l* E4 W) C, N! I paramSet.srcCIdx = 0; i/ X4 H1 i" Y5 L3 T paramSet.destCIdx = 0;3 d& ?5 s+ N* @5 O
paramSet.aCnt = PING_PONG_ACNT; " b% n; Y) C$ d( i; p/ }5 l! Y7 J paramSet.bCnt = PING_PONG_BCNT;7 d* \1 _8 i. Y8 |* U
paramSet.cCnt = PING_PONG_CCNT;( X5 y) V1 M8 f, s% G/ v
. M' q, H/ m# H" b% W /* For AB-synchronized transfers, BCNTRLD is not used. */7 g/ b$ T. s) A0 T3 }# R% a; w2 P- v9 h" }
paramSet.bCntReload = PING_PONG_BCNT;2 y. {8 R1 ~; w- J) l* d- |) }
3 @6 U% E. J8 j2 O# X2 r /* Src in constant mode Dest in INCR modes */ 7 J, }/ T |! x+ O' V paramSet.opt &= 0xFFFFFFFDu;, S* ` b; ]# M3 B
//paramSet.opt &= 0xFFFFFFFCu;( h5 q& U' V0 ~7 b2 `2 o8 x
+ u d4 [, d0 I8 S /* Program the TCC */6 T7 c% y+ X+ a7 p0 c
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK); 1 d1 r$ X5 o ? 4 X) ^7 e! G( y5 \" H* V /* Enable Intermediate & Final transfer completion interrupt */) d) |0 M& x! _( R/ D5 g, E- O4 Z) Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT); : D/ z9 q! u8 e3 }. q, z paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); ; O0 G/ A' x# q9 \! n! X2 q `, T0 {( G, [% ^, I' Y
/* AB Sync Transfer Mode */3 P$ s* ]; J$ z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& a0 ?) C4 g$ W- `3 J
5 r" c7 ]1 g/ V$ I
/* Program the source and dest addresses for master DMA channel */0 Q/ {1 ^% [+ S5 Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); ( {# v# C* [& C1 m M, n7 F paramSet.destAddr = (uint32_t)(ping_buffer);1 B, ~2 z) m" l$ Z) W/ V
$ k8 U0 ?$ ?) G5 r& z
/* Write to the master DMA channel first. */+ a0 Q" M1 d. e; l6 X; P
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- G7 E: ^8 W. f8 p- `$ d* j
} ! I. d, |' f% g( {* |, ^% S% L; }! ~# n
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); : t w: X9 u% `/ r6 `& b( ` % c! l1 l2 p* {- p5 E2 p
if(result == EDMA3_DRV_SOK) R8 K5 `* |& G# }
{' h0 ]5 l! E$ b7 c
print2arm("edma3 driver init success.",0);0 f. [9 {" T6 c1 C* m7 b) F: U0 _
} ( N e& y4 k! _# }& ?1 M4 ?9 K% _
} 7 n7 C7 `& ]1 z/ m3 F$ @7 k ) B) _- Q) M9 x2 F- [1 t( [ ) ^) T. b8 \% {' ]* s7 n- `EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 6 h# e1 r# |8 S0 l$ {! x + h5 V% j: Z% w" d2 G. V) H+ C1 ]( X$ j8 n8 d0 H 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25