嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 z& z3 Y0 r4 `/ Y7 h
#define PING_PONG_ACNT 1
- Q5 m5 `/ g$ `2 D& s2 s3 M
#define PING_PONG_BCNT 8*32*40
1 r6 I! U8 B% J/ [+ p, Y: `
//#define PING_PONG_BCNT 1
' |" \& w, K C1 A
#define PING_PONG_CCNT 1
2 M+ i+ p. s- D8 x; o. w
#define MCASP_BASEADDR 0x01D00000
7 d! h$ v& _8 M& R
#define Mcasp_RXEVENTQUE (0u)
7 b" u6 C4 J1 X$ t( f
6 c5 n; F" B6 _( d
/* OPT Field specific defines */
8 G3 J, W4 Y) s
#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 |; P. b) b. \1 _+ e5 Z( t
#define OPT_TCC_MASK (0x0003F000u)
6 f9 E0 w" [& c8 \2 r$ H5 Z" x7 b
#define OPT_TCC_SHIFT (0x0000000Cu)
/ P( Q( I& F# t. e! g" ~7 P, w9 n
#define OPT_ITCINTEN_SHIFT (0x00000015u)
j, ]7 A/ n3 A& ^3 g+ b
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ |0 i1 n/ ^; Z- A, I B K
7 t- H; @2 @+ F" g6 Q
char ping_buffer[PING_PONG_BCNT];
0 p' p! H( K4 l9 Z6 V3 H/ C a4 N
char pong_buffer[PING_PONG_BCNT];
d5 G0 p) Q1 T% [1 U. D
+ _4 M$ J/ c% q1 m
; P9 f% Z) J( b$ m! J9 O
6 [ D# ^0 i' O& B8 R# O) I l3 ^! t( Y
; j# r7 B( U, d. [1 ?2 r2 h+ n
static void ys_edma3_init()
) s$ V6 j& M! u- {: ?
{
. N0 t/ \ d* F3 ]. `8 [6 |
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 [) s. b9 X7 H: n
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' x/ _6 s+ l# ]3 z
EDMA3_DRV_Handle hEdma;
- W/ C6 ^ y) t, a
uint32_t chId = 0;
8 M" j+ g. v7 ]. ]! [
uint32_t tcc = 0;
) W4 j/ B9 [9 u6 `8 H8 Q E7 t
$ E t6 C7 C6 F5 v6 r e }. {
print2arm("edma3 driver init...",0);
/ B# h; y0 D5 `; m, G
1 J( |/ h4 s7 C
hEdma = edma3init(0,&result);
3 ^( W$ w, ~9 l9 _1 _/ O
if(hEdma)
/ _- J: U; L0 ?" w2 o4 T9 ]
{
4 ^' B* P" F3 O+ s$ V5 |- P
print2arm("edma3init() Passed.",0);
: R. F7 Z t7 a* h! R
}
6 U7 a: \3 h7 @+ }
else
; ~8 C4 O# R" [5 l
{
3 t2 o; [! W' K5 r6 O/ g# l
print2arm("edma3init() Failed.",0);
) ^0 }2 u' W+ a* ~0 `; _
}
& R* @ b* a) H# F
/ K4 H# X6 x# |: T1 r& [/ @
if (result == EDMA3_DRV_SOK)
; ]8 O- {( A6 {% n1 ]6 Q
{
7 J B" l1 Y6 i. O0 N w
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 e8 |2 M. u% Y$ b
(EDMA3_RM_EventQueue)0,
. G# G" j- C# f7 t# E, R' `* m
&edma3_isr, NULL);
# p) Q0 e* v, J, C2 I
}
$ V- |: }% ?" o. O
4 L; ?7 ~2 E! V/ l& J
if(result == EDMA3_DRV_SOK)
+ ?+ \7 O l* l, S: G
{
: |2 Z; b1 o# v9 R+ S ?8 \
paramSet.srcBIdx = 0;
w s! V3 S; _) u! Y! k. L" h
paramSet.destBIdx = 1;
6 z" a* l7 S1 O1 S, S
paramSet.srcCIdx = 0;
/ d8 G. k6 \% j. O8 t4 l
paramSet.destCIdx = 0;
]- l; R( Z, g- X4 c u+ k9 T( K
paramSet.aCnt = PING_PONG_ACNT;
) e3 r4 U9 j5 N8 C
paramSet.bCnt = PING_PONG_BCNT;
9 O4 _4 h: E1 R [; L& E, A/ h
paramSet.cCnt = PING_PONG_CCNT;
; m+ k' j4 \# t2 L9 v1 L& t
0 P3 I2 Z* V3 E, d/ P7 ]- \
/* For AB-synchronized transfers, BCNTRLD is not used. */
( f: F% Y9 T6 j$ i
paramSet.bCntReload = PING_PONG_BCNT;
) ]8 i. H/ `- ^& m' |% Q
/ Y9 z J/ _' `) z
/* Src in constant mode Dest in INCR modes */
4 ^( \; K% {- n% [: g$ I, L6 i5 _* L
paramSet.opt &= 0xFFFFFFFDu;
* u' }; m/ u" i" L3 B
//paramSet.opt &= 0xFFFFFFFCu;
( `& } N( Q4 p
0 T7 n% e2 s5 e" H$ `! z. P) D
/* Program the TCC */
* N% @+ p S* x; `/ A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: C u- y# C2 D
% W5 e8 r& c& h( r4 D+ f/ C. z& ^6 }
/* Enable Intermediate & Final transfer completion interrupt */
: b; P: j! @* d% M- s* k \
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 l" g0 C) @, r( ~ i) F
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: X0 ~" d9 y5 N( e# L8 N2 D& P3 g
" p' F" f& g. P' C
/* AB Sync Transfer Mode */
3 T# v8 F1 d- t- j- h! _
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ n7 n/ O( c" Y& o) C
4 n0 u: L* h; O1 M K
/* Program the source and dest addresses for master DMA channel */
' Q6 b9 [9 t' Y* L( j5 ^' @6 T g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 I) D9 F% a; k$ _4 z( F' O
paramSet.destAddr = (uint32_t)(ping_buffer);
: X8 N- b' d. U* I) G* B
) H3 H0 r: S9 B+ J3 k& F$ t5 G
/* Write to the master DMA channel first. */
3 K& h6 G/ X" X; h: Y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 b; }* m. I x* W0 a8 {( }5 h! V
}
/ ^. H- t8 A" [$ t
7 V U( f% B" a- V* ?9 i' f
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. J' h4 v0 D/ J# ]
+ Y$ z4 S8 f/ o
if(result == EDMA3_DRV_SOK)
: H' @' u# @2 n1 O/ _
{
# d5 K" X2 M2 e
print2arm("edma3 driver init success.",0);
3 \4 F1 ?. E( T* |
}
7 E* s8 v; V2 L' H5 j7 |* y0 L& E# c
}
+ D4 {9 \1 J" ^) X7 |: B7 j `
, V1 c' B, x% j# c9 ~- @$ R
2 f. n1 ~: U4 {: C4 F
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 l) Z# }& w) t5 R) E
* X* [: k' G; f1 T
( K/ f% @1 X% m" O( u5 V! O
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
" y& _9 x T* Z' C5 W6 W2 k
每次DMA传输完成后都要再次使能传输
; p8 B P( S/ J
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4