嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! U1 L9 f4 e) E9 j
#define PING_PONG_ACNT 1
: a. [, E1 w$ V% {2 J: ^
#define PING_PONG_BCNT 8*32*40
$ s, o& J9 v$ v0 s& c% M( m
//#define PING_PONG_BCNT 1
# u' G0 k/ b; D) [3 A6 D F, V
#define PING_PONG_CCNT 1
; Y: a4 B/ Y9 F2 d+ e% z
#define MCASP_BASEADDR 0x01D00000
1 m9 ^( N6 O4 `$ D
#define Mcasp_RXEVENTQUE (0u)
9 N* A" ?2 u. m* m0 v8 h: z* z
- L( Q9 _) W+ r/ A1 @
/* OPT Field specific defines */
9 n9 J- N/ g$ \- k& P: |0 ]
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 e# _8 ~+ o9 M
#define OPT_TCC_MASK (0x0003F000u)
- j+ G9 v7 c/ Q; ^0 N
#define OPT_TCC_SHIFT (0x0000000Cu)
) c+ Z; r+ w1 d! p
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 {+ d6 x5 r+ r; u: \7 l
#define OPT_TCINTEN_SHIFT (0x00000014u)
) `1 F$ N4 T: O( a
0 }$ V% G h& Y8 s1 [
char ping_buffer[PING_PONG_BCNT];
- D8 m) b+ s: r. J! P f
char pong_buffer[PING_PONG_BCNT];
) I9 V c$ l% D% X5 {3 m* c7 Q/ Z
) n8 n2 U3 X, k8 S
$ E. \; f) Y6 ?9 @& a6 g
* c( R( N* N' j" K& G! ?
5 N$ |1 {# u, V9 E0 A' k2 W
static void ys_edma3_init()
( ?& x1 Q2 }6 h/ e
{
- U2 I: s D; S8 |" j6 r% a3 E" g
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# x0 `* J' g, K' W4 w! o- S
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ M' z* @1 o6 s8 _
EDMA3_DRV_Handle hEdma;
: x4 O( i ~% }4 c7 V
uint32_t chId = 0;
, n, q( F6 @5 s: \- s
uint32_t tcc = 0;
0 \) M9 V u o- y( q
/ }9 ?& m0 [& _7 ~
print2arm("edma3 driver init...",0);
/ u/ ^& J2 H0 U) [6 J( R
) U3 F5 o& I+ V2 G$ o
hEdma = edma3init(0,&result);
2 D# \ O' C% t* F! r
if(hEdma)
" G/ L& |3 I0 `* `4 I3 [: d
{
. Q; ]6 ^4 O6 q: t9 p2 B |7 }
print2arm("edma3init() Passed.",0);
2 l8 J% |- ?7 o8 e9 t1 F2 A- X
}
/ f" J* G6 y2 q
else
- T( \7 ?0 s6 p$ d
{
E" u. S" `- h
print2arm("edma3init() Failed.",0);
9 h6 u) @3 }7 E; z2 s( Q3 C
}
! K9 g" o& m9 l6 D( s/ D# F4 L
! G* j6 z- E1 O7 {4 V3 U
if (result == EDMA3_DRV_SOK)
' ^9 }9 c1 t2 Q2 X) k
{
4 W& C4 K/ T1 P! i/ N' g
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: _" V3 q1 Z% G; [
(EDMA3_RM_EventQueue)0,
, d+ H! }- u# I! G$ N
&edma3_isr, NULL);
1 A9 C$ T' W: v3 D+ ?
}
, s6 t, T4 Y4 z( X0 f4 G) B% `+ c' E
$ C1 q" p. A# y" m1 V/ n$ Z, L
if(result == EDMA3_DRV_SOK)
y& [, x; c/ ^) Z. Z9 e
{
) Q" _ \7 x$ A' ?9 x; h7 a
paramSet.srcBIdx = 0;
) W5 u3 O: P# ?; k1 l6 |( [
paramSet.destBIdx = 1;
& r. L' n. M) J8 j: t! h
paramSet.srcCIdx = 0;
9 e* N+ {3 H8 q! H5 Y1 g
paramSet.destCIdx = 0;
' X4 Q: R4 p, y7 w. s0 \) g7 x( y
paramSet.aCnt = PING_PONG_ACNT;
( } H3 Q. O+ p0 W( J0 W2 D7 o3 e, E
paramSet.bCnt = PING_PONG_BCNT;
# p! D! q G' x. O7 l
paramSet.cCnt = PING_PONG_CCNT;
1 o2 D) z8 G# g" v
! p1 O, f' Q- N% M; ?5 K: O
/* For AB-synchronized transfers, BCNTRLD is not used. */
; A# y5 _; p: g) Q: N* |. d4 ~
paramSet.bCntReload = PING_PONG_BCNT;
/ o, a; s# Q! [* x
( P- V7 V$ V! h7 Y _ t
/* Src in constant mode Dest in INCR modes */
# |1 B9 G" T+ g9 x$ o; B7 w
paramSet.opt &= 0xFFFFFFFDu;
4 l4 {1 k9 i+ \, R, b* _* N* |, a, d& S+ h
//paramSet.opt &= 0xFFFFFFFCu;
, }5 _" D5 M N; ~
, q& `6 W1 \& l6 F- R
/* Program the TCC */
% l3 N0 i. c8 F/ `& W
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! w7 H5 I5 X6 l) A) i$ r4 ~
- g7 A% n$ _6 z) R
/* Enable Intermediate & Final transfer completion interrupt */
# ^2 j! h; c; ?/ l1 B
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 Y. o' ~0 t1 r7 i; {2 C/ N
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- i- w+ @4 G& v" D2 H6 K3 A
; G# b( ^# [* @$ W% V* Y: l, L0 x- S
/* AB Sync Transfer Mode */
; ]' ^9 ?2 M, u
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ R& O6 F t5 X" x+ t$ p
2 H d1 \0 Q- a' c/ {% z l# u% D
/* Program the source and dest addresses for master DMA channel */
# {! a! Q+ k, o9 o
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
3 `5 }% X$ l7 x& p; ?& g6 [" I
paramSet.destAddr = (uint32_t)(ping_buffer);
- b# d& B- o7 N: M. X
/ h9 q+ O9 \4 a
/* Write to the master DMA channel first. */
" o: e2 v( |) N# x& X8 k, Y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; t$ r$ q4 Y% h8 ^) m
}
0 V6 v2 M" l: i, p" K
. ~2 f* Z$ O1 t; d
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& l# U& h+ O: A1 l5 t0 x U
- i2 I3 x8 g3 U8 f
if(result == EDMA3_DRV_SOK)
9 C: L* u1 ?5 ]4 O, U. Q6 W/ w
{
* q! Q: t& ~$ h
print2arm("edma3 driver init success.",0);
) Z z/ a8 c, c
}
' B3 ]5 Z" R/ S9 I; e, e$ }
}
6 T. ~7 i$ c! v4 c% O+ M0 L
/ }, f2 \2 V+ M" a9 d; j7 W+ c
* s6 u& B- X/ x
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 d4 h6 N) `$ V5 J* t1 i5 U
3 L: n P1 Q9 I4 {$ r
2 t2 ]+ y; u( G( s; s! O+ \
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* ]8 C, n* x; f/ X v* e2 G
每次DMA传输完成后都要再次使能传输
0 u/ S' Q; a6 t0 B6 L
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4