嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
q% A) a3 {* S! G$ D
#define PING_PONG_ACNT 1
- c/ K7 j5 M2 B$ s( w
#define PING_PONG_BCNT 8*32*40
: E0 ?0 i+ x; c2 n8 w( |8 O* j
//#define PING_PONG_BCNT 1
- ^! T: D- t5 s
#define PING_PONG_CCNT 1
/ J6 j8 b: _6 B
#define MCASP_BASEADDR 0x01D00000
@& O3 b: q2 u0 @/ _
#define Mcasp_RXEVENTQUE (0u)
# A9 o1 n. K. k1 D1 C' @
2 f# g0 p' t; o6 [& ^9 [6 s
/* OPT Field specific defines */
' h7 t* [: | K; f0 m
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, x: h! f v8 S1 L! f- h6 x
#define OPT_TCC_MASK (0x0003F000u)
! L% K* j! z$ Z& a5 Z$ D3 G
#define OPT_TCC_SHIFT (0x0000000Cu)
9 e7 S9 h: p# n2 k# {' M1 N! V9 T
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, u8 M X2 B( B* T# k/ |2 _9 o9 `
#define OPT_TCINTEN_SHIFT (0x00000014u)
. u2 p/ l/ x7 e5 b
" T+ @/ n4 ?5 ?, ~
char ping_buffer[PING_PONG_BCNT];
! a. a z4 a/ c7 u4 i3 e( L
char pong_buffer[PING_PONG_BCNT];
& n4 m. V8 d( w3 B
0 y4 t! z- ^. ^
: d+ O# F( e% W& h
7 ]$ [; Y8 c1 @6 C3 d
% a- t3 r# c; X4 T: S6 b
static void ys_edma3_init()
& O E& w/ F& U
{
. Q0 U8 v6 U+ W$ \
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ k$ t$ q h/ H# A- [9 b, [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" }: T7 A3 c0 j5 y
EDMA3_DRV_Handle hEdma;
- e C0 P$ ~2 A, A, @! t; u; X
uint32_t chId = 0;
& u$ t N" @9 C: ^8 T
uint32_t tcc = 0;
4 c; I, r! y- Z3 R" ~4 z
# k" E- h) m& @' F
print2arm("edma3 driver init...",0);
. q% t; ~0 b/ M6 I1 `- j4 m
# J7 e% e* N3 t" c0 O
hEdma = edma3init(0,&result);
$ n; b; c: T. o8 i/ u
if(hEdma)
1 g \6 T0 X9 N# R* _5 s- A$ x
{
. c/ K) j% f5 C$ d" \. p
print2arm("edma3init() Passed.",0);
6 Z0 ]0 C2 g1 y3 A" r
}
: s# G; L) N% U/ x+ j: _
else
3 Z: f6 @0 b( Y9 E' u
{
8 T, a/ `6 n& D2 P0 I
print2arm("edma3init() Failed.",0);
. w" ?' x3 j( z* K2 h
}
* R6 s# a! h+ Q$ e" s
* h! b A E2 G( s7 v. o6 ^! \
if (result == EDMA3_DRV_SOK)
" o- e- `. I0 m) t' r3 \
{
( @ F8 l+ A3 g+ M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 b9 `3 x1 Y3 N
(EDMA3_RM_EventQueue)0,
% y# A. D" Q6 q$ s& S* C: B: L
&edma3_isr, NULL);
D+ P% ]; t1 L' ?2 s
}
8 Y/ m2 I& ^, v# S7 G( F% k
2 c5 W7 A# f+ T' P$ I: ^4 C6 ?
if(result == EDMA3_DRV_SOK)
" b2 s' @1 Y( _: B7 V
{
, V5 b; |1 ^- _' X0 V9 L
paramSet.srcBIdx = 0;
' B5 u% O( u8 h( w/ N, Y
paramSet.destBIdx = 1;
" _, s" C9 B; @% U5 L5 O: N
paramSet.srcCIdx = 0;
2 k8 U/ y2 P7 F6 ^- g5 J
paramSet.destCIdx = 0;
6 J9 R- `, r5 ]* t2 L1 R
paramSet.aCnt = PING_PONG_ACNT;
' e8 v7 M- S4 ^2 n
paramSet.bCnt = PING_PONG_BCNT;
* ]& I! S3 S, A3 @% q
paramSet.cCnt = PING_PONG_CCNT;
% i/ j+ U7 W, W! u: S$ {# |: E; i% U
( Z: `" F! o* M, j) U
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ c" U3 E. T1 c3 O3 x
paramSet.bCntReload = PING_PONG_BCNT;
7 H/ _$ w* a6 t' Z: Q& W8 j2 n
' v7 p5 g4 H! [* {0 G# o
/* Src in constant mode Dest in INCR modes */
) |/ g( r7 V- P ?# N; x
paramSet.opt &= 0xFFFFFFFDu;
9 P4 e& r- g8 Q+ }6 z" \; `' c. R
//paramSet.opt &= 0xFFFFFFFCu;
. m& C" \' N- B* y
* t% i1 [/ @3 M5 {, P
/* Program the TCC */
1 {: y& o) \' o) E. k: }) e5 `$ ~+ A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: a0 l! q/ p/ }
# D0 p6 e7 T% }; _) V5 S
/* Enable Intermediate & Final transfer completion interrupt */
1 W7 f4 x. j2 D, B* S) n
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 ^) \5 [. L- K0 d6 T6 s K3 z
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 |3 @ ^9 g. ^. m
5 G! V2 I5 T0 X* g. i) N% n
/* AB Sync Transfer Mode */
# X- E) _* V1 g" R. }/ n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) S! f; Z1 i. N1 q; }7 x- q
p8 q- D' x- |0 U
/* Program the source and dest addresses for master DMA channel */
" G5 @" A! L4 a/ g& [- m
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. f2 f3 i3 h; c# e% R
paramSet.destAddr = (uint32_t)(ping_buffer);
+ M: n5 X0 ^! ^- f: s e
^; f* K( Y8 y$ o7 L, [
/* Write to the master DMA channel first. */
9 H) }# F ?+ Y: Z, h
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% C. ~9 F4 a* w N( \. ]
}
2 ^9 X$ Q5 x- s
" Q, ]0 Z3 i+ u) H$ b! o+ D8 l
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 M) L. y U J3 n5 x$ a
: B& H9 Q( w: l5 s% x
if(result == EDMA3_DRV_SOK)
2 S1 X- y5 i! f* ~
{
) p [9 W# l2 ?# s& n
print2arm("edma3 driver init success.",0);
; \! v2 d }6 P" ^
}
: ^, i" m: j1 P& s* V
}
4 f! [4 o1 H# A/ Z: _
# h) B: J& s4 S
$ F6 {, v) h8 J4 w5 B M6 k5 w
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% z, `8 M4 H2 w# p5 x
3 X2 X$ j; y( x+ c0 x
- u* t& e* P: y$ z! T% P
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 D; F- C# h1 \/ t
每次DMA传输完成后都要再次使能传输
. L6 _0 W5 H ]+ c6 H9 x
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4