嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 n1 B9 }+ k w( O
#define PING_PONG_ACNT 1
0 Q9 G; J ?, ?: v; u
#define PING_PONG_BCNT 8*32*40
( J* p' E; x J6 K9 Y% _* i
//#define PING_PONG_BCNT 1
. O# y# y9 N* u b+ j
#define PING_PONG_CCNT 1
. o' k/ D2 u+ @
#define MCASP_BASEADDR 0x01D00000
4 r4 U9 P) V0 {. d# h( l
#define Mcasp_RXEVENTQUE (0u)
: J/ t5 C0 u7 N& ]1 ]; m
. d, n$ ]* j9 x6 } r
/* OPT Field specific defines */
% }& Z4 h+ v H0 ?4 i' x8 E; F
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) F6 m. d# }+ c5 S: j4 z
#define OPT_TCC_MASK (0x0003F000u)
( G. b( R6 W% a) z4 [* Y# g. q* j
#define OPT_TCC_SHIFT (0x0000000Cu)
! N2 ^/ P6 \3 L+ M' {5 ^4 O
#define OPT_ITCINTEN_SHIFT (0x00000015u)
* s% Z( e& M, D# R' n
#define OPT_TCINTEN_SHIFT (0x00000014u)
) n. x6 N! j/ G# x& i. N
7 A4 n7 k7 x1 H4 [
char ping_buffer[PING_PONG_BCNT];
: }) m% K; \5 g2 P$ b0 Y
char pong_buffer[PING_PONG_BCNT];
2 f# C/ E }* y3 j2 o2 L$ a" [/ P' t( Z
( F* w; x* j: t; L
7 @; a, d" \" s
0 ?8 F/ m1 ~. H
& E5 ~$ |9 N6 j5 |: F
static void ys_edma3_init()
. j# m; E3 j$ |* u
{
4 ~( H1 N% J! a7 o8 K2 @0 `
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) O. s( j$ F: L
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# M, @3 @2 k2 k9 \1 H8 e J, p
EDMA3_DRV_Handle hEdma;
5 _9 Z/ r7 S0 ?- j
uint32_t chId = 0;
! K3 j" ^, D$ X. S! K) _
uint32_t tcc = 0;
, q9 [8 q3 s+ j: ~0 P8 U
- N0 `1 G" t4 X
print2arm("edma3 driver init...",0);
t& L; L: {( Q/ R
* o6 ~% R. l4 C$ _5 @ {
hEdma = edma3init(0,&result);
% v( @ _6 E5 I; j0 d0 [" g* c4 C4 Q$ a
if(hEdma)
5 o' F/ Z0 Y, B# x
{
Y$ I# z4 w" P" q0 l& @9 a# p0 X
print2arm("edma3init() Passed.",0);
) x. P; D( V i4 Z
}
/ b/ P% N" X' X9 e
else
9 s* K% b% h; C1 o+ Q" x; {6 Q
{
! y, Q" p4 s/ C* `' N* Z6 e
print2arm("edma3init() Failed.",0);
6 x! X8 k0 q/ V/ I
}
5 u! }9 P0 k4 P" c
8 P7 U8 @- S7 y* q! t r' Z
if (result == EDMA3_DRV_SOK)
J6 _0 T, k' a K: [
{
( w9 F. v- ?. W `, D5 ?8 P
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 P/ x$ t: `, n) O
(EDMA3_RM_EventQueue)0,
) ~) I0 r, I8 S" P
&edma3_isr, NULL);
! J7 n. g' B f' I
}
8 W/ T& N5 R; X
) q/ l/ t0 x! R! V% C+ N& `* d
if(result == EDMA3_DRV_SOK)
$ R6 y4 [& W' i& W E! w1 v
{
3 y; k- @) p& \" m
paramSet.srcBIdx = 0;
/ A: n5 r5 H7 |2 k
paramSet.destBIdx = 1;
. k9 M0 K1 o/ x0 ^9 m
paramSet.srcCIdx = 0;
( X: x9 {% X8 c) }7 @ M
paramSet.destCIdx = 0;
4 w3 d9 Z* m0 n) C: X( C% o6 H
paramSet.aCnt = PING_PONG_ACNT;
; L- W, D3 p% I& a, d& ^6 r
paramSet.bCnt = PING_PONG_BCNT;
; j b8 [+ w, Y. d6 L+ u( |
paramSet.cCnt = PING_PONG_CCNT;
9 A) x3 K* h! m& t
|) g t- O$ N& k8 d! D# L
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 ^. w$ I) k. U i3 Z- o
paramSet.bCntReload = PING_PONG_BCNT;
* p# R' A+ m1 p" g- O4 e& E$ @
U& c/ [; ~! M* G& x: S X. L
/* Src in constant mode Dest in INCR modes */
1 b- E! W8 c( K' C/ i0 ?
paramSet.opt &= 0xFFFFFFFDu;
) [2 q" ~! \$ E. B* R
//paramSet.opt &= 0xFFFFFFFCu;
8 V0 D: M7 l+ t1 M$ G
/ o5 \0 H2 g* S: H3 V: a* h
/* Program the TCC */
% x' x6 z0 \* [' u' T
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 S) @% Q- y; _, G0 T
% S$ j" s% U! N
/* Enable Intermediate & Final transfer completion interrupt */
7 Y2 @3 m4 {! I5 i+ s% u8 A, R
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( h% r; i1 j& @) l0 C3 D R
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 g- G, ~1 T# e9 W
/ d4 [) _* W9 P1 Z7 t* E
/* AB Sync Transfer Mode */
6 b2 A( O, E- w# y' o
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 P% H( l w: z4 c \
& I7 B( Y: V; _/ t5 v4 r
/* Program the source and dest addresses for master DMA channel */
k0 G4 k* K5 |9 Z7 B# I
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; g$ y) p2 d1 g& _; r6 @
paramSet.destAddr = (uint32_t)(ping_buffer);
2 r" I1 |( P# P1 S9 b! J
% y" ? R& b2 J; o! I+ {# N
/* Write to the master DMA channel first. */
1 y3 ^, k6 A+ v! v
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 D6 z7 ^5 y4 p/ Z5 j
}
2 U4 D- Z, V$ b) I7 o* I, k2 M5 x
) k1 x) v4 r: V7 X& u9 G& J
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ T0 M! F" A( H$ _/ `3 S& d0 O q
9 f: r4 m" s" e+ f
if(result == EDMA3_DRV_SOK)
4 y5 W1 f5 Y' r; A6 H3 K* Z
{
. X$ I. ~& i9 H' E1 l
print2arm("edma3 driver init success.",0);
X9 Q3 l6 ^: o% o; Y
}
9 D5 F' m4 H1 x( t4 f% V
}
4 S, J* y! N& Q
: d5 B1 @/ L5 _ S! u
) J$ p4 a& G" m2 R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: P( I& [: O' i
& o9 H$ l+ M. \
. \/ M- c+ z# O
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 E) a9 ?# f/ R; G. l% f
每次DMA传输完成后都要再次使能传输
$ q5 ?$ j3 b# y6 s
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4