标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: + h5 A8 h5 J* N# y+ P- V' ^#define PING_PONG_ACNT 1! t4 J+ v& L0 E7 D I% `& O
#define PING_PONG_BCNT 8*32*40 + W/ f/ i( N) Z6 E k//#define PING_PONG_BCNT 1 , v0 n! o' ]5 r5 y$ V: I
#define PING_PONG_CCNT 1 6 X# d/ {/ s) t) ~#define MCASP_BASEADDR 0x01D000005 Y# h7 W2 u3 l
#define Mcasp_RXEVENTQUE (0u)0 f+ c2 m$ p- ]+ O: ?. d
0 ?+ v, D" ]' |; G
/* OPT Field specific defines */ - @3 o; h; e$ ], u( {#define OPT_SYNCDIM_SHIFT (0x00000002u) # q& `, T/ G* g, W2 K#define OPT_TCC_MASK (0x0003F000u) 1 P( i f; o$ u2 Q6 T+ q#define OPT_TCC_SHIFT (0x0000000Cu): h* Z& F( V }3 g0 ]2 \) b; e
#define OPT_ITCINTEN_SHIFT (0x00000015u) % o9 K% H |8 r0 d9 }. Z1 `#define OPT_TCINTEN_SHIFT (0x00000014u)- H0 n/ [! `5 e7 j
, u M3 K: y# w6 ^; `0 ]$ O
char ping_buffer[PING_PONG_BCNT]; , l1 C8 m5 B& H# b( fchar pong_buffer[PING_PONG_BCNT]; / L; L9 F8 A) g& G( \) \ t% n( z$ J2 s! [' |0 j# T . X) Q. C) o, f % v; q# y7 } Z/ {( |: C. K$ @3 y0 J! W! U3 _6 a# N$ T1 _7 I0 j: g
static void ys_edma3_init() - K! `! p+ |# r! `{/ E# v3 [* a' p
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 Y. B, H9 k s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 n) k- v; l: g# c0 \
EDMA3_DRV_Handle hEdma;% P _; N; v4 c0 ]; u
uint32_t chId = 0; : }+ u1 A' |$ l8 R% L& K' h4 o uint32_t tcc = 0;; V$ n$ f& K' E- X
* g! o4 L7 {) u8 W) J4 ~2 f
print2arm("edma3 driver init...",0); ! x) H/ W3 M5 @$ w/ a 4 D, s1 ^9 L& W9 A8 W8 C hEdma = edma3init(0,&result);* i6 y: }, ?# {! q! i: ]9 s
if(hEdma)* X9 I7 U. a: w% T2 i# S" {
{; g" d* o1 j& [) ]; C& Y
print2arm("edma3init() Passed.",0);7 j$ I/ y+ n6 o$ t, c' f+ s
} & D* T7 h0 U" x) o5 G1 c else ' K+ g7 o3 w$ D. W0 Q; w { , J2 Y+ B X# N, `' S print2arm("edma3init() Failed.",0);8 q7 w$ g- [1 a' W$ O
} 1 B' Y1 x: A0 d2 x$ m `$ G # R0 ^4 w9 ~( q# V! h C+ F
if (result == EDMA3_DRV_SOK) + d0 V* z0 I% \$ [" R! d8 L. J( N {$ ~* d! j* R1 t2 u! J6 t( G
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc, 1 ] y% d$ v8 F+ N (EDMA3_RM_EventQueue)0,9 `* @6 v+ O2 \ h: v. O' }
&edma3_isr, NULL); 4 R& W$ y! a; F9 R4 i' p+ Q } 5 u* ?, F6 F& s8 K- H # G* @# V' K7 H0 V1 d `$ D6 q4 G
if(result == EDMA3_DRV_SOK) 4 q E! t$ K! ?3 j7 @ { 6 |9 _( x1 }9 m% o+ t" b( L paramSet.srcBIdx = 0;5 `+ a$ `7 \6 s5 E4 i' \; E
paramSet.destBIdx = 1; $ ]! E2 k0 c3 a& X1 B) B+ K paramSet.srcCIdx = 0;) u$ X% V+ Z: E
paramSet.destCIdx = 0;' M6 K( _( c6 i/ `8 _
paramSet.aCnt = PING_PONG_ACNT;% k2 }/ W |5 H( Q S, A- c# e) W* w
paramSet.bCnt = PING_PONG_BCNT;$ z7 J. X% {8 h" O3 r2 H& Q
paramSet.cCnt = PING_PONG_CCNT; $ u8 [8 P& I$ I* y. l& O- J7 L: f / }8 _* M8 }$ L$ V
/* For AB-synchronized transfers, BCNTRLD is not used. */8 N Q; n w5 J. y, W+ u
paramSet.bCntReload = PING_PONG_BCNT;2 C2 a$ G- N' E+ U
! |7 g8 H4 r: k
/* Src in constant mode Dest in INCR modes */ / z' k5 s) X) J- k$ N paramSet.opt &= 0xFFFFFFFDu; ' x Q; v% ?/ n0 d& F* l //paramSet.opt &= 0xFFFFFFFCu;. v2 x( C, ?" R# U [" v# c
" t9 p* P7 r8 K1 ] /* Program the TCC */ " L! u* w" H- s7 Q paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ D$ E1 r- u/ `5 [
% L5 z. Q8 Y- N0 v
/* Enable Intermediate & Final transfer completion interrupt */ & A& U* M- L# v3 _5 v paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ D* c6 w6 r$ u. t& D+ o4 _
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT); 2 i. L. @0 D- m* ] " w* H. N6 I' K5 Y N/ v6 Q0 E /* AB Sync Transfer Mode */4 V. A* ^$ ? q: C
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* C5 a' b0 e. G$ Q7 G
/ `1 N( Q/ ]8 ^ [6 g8 F/ r /* Program the source and dest addresses for master DMA channel */" C% s) F" i2 x. a" D$ U
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);( i3 W y, T t: R; M. v) W
paramSet.destAddr = (uint32_t)(ping_buffer); . C& e# [* r [ q( g: U l 6 U8 z7 r$ _9 f1 H /* Write to the master DMA channel first. */! j; l7 H% e" |- X" _! P5 e8 f
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);6 R& s. S. g# b* q
} * u7 r" v; o5 _ 3 S5 D% G7 D& V2 i/ F2 U result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 r1 H' x! {1 m/ e
/ W9 u, U7 N: t# b4 h6 Z) ^ if(result == EDMA3_DRV_SOK) 2 X/ T3 a+ {. J* [/ K, N! a' e
{/ O, Z. @2 t% h2 h9 c$ N
print2arm("edma3 driver init success.",0);) g5 G) ~$ X" {/ a0 a3 _" t
} 8 v/ o3 C( ]# b8 I}, h% F% x/ c$ n% ?- U0 {9 T
; U, ^5 w9 c A/ z0 v; g; z
# h+ t. I8 {1 T% Y# L
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。 ; d- \( R$ V% O( J # o1 H6 e: S, W; c2 \ : t, w) ^# w7 a+ N( j, n8 O8 c3 W# u作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25