嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! d9 g" t+ C; q$ x
#define PING_PONG_ACNT 1
* _0 s2 G: I* l9 q0 O! z
#define PING_PONG_BCNT 8*32*40
' ?. h+ j0 n Q8 J- W, D% r, X6 E6 y
//#define PING_PONG_BCNT 1
! A) l) S6 b* i3 E! k3 [5 D8 y
#define PING_PONG_CCNT 1
% l; ?! Z9 a) ~! C7 |# v
#define MCASP_BASEADDR 0x01D00000
* ~/ u, v. [6 c% O
#define Mcasp_RXEVENTQUE (0u)
2 `! g/ q& d; C, K. K
' t0 m8 h( ^( r* z
/* OPT Field specific defines */
. f: w) W6 H" _, c) g$ V
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. o z( m$ Q2 n+ t) s
#define OPT_TCC_MASK (0x0003F000u)
1 B# i% N: i' }1 u
#define OPT_TCC_SHIFT (0x0000000Cu)
$ ~- I1 ^& ]( x1 ?" i
#define OPT_ITCINTEN_SHIFT (0x00000015u)
3 a/ u3 k& f, O5 X3 t
#define OPT_TCINTEN_SHIFT (0x00000014u)
6 s( B3 N. U1 ^! ^
, w# {. G3 o( P$ E, z; s/ S; B+ T
char ping_buffer[PING_PONG_BCNT];
) V1 S. s* ^5 K! Y. P( i: w2 Y' Q
char pong_buffer[PING_PONG_BCNT];
6 E0 W# Q; F x
" k% `* }: v. e0 ^, I' z8 v4 G
6 V9 B# \3 W( A
6 G: Y8 v* d& n# N+ k: |1 m
. |( w8 V* x/ j; @
static void ys_edma3_init()
4 T- c. ^" U8 ]/ j0 K8 ]
{
# t, w1 e( ]* A) G2 r0 l, T8 @
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 |) ~0 Y6 K/ \# ~0 }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( R6 j6 Y- N* ~' M8 i) p4 Y' y+ P
EDMA3_DRV_Handle hEdma;
0 V+ Q; y! y( z- |8 Q
uint32_t chId = 0;
1 Q" H) G% w6 }# e. H0 I+ X+ y
uint32_t tcc = 0;
% X% V0 _4 i/ \* N
/ A4 U/ G9 Y5 U0 O: ]" d
print2arm("edma3 driver init...",0);
. t3 I# n% H. M# \0 y5 Q: {. `; Z
/ q4 _0 U- F5 j& X
hEdma = edma3init(0,&result);
; |2 j. ^; j: H0 b+ b; P! I$ q
if(hEdma)
: P+ d8 Y4 D) z8 v# @
{
: |; h9 M& J, K3 V3 X
print2arm("edma3init() Passed.",0);
1 d3 y/ X1 w! [/ V2 C1 x
}
1 J( ~' z+ m3 x
else
! j( w. n4 ]( v" a
{
1 |. G+ H$ [- E
print2arm("edma3init() Failed.",0);
8 z' o7 r% O5 `' C6 d3 B5 k
}
L' x% |8 Q9 H, J# }
. ~5 v! d$ t, j. f) {
if (result == EDMA3_DRV_SOK)
+ Q8 g' |5 H+ p! j& O* @: A
{
, C' s% a1 G! K: b3 M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) W* C% }) N7 H+ _" D! N
(EDMA3_RM_EventQueue)0,
6 w* r' Q8 ~5 G! L) ^
&edma3_isr, NULL);
0 ^8 R7 C: @& p9 A& D5 l* h
}
$ E8 @7 f' m# Q
4 ~9 P" `* e1 k; J3 u
if(result == EDMA3_DRV_SOK)
8 n' A- n" X3 f/ S( c
{
, ?2 C- n3 k7 L5 ~. I
paramSet.srcBIdx = 0;
. z# T) } S0 ^
paramSet.destBIdx = 1;
/ N* L& _& H8 u/ p
paramSet.srcCIdx = 0;
7 ^% \2 y9 F: H# h8 _+ m
paramSet.destCIdx = 0;
5 q6 A( `# G2 [. ]; K' u; i
paramSet.aCnt = PING_PONG_ACNT;
B9 g9 a" [6 [2 b- X. G, N+ p
paramSet.bCnt = PING_PONG_BCNT;
1 W. z) b6 [. {& }8 u Y% z
paramSet.cCnt = PING_PONG_CCNT;
! q* Q7 K8 e }# R
6 r7 j" ]5 }) E' W* A: g9 z
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 \6 t: G$ A; \. s! R- j; J
paramSet.bCntReload = PING_PONG_BCNT;
: e) o' F3 [8 X
) |" P7 l+ B; R
/* Src in constant mode Dest in INCR modes */
A) @, ?& L" {7 \5 r+ K/ }$ K9 c5 i
paramSet.opt &= 0xFFFFFFFDu;
7 b; Y) ~7 R) Y: q5 Q0 V. @
//paramSet.opt &= 0xFFFFFFFCu;
+ x) }, l8 B5 j0 ]" o' V$ n
8 G9 m* }" r; \, s+ Z* k' B
/* Program the TCC */
1 m% }! Q, O3 j$ L
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 m' H3 E% {1 x! d% v
. Q, L& m: z3 y* K V# J
/* Enable Intermediate & Final transfer completion interrupt */
& }! I1 B# o5 Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 T0 r2 A: r: Q! t* c$ }
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: z$ D+ N3 ^( ]% x. u
0 U; |. n5 ], h7 ?. b/ W2 J$ H
/* AB Sync Transfer Mode */
$ k5 f+ l) L% S* x" B0 |; k5 K4 F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 @0 u& H1 a5 \% R! X% U
|5 v0 ? {# D/ G2 @# I# L) P' F! c
/* Program the source and dest addresses for master DMA channel */
% y; d- S$ H+ ]- s
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- c) ~6 t. x) T" W8 e
paramSet.destAddr = (uint32_t)(ping_buffer);
3 [5 c) T$ ^+ K) u6 K4 z0 A% @+ }; c
, ~4 | x/ f; J* z+ t$ V- K
/* Write to the master DMA channel first. */
# L1 _$ E! ?" W
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' U. F$ n5 @+ [5 F
}
: [+ a3 p0 \ w
# [) k& r# e) @1 ?$ C
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! U* t# W t8 k! z3 ^/ P0 l+ p
- Z6 z. L; `' g2 |3 x
if(result == EDMA3_DRV_SOK)
! a9 P2 t8 k8 n+ y' I! e
{
' P y1 t" F3 L) y& F
print2arm("edma3 driver init success.",0);
0 z1 @9 k9 l2 Q7 S3 T
}
( o0 d4 B) d9 W& a+ h( C5 A
}
' ^! \( n# ?" e/ l" x5 k3 \
, _$ N$ ~2 g, D1 O
5 l T* X* i, Q" W2 Z' W$ n! q" I6 X
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# g- |8 n' y4 |
/ N" X- \% ^$ \
% d# g7 Y* t! A5 Y% g* T
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* }, o* h% z- C U
每次DMA传输完成后都要再次使能传输
. _$ A4 R; t8 j! z1 I9 |3 j( i
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4