嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 j; O5 f& Q% |. W, t* M0 K$ V
#define PING_PONG_ACNT 1
( O% K1 m& w$ Z, _) S
#define PING_PONG_BCNT 8*32*40
c, d3 V' L7 z" h1 R2 w$ G' m
//#define PING_PONG_BCNT 1
/ J! n$ v) @: u4 ]2 n6 U
#define PING_PONG_CCNT 1
4 z' ^1 l, i! i
#define MCASP_BASEADDR 0x01D00000
+ e8 x0 i: Y) p* G( O8 z: }+ z; j
#define Mcasp_RXEVENTQUE (0u)
+ C K1 ^5 [6 M4 L" a1 a# t# f
0 z, A% v* \) q
/* OPT Field specific defines */
, U+ l( }$ _1 V' f( }
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# j% |- L D' \6 R$ o2 Q
#define OPT_TCC_MASK (0x0003F000u)
$ m- [" X% q2 r% }3 u/ m
#define OPT_TCC_SHIFT (0x0000000Cu)
2 H+ \2 ?1 N* K2 P7 u$ N" J& N
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# t' b2 ^# S* h2 ^: w
#define OPT_TCINTEN_SHIFT (0x00000014u)
5 X: E5 L& n# }3 c9 j
. t2 l/ Y( r* i1 i h1 C
char ping_buffer[PING_PONG_BCNT];
( v p1 \# R5 S( m! s; w
char pong_buffer[PING_PONG_BCNT];
4 p" s5 z: x% F. B% q% t
+ k* S# K. d V+ z" {2 \$ c- E# B
; n a6 O9 M% O, E4 `
/ |' m6 G& B1 J; G2 }! g2 f2 B
1 u- @+ b2 f* `
static void ys_edma3_init()
; u* \6 u( a" U5 N" O2 w
{
! ]7 f. j! x$ Q
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' c ~/ G% F6 ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& O0 w! o# \ R
EDMA3_DRV_Handle hEdma;
9 }( Q9 m8 w$ H+ Q5 W5 u) i- h
uint32_t chId = 0;
2 L& [# ?5 L1 Z' t* }
uint32_t tcc = 0;
$ e( S" W F, k: i2 \9 B
; p( Z0 E# P* S2 N
print2arm("edma3 driver init...",0);
$ q* n# E5 a- c% ^7 [9 l5 E5 J
' P5 [* f) Q' R
hEdma = edma3init(0,&result);
8 S# |% w, q" v {3 i
if(hEdma)
) N8 v6 _, V9 _1 {0 i; q+ j9 C; `
{
# ? ?' K. v0 H9 \ I3 v! ]
print2arm("edma3init() Passed.",0);
* }! A! u+ d; a6 e, r+ V8 R9 @
}
6 \2 `" K% J1 K
else
6 M" E$ \' i5 W. @2 N* P7 n3 v
{
9 f$ |3 Q; R; V7 y
print2arm("edma3init() Failed.",0);
0 q, C7 `5 t' L; j& h! t
}
' i' `7 d2 f0 o5 N8 v& w# J
' P$ w: E e* P5 N
if (result == EDMA3_DRV_SOK)
& y( o* ^( H& g! X( Y$ s
{
, }& {( R8 }; O* n
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 M1 `8 P6 [4 d& a+ h% [# l
(EDMA3_RM_EventQueue)0,
9 I' `$ A0 l9 |* B0 V
&edma3_isr, NULL);
# V; O; t1 M. n/ t
}
3 h! O N( ]( j I
( C& P2 [4 }, \/ S1 f0 V, A
if(result == EDMA3_DRV_SOK)
. t6 N# w8 y% y+ A
{
+ k& s# o# k& \2 I G! V6 C
paramSet.srcBIdx = 0;
8 ], w/ z5 i% |5 R7 _' f$ e: w
paramSet.destBIdx = 1;
8 `& P" h5 u3 c Z" { ^- Q
paramSet.srcCIdx = 0;
# f. y9 c* c* ?4 X
paramSet.destCIdx = 0;
3 j) [3 X& Z2 `* V; t ~! k
paramSet.aCnt = PING_PONG_ACNT;
8 `0 q q6 n& p. Z
paramSet.bCnt = PING_PONG_BCNT;
7 z b, f" T! U) o
paramSet.cCnt = PING_PONG_CCNT;
% ^3 O/ g1 u4 j0 d
: u+ q* l5 m+ h$ H0 \! H
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 ~/ z$ S& M( ]5 x+ m/ |- V8 @# Q" P
paramSet.bCntReload = PING_PONG_BCNT;
: L# j( c. C, k; s' t7 L
" i( A) I) J+ `& U4 n8 o
/* Src in constant mode Dest in INCR modes */
7 h1 H: S( w) g. R: o) z; E# C% R! p# z
paramSet.opt &= 0xFFFFFFFDu;
, T) Q5 @- u6 c
//paramSet.opt &= 0xFFFFFFFCu;
/ a* X0 `0 o x: k9 d- s; R4 l% x
$ A5 c- z' K* ? [
/* Program the TCC */
% q, D4 u) s) a3 Z4 a" t7 N# w: `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* u' D5 X" D6 [7 |* z3 Y
! H z, [0 f8 N6 a5 z, X( }
/* Enable Intermediate & Final transfer completion interrupt */
5 n, E) [1 J' J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! ?# M8 K7 c0 i d8 K
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 E: p0 `$ g9 c
+ O1 S1 N! W; }
/* AB Sync Transfer Mode */
, g- Q2 j+ K! @: Z9 V' g( d
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ x) N) i2 s4 P3 J j+ q
. l1 c% k; p6 d; f/ G6 F9 j
/* Program the source and dest addresses for master DMA channel */
$ R( y+ P0 b1 u
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! ^& y. j' U3 b0 L" w; w
paramSet.destAddr = (uint32_t)(ping_buffer);
: u& W% f$ B* d! C& a
/ I) {0 u: n9 d2 A. X0 `1 |) s: R7 N
/* Write to the master DMA channel first. */
; y: M$ @9 l( o, W
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
( @+ W0 X5 L! \) W8 E; X; D! W
}
! o! J+ x) g3 A
# M5 e6 `' d9 K5 i1 u
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
6 K- a9 j2 X5 }7 G) X8 C
. u! a" ~5 a/ [
if(result == EDMA3_DRV_SOK)
' w8 r! T, \- v0 q" q
{
8 w) I& Z+ g4 C: m8 P+ b7 Y% m+ f
print2arm("edma3 driver init success.",0);
/ D+ c) X0 ~' y( X1 w$ X/ z
}
3 ~* s- I9 `+ W. \+ p# S) I' u6 l
}
% N: T4 h, v! w' d C2 R4 Z
5 n" x" H' L0 F
+ o) C- S$ k/ J- e4 `7 v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' p% T2 Q/ G% s& Y3 @, ^$ Q& v9 }9 N
! X* L6 \2 n r5 t: j
) Y+ M' s& g$ O
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% v2 r ^& L/ f- l0 l3 ?$ G
每次DMA传输完成后都要再次使能传输
) \* K& z% S9 @- L
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4