嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
. ]7 U7 f3 q* r' j7 w$ g1 L
#define PING_PONG_ACNT 1
: Z+ Q8 M0 Z5 I2 i# V& e
#define PING_PONG_BCNT 8*32*40
* l3 X/ ^* a+ t
//#define PING_PONG_BCNT 1
G* x3 I$ P) X+ |- K D. P O" e
#define PING_PONG_CCNT 1
3 E: \/ t: A/ K( {9 {; f% C
#define MCASP_BASEADDR 0x01D00000
4 ?0 ]8 M1 T: n: x5 @+ g
#define Mcasp_RXEVENTQUE (0u)
; Y e: ]6 e z8 l& A1 U1 I
8 P. H* l6 G" |6 R Z, Y) L: W
/* OPT Field specific defines */
( g* h" p* r3 K6 a1 p
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' w8 j: u8 O9 I9 W
#define OPT_TCC_MASK (0x0003F000u)
- o# K0 o" p+ R0 L
#define OPT_TCC_SHIFT (0x0000000Cu)
* N6 N+ }- b9 b) H' c6 _1 c
#define OPT_ITCINTEN_SHIFT (0x00000015u)
2 f* P! M3 H% O) ?, `' I$ E7 Z o5 b
#define OPT_TCINTEN_SHIFT (0x00000014u)
. y9 J6 N9 F- y$ t/ g" B5 w$ w( o3 L7 R
5 X O9 h" \+ b3 A3 A* X
char ping_buffer[PING_PONG_BCNT];
& c, X& f, M6 U; k6 l& i. h
char pong_buffer[PING_PONG_BCNT];
i+ \/ b" k H+ k
; g" w. K# O1 A# _) q
: s) T3 w/ e2 w7 }9 Y
0 c' _, l8 D1 W! U7 e/ i8 y
+ m8 p% D- m4 t6 D/ h: K
static void ys_edma3_init()
6 Z+ ]& f2 m7 w0 a0 T; G
{
; P2 v. E# w8 \; W2 M! z1 \
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, e! X' y z0 d. b% h
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ j1 S+ b+ _, J
EDMA3_DRV_Handle hEdma;
1 \# d9 S/ ~* B" \' W
uint32_t chId = 0;
3 R) m' P$ X. N$ N9 P. [4 b
uint32_t tcc = 0;
$ R, t5 R0 ^$ V/ _) r$ Y5 L7 K
4 y% h: N3 G5 R: [5 l+ |# _8 t
print2arm("edma3 driver init...",0);
7 n- b1 [" }6 ]
7 K9 L. U# h0 o
hEdma = edma3init(0,&result);
; @. v( q C: a* D# c
if(hEdma)
O2 e" T4 H% l7 i! j# J# d) P
{
. r% p2 \; `* T7 e( L
print2arm("edma3init() Passed.",0);
`" Y. L7 J% ?3 ~- X- M" I
}
* @% q1 H9 X( L9 e2 f5 k
else
7 A% m5 X: g7 T# r4 K' {
{
7 P% i$ P4 |- D( t4 `0 z
print2arm("edma3init() Failed.",0);
5 w# ?+ P) \4 e0 c b' f8 Q0 q8 `
}
6 B5 `/ Y+ N2 @4 J9 `6 x1 r8 v" n
7 K1 g0 [/ j9 E# ]& d
if (result == EDMA3_DRV_SOK)
7 N, @2 s! i z$ P! L
{
, m$ |# x& |1 O& H& R y! u( j" O
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 S( H0 e, _9 |
(EDMA3_RM_EventQueue)0,
2 r- k8 o: ?+ j' t& r
&edma3_isr, NULL);
2 d! F" W' g/ ~+ W W
}
* }3 ~3 H8 Q" k+ z' O, S
) S( q- g& N' G. n- _
if(result == EDMA3_DRV_SOK)
3 }/ ~- f" h1 n/ o& X5 D
{
! Q7 B a7 F( k! g$ |) r
paramSet.srcBIdx = 0;
( Q v! L: G3 \- E0 C% Q; [3 I
paramSet.destBIdx = 1;
6 K( k" _7 C# H: F8 U
paramSet.srcCIdx = 0;
! t3 ?" O+ a+ Y$ J- d
paramSet.destCIdx = 0;
" [9 k4 n2 ~! S) s& ]5 K1 ]
paramSet.aCnt = PING_PONG_ACNT;
6 D( K' @; }" w/ Z; U. P' Y8 D
paramSet.bCnt = PING_PONG_BCNT;
* @8 H8 T T G6 L- d2 M) H; s
paramSet.cCnt = PING_PONG_CCNT;
! `" w1 W2 \( W# N$ z# c6 Y: o/ r8 a; u
/ d) h, k9 n. A6 Z/ C
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 t Y0 q1 a2 N- o' Y. q2 i
paramSet.bCntReload = PING_PONG_BCNT;
0 \! n; k, L7 H1 X% N7 \; z
2 d1 N" w! r I3 L( G5 [" `- Z
/* Src in constant mode Dest in INCR modes */
( ~" |, K& X, ^+ b
paramSet.opt &= 0xFFFFFFFDu;
, \$ |2 E. B& C2 U+ L" }9 @+ u; n9 z
//paramSet.opt &= 0xFFFFFFFCu;
4 q) W: j( R6 [7 K* u
% `) W, l& T8 @* j- G/ y" W
/* Program the TCC */
) @0 k+ k3 ~% Z( |7 ~' h% p
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 ^0 D( i5 E1 P1 d3 k" |0 e
/ R3 O5 F, \# A# E! c
/* Enable Intermediate & Final transfer completion interrupt */
; r: L0 h9 C2 m& V: J
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" X% E! g6 Z. K$ t* ]1 f
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, v' m+ N6 e; z$ `, w$ ]
, f- [" ]- J0 A$ t
/* AB Sync Transfer Mode */
4 Y5 f# A1 H) k2 m
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# m) N- o2 u3 e2 Y
) Z3 S$ P. [; [/ ]9 c$ [: ~
/* Program the source and dest addresses for master DMA channel */
4 B+ b; E2 R$ _) f( M8 c! N6 z2 N. P
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
8 w/ G" v* y+ O/ y- o8 T
paramSet.destAddr = (uint32_t)(ping_buffer);
: s( F' b3 K" f$ f5 d
M- L* f; o$ a& Y- {
/* Write to the master DMA channel first. */
7 a; u* w7 U) W8 _+ w
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 H" Q7 ~1 N5 i$ G8 G" A
}
9 r6 f u* R' b* {
- d/ Z3 w/ [7 b- ?9 T) u
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: e1 j ~8 q% K: z# ?$ _$ G$ Q
5 Y) l, `$ C. g% ~
if(result == EDMA3_DRV_SOK)
0 s) Q D1 B: w6 |2 O2 z; K
{
. j* Y; f7 }% u- t' D
print2arm("edma3 driver init success.",0);
( M, o; e G0 ?3 n9 o
}
6 o' I1 }7 i" a% i D9 ? N
}
+ D% h J( z4 i$ D' L3 W4 g7 B
5 L+ I& s; j( C' d% m
% r' I4 c6 I* v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; L( {0 m& o0 }6 ~& s4 }! ]
" o: h4 q/ t: G: v# b4 J
2 N2 M$ h; B4 `" ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. t7 z! @/ _" I4 O
每次DMA传输完成后都要再次使能传输
' B+ J0 E+ N& \" V6 K8 ]* _7 q C# K
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4