嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ n3 V4 N# d2 B- B" y
#define PING_PONG_ACNT 1
% F% `6 o- q3 _2 e0 P& k( L# e
#define PING_PONG_BCNT 8*32*40
8 l6 e" @" v2 y0 W
//#define PING_PONG_BCNT 1
6 J4 @; o+ ~. r+ s, {
#define PING_PONG_CCNT 1
) J, Z# s$ T" y" z) K8 O
#define MCASP_BASEADDR 0x01D00000
& Q$ _7 B$ M% [9 b' U
#define Mcasp_RXEVENTQUE (0u)
& X3 c; b6 e6 c* x( t1 A* U7 M
: x) _( M' x$ O" Q2 g
/* OPT Field specific defines */
" ?6 p5 W# }$ {3 M" Y' t6 Z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& s8 m _2 x7 r1 e
#define OPT_TCC_MASK (0x0003F000u)
5 z; Z4 G( m* T0 K
#define OPT_TCC_SHIFT (0x0000000Cu)
& Z/ p* ^6 y8 d
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& y* E# k9 e" R5 S
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 ^2 v& r# E& E( ?8 v
% f: p% j: z- d$ A& h
char ping_buffer[PING_PONG_BCNT];
; w `0 I5 y" h5 S- s
char pong_buffer[PING_PONG_BCNT];
6 J. F: X* \ [% I1 y7 r4 X( e
7 d; h5 W5 ]' l d, [( |1 W
7 n3 t4 X* N! Q2 s) M
$ W" ~% ^1 d2 M9 a. Z$ T
2 ?2 ^9 g6 F1 B* i( f
static void ys_edma3_init()
8 m# m, e, q4 c. z. [( n# y3 b
{
) b/ [! O6 P5 [; ^
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( b* Z, u$ W+ f9 }; |4 L6 w8 T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 b' q- ^/ R4 |/ h! H) ?% I5 z$ e" r
EDMA3_DRV_Handle hEdma;
+ [ m B% s+ c
uint32_t chId = 0;
' }9 g B6 e8 o( t
uint32_t tcc = 0;
9 [! n4 m2 }- x& y5 v
% G3 R/ C4 @3 o$ N9 H5 h, J2 d
print2arm("edma3 driver init...",0);
8 a* D. c7 P$ U% i& I
& f% C- Z7 {6 x) @% D! @
hEdma = edma3init(0,&result);
% q/ f, ]+ k, l7 D1 ?
if(hEdma)
( [6 H5 J$ l# Z, ^. G* t
{
9 J, X# |4 O% M' {( Z
print2arm("edma3init() Passed.",0);
R% y3 B( o! N" z; B
}
- {% ^) {) Y a$ M: V: u
else
% i8 f# t, G2 v
{
+ l2 j3 {/ L0 R
print2arm("edma3init() Failed.",0);
+ l& D, {% @- n/ B# @# W
}
. @! Q; K% }2 Z' [& ]' v
; n! p, {$ s* C
if (result == EDMA3_DRV_SOK)
; d/ P" J1 P4 }. _6 O3 D
{
) v: p# {/ E+ \; p7 J3 c0 L
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 Q! C+ r& B8 M) b
(EDMA3_RM_EventQueue)0,
" }6 U: ^. K9 y: }2 x4 c
&edma3_isr, NULL);
) B; f i+ x% c$ h5 g* }' V
}
) }# o* ^2 O2 T' P2 V! D
1 O# R, B1 B; m5 `0 M
if(result == EDMA3_DRV_SOK)
6 G, Q1 E5 n6 l0 f+ M
{
$ D% ?/ R: Z& o$ _
paramSet.srcBIdx = 0;
7 k) U: ?" ]' \4 U, G
paramSet.destBIdx = 1;
6 f6 T" Z7 L3 [; c% S3 o+ o
paramSet.srcCIdx = 0;
8 b1 F( T9 }9 S5 h7 I
paramSet.destCIdx = 0;
' Y" V3 o. U5 _5 W9 h9 }
paramSet.aCnt = PING_PONG_ACNT;
5 u& y. ^" u0 T# y# t5 f: g+ \+ A b
paramSet.bCnt = PING_PONG_BCNT;
3 Y: F# o( }; K( d: Z
paramSet.cCnt = PING_PONG_CCNT;
- s) L' @* R/ a$ x5 `/ I
+ V) s3 k: j8 F3 _- |
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 D0 [8 L9 O! ~
paramSet.bCntReload = PING_PONG_BCNT;
5 O9 U* p; P' }6 v) I) b% {& e
4 ]) P0 \0 }; p2 l% l2 c
/* Src in constant mode Dest in INCR modes */
! b9 m: r3 `! Q
paramSet.opt &= 0xFFFFFFFDu;
1 S; [% `1 S6 @
//paramSet.opt &= 0xFFFFFFFCu;
" G. h3 C0 Q; e/ o7 Q/ C" f% t3 _
8 G8 a7 J. L8 V
/* Program the TCC */
5 i3 a' d: j/ g( } N( n5 |, `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# L3 V$ n N3 A' o' E+ |
V1 t) l' A F# U' e" G+ _ {- \0 U
/* Enable Intermediate & Final transfer completion interrupt */
' s) |: [5 S) n4 w5 N/ ^: b% k! N$ o% q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
) j% a! X# ]/ c
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ \3 d1 c* y; \. D+ G
% K' R- `0 C1 [! g9 |# Z
/* AB Sync Transfer Mode */
% C( s+ s$ Q! T' C" d
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% j+ T1 f3 t6 U
" v$ C' k3 C, {: t6 Z+ q
/* Program the source and dest addresses for master DMA channel */
2 e/ k9 B5 [% q: T; x& I, P* I
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 H) G3 o5 D9 j ~$ I( a
paramSet.destAddr = (uint32_t)(ping_buffer);
. v5 V+ _' e! T; X: b- b3 Z8 `7 n2 a
, Z0 Z8 d$ R/ o' N
/* Write to the master DMA channel first. */
. i. v6 n& Y& t9 f* `3 W/ L2 j
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! g+ i' N! f! b
}
5 s7 Z+ P. d1 ^3 ~& ?# _, f
9 u: P7 o. C& l2 H5 _# s4 ]
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* P5 } t: t1 m" C& x& x
7 V- {+ F2 N" q+ t; u
if(result == EDMA3_DRV_SOK)
; _. B3 ?, v% g( P3 `" j* [
{
. y, E' k, S8 _, e4 n
print2arm("edma3 driver init success.",0);
: p0 }6 o0 G0 A2 O( o+ H
}
# f1 |, G' D, m. F7 G
}
; B" e& H) n; W- Q! a! h% \7 `9 ^
& y$ \# u# y- ^8 q5 V1 B' H
! Z& \' k: b1 t! a% s( Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" E* w6 p0 ^1 c8 x5 b
3 l3 r/ Y7 O) p( e
9 o9 ?( ^+ o4 n) b) d8 V2 z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* @6 S- }0 }; ^8 a1 ~
每次DMA传输完成后都要再次使能传输
3 g F7 o) {( A4 `6 R, q/ `
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4