标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:$ A# @7 O! s, O, N" }6 U
#define PING_PONG_ACNT 1& I* o; i: S4 A3 ?- J
#define PING_PONG_BCNT 8*32*40 2 P* \! A) P2 G0 g c! F" ~- n//#define PING_PONG_BCNT 1 8 c/ l. j; X6 H* S2 r7 \% T# A, x' @8 Y#define PING_PONG_CCNT 1 3 O. f7 E6 s M$ `3 d& a#define MCASP_BASEADDR 0x01D00000* Q9 c$ J) _- c
#define Mcasp_RXEVENTQUE (0u)# N+ v. N4 V6 {! H" |& i) c/ `+ @
! j- |5 X( Z4 _; b1 u
/* OPT Field specific defines */8 \) P; {' [; e
#define OPT_SYNCDIM_SHIFT (0x00000002u): ]( q, u% t- `- g
#define OPT_TCC_MASK (0x0003F000u)' v, j2 K: D) J
#define OPT_TCC_SHIFT (0x0000000Cu) . ]( u" U; } M+ E% g* L" b( v#define OPT_ITCINTEN_SHIFT (0x00000015u) . J+ q8 T8 C* f7 R9 O. p7 h#define OPT_TCINTEN_SHIFT (0x00000014u) 8 T; T2 d$ V+ N7 W3 U! p1 i$ J+ e/ H5 P- {+ ?% |# l& c
char ping_buffer[PING_PONG_BCNT]; 1 T+ E7 N1 l5 v" Hchar pong_buffer[PING_PONG_BCNT];; `1 D2 }, e! d+ p
, D( ?* n& h- t. M% V: r 3 W2 F% M. V& J0 s# p& j; R9 T $ w, ?, _7 b; {+ }$ }+ r0 z % h5 \1 C1 q+ d7 \! J% R+ Hstatic void ys_edma3_init() ' F: F1 `1 Z% a. G+ w$ @4 l{ : c; U$ T- ]4 e EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};6 h/ ^9 d5 Q$ y5 U8 U
EDMA3_DRV_Result result = EDMA3_DRV_SOK; 7 m# D7 y! }% p$ W, S9 z EDMA3_DRV_Handle hEdma;( g; E' g, S8 P. P, |5 l
uint32_t chId = 0; J V6 I3 B. ]6 d `5 U
uint32_t tcc = 0;* T# Z2 X% Y/ E5 Q% L
' M; ^' x/ Z: I0 ~0 }
print2arm("edma3 driver init...",0); 5 v( h6 E7 B3 N) F5 P: a6 u, F' j- X
hEdma = edma3init(0,&result); 0 h* n% L+ @- g$ h1 `6 v if(hEdma) 5 g9 F; {5 }5 }, t! C T' u { 0 f! q4 A) v; J1 k% x1 t print2arm("edma3init() Passed.",0);+ L+ u7 C& }; P; v5 D8 x y
} ( L2 b C: y7 w- `4 C. c( g else$ ]; R8 {0 L' m+ y$ s/ P0 u
{ 5 [$ a& B" w; G F8 } print2arm("edma3init() Failed.",0);7 k/ V4 a4 f% D; I
}0 d, s# M# |2 l% S2 L. O3 H
- H- P1 B2 c2 y& T# Y6 Q if (result == EDMA3_DRV_SOK), x# N" o$ P/ {7 h( x1 ~: o, I
{ # x' G4 K0 j1 }6 X: T result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," r, e* q1 s0 I& E- g
(EDMA3_RM_EventQueue)0, . o% l( `+ _8 d &edma3_isr, NULL);1 D1 G; U0 e: G$ k; l9 B3 \
} 5 F7 C/ a. u, C3 c: @1 i" p, ~ ! P9 I& N- W5 h7 w. Y( b4 Q' O if(result == EDMA3_DRV_SOK)5 C! m3 \/ g, q( n& m
{: ~" n0 }; u& `0 B0 X8 L1 J
paramSet.srcBIdx = 0; 6 J' `' @! h9 W, n4 i. R) o paramSet.destBIdx = 1;" I5 P$ |0 ?: M' |
paramSet.srcCIdx = 0;( }/ ~, D# h2 q1 I% ?2 L3 p+ b
paramSet.destCIdx = 0;* P" v% g9 H b& [
paramSet.aCnt = PING_PONG_ACNT; - E, J/ p. m; { paramSet.bCnt = PING_PONG_BCNT; + u: E/ x( @- \ paramSet.cCnt = PING_PONG_CCNT;2 V& y* w* N c2 I" S; }
) D! E0 u9 T' s ^* U7 K/ h /* For AB-synchronized transfers, BCNTRLD is not used. */$ g& H" E4 _1 G2 J7 g3 e: u
paramSet.bCntReload = PING_PONG_BCNT;+ j, j1 ^9 m) z
: i; _) C6 [2 Z; ^- `8 x9 r3 G6 m /* Src in constant mode Dest in INCR modes */) k5 r) D- L/ _3 Z+ P9 M! N1 d
paramSet.opt &= 0xFFFFFFFDu; , g! |6 | C3 M/ J8 M8 x //paramSet.opt &= 0xFFFFFFFCu;9 x9 V5 @! T8 Z& b8 m0 c5 a
& `% `0 i+ R6 ]* i- Z Y# Y( f /* Program the TCC */ ' s) J# `1 I6 b5 w paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. ?$ Z3 Z6 n( y" D+ ^% E
: f9 e/ ]* e' H& O4 P /* Enable Intermediate & Final transfer completion interrupt */ 7 l& ^/ @. ^: o paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! |5 |- s1 q3 {$ R7 k k
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- n7 l4 D6 _% n9 p. c- J
* i/ i; |, {- n$ \9 c" Y. a /* AB Sync Transfer Mode */ - v* z+ b# u, `9 u! X" _ paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 t: }1 T$ g, @) r. S) d
& ~$ J! [ E8 w2 i ? /* Program the source and dest addresses for master DMA channel */ 5 h) j. N" w; f* o" O paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); # Q: w S# \; U7 X4 v. g3 ` paramSet.destAddr = (uint32_t)(ping_buffer); " ^4 L/ w- R3 o% ^% ]7 T( d7 W% F- h+ J: W& W
/* Write to the master DMA channel first. */! C$ @6 h* o0 h: Z/ m4 N; j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);- W9 b, I( ]; ]6 s
} 5 w: B( Q! p8 }. s: f/ ^
. o# V. @3 B5 V+ G8 @% T+ O result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT); * C8 `: }, Q8 G( p8 } - R4 i5 j) y2 C* |% x if(result == EDMA3_DRV_SOK) ) V$ U, I/ I3 W: G
{ $ w( ]$ |% n; J" k print2arm("edma3 driver init success.",0); ; F. F2 T: C, v2 v } ; N+ ]% C# c! x9 F- b2 N. c
} 4 E& }' R3 P- A$ {% W3 ~# L2 T' G. Q: P- d: |. t& w; I
" [8 j% h3 Q4 e/ _- E7 v( I0 a' IEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 : p, d' F8 @8 g* @1 u, p9 D" y8 O8 Q/ X' R' ^0 p$ ^8 T
! p- C; }, Z3 o. _3 j3 v8 M 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25