标题: edma3中断只能进去一次 [打印本页] 作者: silent123 时间: 2015-4-22 22:01 标题: edma3中断只能进去一次 使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下: ! P _2 X) K) p/ v6 S#define PING_PONG_ACNT 1 - }. E4 _ Y: j/ }8 c1 e#define PING_PONG_BCNT 8*32*40 * L$ } x+ q$ Q4 @7 f' T/ `//#define PING_PONG_BCNT 1 * F1 N5 z/ ~* i3 a( u+ @: C) I# d7 L
#define PING_PONG_CCNT 1 / o: _. g1 N: [' {9 Y; g; g#define MCASP_BASEADDR 0x01D00000 & G) |" u6 {! j) N#define Mcasp_RXEVENTQUE (0u) 0 A- K; i5 ?: F$ L. b! N' A/ M5 d1 E
/* OPT Field specific defines */& J; ]8 x/ V' Z% Z
#define OPT_SYNCDIM_SHIFT (0x00000002u)( `7 m0 M9 Y: j2 ~
#define OPT_TCC_MASK (0x0003F000u); K% d. |, B% a# v2 R$ g; V3 v
#define OPT_TCC_SHIFT (0x0000000Cu) " F) E3 f% t7 v/ ~- D% P, F& `9 O#define OPT_ITCINTEN_SHIFT (0x00000015u) X7 r( E* F# R
#define OPT_TCINTEN_SHIFT (0x00000014u)* l4 C3 n; o( k4 w
6 k/ F3 Z* a$ c$ B i$ {6 ^5 ^& @; o
char ping_buffer[PING_PONG_BCNT]; 1 @4 z6 N4 H9 u, |( @6 n. nchar pong_buffer[PING_PONG_BCNT]; + @, f3 w) e2 T8 `; X( n6 l # p7 ^' Q" Q1 v O4 W" `4 @9 M% @) |4 Y$ c
- [6 Y3 @' c$ X" U* q8 ~2 H. z Q
+ I! b5 e9 @( H9 }! N
static void ys_edma3_init()* f; [6 y' T2 \/ H/ ?! a
{ 6 U7 Y' q7 w% O- p: L: Z0 k EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0}; 6 p0 X) P7 [: V3 q( b EDMA3_DRV_Result result = EDMA3_DRV_SOK; + w' y( K3 g" H" D, t1 T EDMA3_DRV_Handle hEdma; 0 i4 o! E' g2 x! f uint32_t chId = 0;' N1 d2 `( o5 B) x) g
uint32_t tcc = 0;( Q6 a: F) F/ Q, h
& U1 e$ { u- D6 p
print2arm("edma3 driver init...",0); ! @0 ?6 c! D" H2 g/ @0 e2 a0 }* Q; t* ?6 Z8 A
hEdma = edma3init(0,&result);) n) `0 W/ \, V( Y
if(hEdma)1 [8 g7 E! {6 x% w, ~0 B0 n
{ ' X" z* v+ P5 |3 T% a print2arm("edma3init() Passed.",0);. I, u/ g) R0 s# M
} . b8 S# [; Q& U$ ] else . N& A0 V: ~/ L- Y4 V6 f) @ {* W4 [' ^9 }$ c& @! D. u) V+ g
print2arm("edma3init() Failed.",0); 3 s2 v7 b0 p( D% [4 G } * q' j' ?9 S" m0 q1 j ) `$ A& @$ O" N- H
if (result == EDMA3_DRV_SOK) 8 t5 r4 M4 @5 \- f9 B { 4 T$ x$ g k" J7 g' K result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,* C# V6 J+ ~: `
(EDMA3_RM_EventQueue)0,0 ?% A, C6 w5 Y# @
&edma3_isr, NULL); % L) {. Q7 t. Q) e% L1 Q6 `+ ] } : V5 _1 ?8 U6 o / [' W1 M% m4 {6 a& K if(result == EDMA3_DRV_SOK)9 k6 ] _* a8 A: X) Q/ b
{ ( @# g5 n1 W( m8 A7 d paramSet.srcBIdx = 0; " s( J+ R% K6 A3 P paramSet.destBIdx = 1;8 Q- u$ w' E# q; E) R ?
paramSet.srcCIdx = 0;7 B W3 j) v8 }' J* v
paramSet.destCIdx = 0; 2 B2 d6 [9 R( l+ L paramSet.aCnt = PING_PONG_ACNT;! D8 z, }( m; d% N t# V' b9 M
paramSet.bCnt = PING_PONG_BCNT;, q" b* c7 s/ M$ d$ ?9 y
paramSet.cCnt = PING_PONG_CCNT; F% y) J; o/ V, i9 ^
+ t9 K+ A. A; ^& T u- B /* For AB-synchronized transfers, BCNTRLD is not used. */. W9 @7 ?2 f" K( u, X5 f
paramSet.bCntReload = PING_PONG_BCNT; + @% [6 i2 _ a T+ r3 a 7 z/ t; U3 j3 c' l) F; b /* Src in constant mode Dest in INCR modes */ * I! n! p0 r- Z% f paramSet.opt &= 0xFFFFFFFDu;+ w$ K( Y% \1 K; o% w$ L
//paramSet.opt &= 0xFFFFFFFCu;- V, o j: t/ B# v }
$ g- T4 ^0 i$ l6 u* S( s( W; `( B /* Program the TCC */. O$ A1 K7 @& N/ f% e" x5 E+ ^
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);7 L t0 G" M/ G I: o- h+ y
. l' r% P9 P* `9 T0 c
/* Enable Intermediate & Final transfer completion interrupt */7 c0 ?* G, k, k* w% F
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ ?& @' }! u/ y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 A# f" [/ u8 W
$ {0 s8 y8 i; |, u, J /* AB Sync Transfer Mode */+ p6 n- W& J8 R f+ l
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' V; L( P' ~# Q" |( a' Y4 Y
. S! [3 `- p8 X% J; ?/ k" U /* Program the source and dest addresses for master DMA channel */ , q, h, Y4 N& `0 I% l# w; G0 F paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C); 2 Z% m# Y7 u* Y" D8 s paramSet.destAddr = (uint32_t)(ping_buffer);6 T5 y' ~; L) E9 A* X; o" x
# l" M3 o6 I% R* o( j N
/* Write to the master DMA channel first. */- `( |' B) z% d0 J: {: o% i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet); - b* v* M& K$ q/ ? } 5 y& Y1 N: R2 j# Y' G# c* O
! n g8 e* k$ ~ E9 ~* g7 I: [
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ ^. m. g( D: } w1 R6 s* Z: ?# q
" ^% g/ f+ | N, N( r if(result == EDMA3_DRV_SOK) # O3 B& j% T# Z2 r! V. \8 y* v {% p/ w4 ^2 y) `) d9 R
print2arm("edma3 driver init success.",0); # [! }( b1 ?. _: ~* N* H, _ } ' A) a# B5 M8 q% [0 k' d9 [
} + [2 C' P% L2 ^+ L8 c+ Q* o, i9 r1 w* q
3 Z7 s* j ^ R4 N% y; k
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' f! @! i" O& g# E9 x
" Y2 {/ o, B7 R$ d' S5 G
' O- E! C/ y9 g( ~& a6 e* D 作者: Lewis 时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输作者: silent123 时间: 2015-4-29 23:25