标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: a2 H. b& a9 n/ k
#define PING_PONG_ACNT 1: j$ I; e8 r# f
#define PING_PONG_BCNT 8*32*40 2 c2 F5 F. d$ y* y//#define PING_PONG_BCNT 1 4 c2 Y0 o- |; ~6 `$ Y! w#define PING_PONG_CCNT 1/ t, ~$ G( f* ^' W
#define MCASP_BASEADDR 0x01D000003 `2 Q- {6 C) q( p y3 l; {+ T2 b; d
#define Mcasp_RXEVENTQUE (0u) ( A, R9 w2 s" @0 [! O/ U1 ?4 b8 |4 c
/* OPT Field specific defines */ 3 R, H0 d/ b; a#define OPT_SYNCDIM_SHIFT (0x00000002u) ( p$ D! y: _- C4 \3 y. C#define OPT_TCC_MASK (0x0003F000u)* }( o" b0 W, I7 i: V: y) q; p& {
#define OPT_TCC_SHIFT (0x0000000Cu) 7 n' ], ~0 X4 f5 X2 q# Z#define OPT_ITCINTEN_SHIFT (0x00000015u)5 Y' @3 J" O( K% |5 u" a2 `8 ?# S
#define OPT_TCINTEN_SHIFT (0x00000014u) 9 [4 ^1 o1 |# c: P$ x; m# i9 Z" Y 0 ?9 H& o& e4 u: C ?7 rchar ping_buffer[PING_PONG_BCNT];2 A6 _& g- _% R: X* a2 A8 x2 q% m
char pong_buffer[PING_PONG_BCNT];3 f- g# w! \2 D
$ G( B; E+ w v9 H+ A$ s5 z/ \5 Y6 J4 w1 f
5 {- _3 j) b' p I8 D: R3 C( j$ _static void ys_edma3_init() {, u, M2 a d2 e5 b* \6 e6 b6 D{ : }) [* W c' ?4 \ EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' K) ~1 [: B: E: N+ I
EDMA3_DRV_Result result = EDMA3_DRV_SOK;. R0 @/ m! u# F6 n( g n5 l
EDMA3_DRV_Handle hEdma;- U, D" v8 V( }- W; ?! {/ J
uint32_t chId = 0;' e: i6 k: P( _
uint32_t tcc = 0;4 [* `4 a+ C" j# n/ l8 A" O5 O
6 \- c$ Y# Z3 ^ print2arm("edma3 driver init...",0); - t1 K" w! C; B6 P7 L8 x 3 m7 [4 G% i* s E9 R3 @' `+ w, _ hEdma = edma3init(0,&result);' O1 O2 ?% |$ Y! R6 q6 Q
if(hEdma) / I& ~# r7 C, Z" w { 7 p" W4 R/ a5 L/ |0 a4 ~/ v( ` print2arm("edma3init() Passed.",0); ; C0 |3 H* ^' U# r2 q }0 u! A7 R5 N0 ~9 h' v8 M! i
else% I5 ^( A! d& s( @
{ ) K; G& N9 X5 e9 l7 i7 [5 \ print2arm("edma3init() Failed.",0); % @5 i4 y% ]* I2 \$ W/ `! Z$ E }4 J9 g/ ~ k3 f( w1 B/ n2 j7 B
. l; U: V7 o9 q e/ h: G) \
if (result == EDMA3_DRV_SOK)" z+ w1 `9 Y- q
{ V& R z: }/ h4 S4 E5 W7 i9 l result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! H' F* c0 M" ]# t: v* E' F* I
(EDMA3_RM_EventQueue)0,0 c4 u' I4 K8 V3 o+ y
&edma3_isr, NULL); - X! O7 d& n" O! p( ` A% V } 3 ^4 a) s0 ^3 Q: O; z - t9 _- f- i' | s- x- K
if(result == EDMA3_DRV_SOK) 7 v$ M, T: u4 b' W) [" x& u# _" N& K { $ v' Y$ i1 h$ S6 Q paramSet.srcBIdx = 0;# i7 ]' t( y8 x' o
paramSet.destBIdx = 1; " m" @/ E* ?) H* {# W paramSet.srcCIdx = 0;& W/ T% m9 w, N+ d/ B
paramSet.destCIdx = 0;: Z) ~- C. |" [* j/ B- }& B
paramSet.aCnt = PING_PONG_ACNT; 4 }; ]$ f# e+ p; \ paramSet.bCnt = PING_PONG_BCNT; 2 {, s& h* C& v, N# D$ C paramSet.cCnt = PING_PONG_CCNT; : ^- Z' c! |1 P ( t7 t6 C4 f/ t. A& D, \3 M /* For AB-synchronized transfers, BCNTRLD is not used. */5 u, Q' w W# z0 `7 ]3 A
paramSet.bCntReload = PING_PONG_BCNT; 0 h# L( q1 A" X z" ?% } a2 N5 @3 @: ]0 s# i6 @
/* Src in constant mode Dest in INCR modes */0 u3 ?# a- }* l. _8 D
paramSet.opt &= 0xFFFFFFFDu; 0 r" Y3 v- l+ A/ ~4 _, e" Z6 o //paramSet.opt &= 0xFFFFFFFCu; : [8 Y- E. G( v0 | # Q2 @+ |' A7 E5 U0 ?, r2 _9 L4 S" q
/* Program the TCC */ $ F g V/ Z( N3 `, @- b" n paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 p7 O3 w0 k0 c4 w
3 r. P/ J% y7 @1 f w2 o
/* Enable Intermediate & Final transfer completion interrupt */4 t' r9 E( j' |7 Q* a7 b2 T
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' f! F1 n3 p% J) Q& v# z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); / f6 @4 o1 v- Z; n ! V8 L+ U# G4 @/ g7 Y /* AB Sync Transfer Mode */8 L* y: U2 R3 J1 @3 i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 ~% @0 r9 E# t3 V! s. v
# ]- ]2 [' d+ U7 e8 I
/* Program the source and dest addresses for master DMA channel */; S- p9 E, d" y& `$ r* d, ?
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);) p" N- G% Q7 K: L8 \
paramSet.destAddr = (uint32_t)(ping_buffer); - v) c* d. [+ C3 U; L& i6 s5 A 8 q1 R i4 Z4 R: x) ? /* Write to the master DMA channel first. */ 4 j& d( F* X5 @' u9 q. B; Y result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); . _& W2 f# F( N6 y: r0 ]' E } ( t3 Q; X& y8 b( p+ b4 g& l: ?) d+ a4 H; f- x' z% K) u$ `! e& y
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);' \- a1 m+ ?# ] c
1 ]( g, r% w# X9 `' e7 Q
if(result == EDMA3_DRV_SOK) / A6 c4 b b4 B5 v F
{# \$ X" ]. ]: c6 y2 M
print2arm("edma3 driver init success.",0);5 E {9 ^5 |2 Z& l" u1 i
} # U/ t& s) j0 X6 T* l1 |
} 2 H) c7 C5 w# |7 F' ?; g4 r, _ f9 e# k" y+ ?9 M% Z5 }
$ r/ z( Y5 ^) z% f, hEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 I1 N0 W9 t0 y. H* p6 P
) q& p M2 n+ K
% v3 A' f/ O, x9 {2 G 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25