嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) Z! x- a* {, A$ {
#define PING_PONG_ACNT 1
: u/ M, V- }" X- m' j4 Q/ r
#define PING_PONG_BCNT 8*32*40
1 R. {$ f+ W1 O1 v2 I3 k3 r
//#define PING_PONG_BCNT 1
) K; @( j5 X: U+ t
#define PING_PONG_CCNT 1
8 A0 {+ Z, {" [% H( |. t
#define MCASP_BASEADDR 0x01D00000
f% r; J- W+ \/ o0 P E
#define Mcasp_RXEVENTQUE (0u)
7 T* E+ x& L, h8 x" E$ N
7 h0 J% }' h" _' H7 {- x: v
/* OPT Field specific defines */
; r Q4 q* r% b' s" u* t
#define OPT_SYNCDIM_SHIFT (0x00000002u)
2 c; a1 X0 R# p8 _: K- f
#define OPT_TCC_MASK (0x0003F000u)
* d7 Z+ h" d/ A2 J% Y! H+ `
#define OPT_TCC_SHIFT (0x0000000Cu)
8 _" n+ }6 t, t V& u: j& I, `
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ V1 a4 ], U" d: K3 v
#define OPT_TCINTEN_SHIFT (0x00000014u)
) M3 E2 Q$ @8 n4 q2 y* I
9 F6 a/ R# O; o& o4 Z
char ping_buffer[PING_PONG_BCNT];
" [, P$ |6 d& v+ f' \% ]' b
char pong_buffer[PING_PONG_BCNT];
4 f( }: K) V4 y F! n
6 }+ D& F% s4 x0 A0 l! W4 y
/ l. ~/ K* M, T4 d
" S& w7 @: j+ ^7 _) D u: P; T
4 k- W$ o) t) F ~9 h+ q
static void ys_edma3_init()
8 |* ?' V7 i8 m8 W
{
2 d5 _4 r2 [2 D2 X
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# [* P: \/ ~6 v1 V9 d
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 X3 l" h# x' ]4 o7 P
EDMA3_DRV_Handle hEdma;
, P5 t" Y( V0 s3 |
uint32_t chId = 0;
# k1 M: ~9 \. [4 K; y
uint32_t tcc = 0;
2 C% z4 M% n7 j) B& [
9 `4 m2 O+ f) f1 D- }
print2arm("edma3 driver init...",0);
7 L+ m" K' W6 o7 k* o
! S6 y8 D& K1 u8 l5 I
hEdma = edma3init(0,&result);
, {; _) g4 t: L5 |" C3 q- J* ~
if(hEdma)
/ _7 J" a1 s4 k7 b; U
{
' t+ H# v% R. T/ e' R/ n
print2arm("edma3init() Passed.",0);
, N5 N0 a" c8 \' f" V
}
* r- I0 }3 V8 s2 @& K
else
: d& W% n8 M" q
{
5 y6 p W0 s' D$ z' b
print2arm("edma3init() Failed.",0);
/ t+ f2 Y9 k# P$ \. e
}
$ H# m8 h, K: e8 T5 g9 L
. M0 L& \4 \8 o, i2 R
if (result == EDMA3_DRV_SOK)
# w/ r1 U; S0 ~/ B1 Q4 T5 R
{
9 I$ Z4 h% r3 F8 X! G: b
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 b* J+ G+ \8 H2 o& P+ H
(EDMA3_RM_EventQueue)0,
- d w8 H3 e! }7 z6 M- B1 \! K
&edma3_isr, NULL);
5 k. z4 z! e& q% K# [$ i: O" }& G
}
/ U! f3 M1 J; w4 W" p0 A
x/ l) t8 \9 m0 L' ? }
if(result == EDMA3_DRV_SOK)
/ H+ y( p' x9 m B2 R" ]" J4 Q
{
6 p. B/ k. u" O: L
paramSet.srcBIdx = 0;
6 j7 i6 ~- \& h4 V
paramSet.destBIdx = 1;
) e. V5 z; K: r& o* J2 s! t5 j
paramSet.srcCIdx = 0;
* u9 `6 P5 G! i. c4 V) a
paramSet.destCIdx = 0;
% w0 g; f* T m) H0 _: e5 Q2 M
paramSet.aCnt = PING_PONG_ACNT;
- }8 G7 ?7 J' ]* h( o
paramSet.bCnt = PING_PONG_BCNT;
8 f1 j0 i o0 H$ S1 w; O
paramSet.cCnt = PING_PONG_CCNT;
( ]: b% E6 O0 H5 n3 `
+ L5 m8 M; j1 ^$ M
/* For AB-synchronized transfers, BCNTRLD is not used. */
@ H9 X% u" @0 I$ P* b) }* G3 c8 q
paramSet.bCntReload = PING_PONG_BCNT;
m& e4 ?0 [% B+ ^1 ^ T
; L: y* \5 o- ^2 p8 v5 v$ M* Z
/* Src in constant mode Dest in INCR modes */
) l: P. ?8 h; o, c( y
paramSet.opt &= 0xFFFFFFFDu;
- p* X6 g7 E8 I; H
//paramSet.opt &= 0xFFFFFFFCu;
, L" G) _1 C; f; z, T
& E$ K) v, Q/ V/ J5 K
/* Program the TCC */
! M! p3 f. W9 q1 v4 {0 Q" D/ b% N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( {. E' J* A) t0 h
. \* \/ [+ M/ H! e
/* Enable Intermediate & Final transfer completion interrupt */
( u( }) ?+ D- z6 Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 F2 r+ t2 p9 g1 z% l& z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* H4 Z5 d+ p/ w$ v2 G& m
0 O- V/ W& X+ Z6 b6 _
/* AB Sync Transfer Mode */
5 i, Q, V) ^& U, p2 v
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: k; J& r& z6 Z, q
) b" P/ I4 Q B4 F M$ e3 |
/* Program the source and dest addresses for master DMA channel */
5 C: @+ {( R. \6 C) L1 O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# o3 p3 H$ z' M/ p$ d5 u) J. c
paramSet.destAddr = (uint32_t)(ping_buffer);
# c; H1 Z! e" \4 z' _; ]* ^) e
+ b% H7 A6 l- I, Z; J+ B3 [: ~7 O+ f1 t
/* Write to the master DMA channel first. */
$ N4 |/ c- _- b
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ ]# Y' P$ l% [% h
}
* X& e; `- b; M' _ h% j, l/ F- d+ e
: K8 ]0 W% M. `# v
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% g& t7 Q( s; ` ^, h% D7 t' `& [
) D) w1 ~. }5 P2 I3 t" @( z
if(result == EDMA3_DRV_SOK)
4 l- Q; j) R3 k: I* C% m' a X
{
9 T0 p3 a' f3 z* D9 \5 g
print2arm("edma3 driver init success.",0);
; q9 h" |7 P6 \& v
}
9 x0 u& J6 O* J j
}
% A* A2 g& t" S( X
: x& c9 h2 Y( G
" w% _+ w! c; B! K% K, {
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 V; Y4 ?! {' P+ N$ i* w) s
7 o0 z, w# v- E3 s
( X c9 k& H% u0 b4 S
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; Q8 i7 j! s: z5 x- X, M6 a% z
每次DMA传输完成后都要再次使能传输
5 `9 a8 O+ D4 J7 q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4