嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 b- J g# ~: y+ F, O9 }
#define PING_PONG_ACNT 1
9 ^& e' B' Q0 i- H1 P7 e0 i" ]5 p
#define PING_PONG_BCNT 8*32*40
# I1 ?( f0 \4 O5 z% L& I( X
//#define PING_PONG_BCNT 1
% @9 `" z4 W* {' B0 \4 l& l3 F
#define PING_PONG_CCNT 1
' j* G1 V- `! T/ y; z* H, z
#define MCASP_BASEADDR 0x01D00000
5 P2 g' o9 ^: M9 l# n. G1 P- n0 S
#define Mcasp_RXEVENTQUE (0u)
3 g4 u$ X+ A; V; p
, V6 R9 k. B: X- M1 p
/* OPT Field specific defines */
) W- \" N; Y( |6 ^9 {' t. N
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! N/ F H: ~ o2 @! ~( u; r) |
#define OPT_TCC_MASK (0x0003F000u)
! j8 B3 c- k2 h+ {: i
#define OPT_TCC_SHIFT (0x0000000Cu)
8 N" V) q/ ?' X- d( \* n- h
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' T0 c! o7 S3 D( F6 i& a0 `
#define OPT_TCINTEN_SHIFT (0x00000014u)
8 e0 i) T1 ?; P4 ~8 t
: G& l' F' W% E. D, u$ S1 G
char ping_buffer[PING_PONG_BCNT];
4 E: v$ N6 Y; V7 d7 r6 w5 ^! h/ e
char pong_buffer[PING_PONG_BCNT];
4 u9 n- {+ v% E. @4 w$ E4 ^
2 W* u% s9 Y% X7 ~: p
) ?4 ~* z, a. _
" M9 }2 ^: y( o! z5 I
1 F9 x6 e/ E; r* M$ p
static void ys_edma3_init()
) c! w+ M4 Q0 m. l# w& v
{
' G }5 ?1 g+ R
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- o* C5 O$ m: w* V1 ~( ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 M) x) V, z& L) H d; n
EDMA3_DRV_Handle hEdma;
* i( C& n4 s; n
uint32_t chId = 0;
: ?$ y, u6 V; t* Z
uint32_t tcc = 0;
: ?6 U; ]) k8 f- J4 z" o
* J, S a! B r* Y- [& w% D* B+ z
print2arm("edma3 driver init...",0);
! E+ C) h1 ?0 c, n
5 O: P$ k- e' R, m' _* w
hEdma = edma3init(0,&result);
7 Y6 p" Z F& @0 Y
if(hEdma)
+ S1 \' d% C; l5 A$ }
{
/ G( S5 t ]0 @( O( k2 S
print2arm("edma3init() Passed.",0);
& |# \( j# ~7 s4 u: C/ r& b% c8 ?
}
/ f8 u3 T* b4 a+ S
else
) i8 H) C* w$ y# t* H
{
" @) u. z% _1 F
print2arm("edma3init() Failed.",0);
3 M8 c" o; [5 Z- j9 _" Q1 k2 o
}
+ J* k! Z g7 o0 C
$ T+ b% S( K, h* L. p7 Z
if (result == EDMA3_DRV_SOK)
8 K" A" C: V S0 d' C: P2 {
{
# T2 ~- m/ O6 d! U8 _0 H P
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
O$ x3 M, p: S ~$ l3 E: G3 w
(EDMA3_RM_EventQueue)0,
2 _6 f3 u7 [: S( z6 |3 Q0 h
&edma3_isr, NULL);
9 L3 [5 i- N6 `% [
}
4 l+ U0 z$ Y7 x3 E. @
4 z& | N" B& \) N) c7 G* K" N9 i
if(result == EDMA3_DRV_SOK)
! L5 c3 k+ y- c& @/ h* Y( R
{
& q# l; E% _8 O. U5 j( C
paramSet.srcBIdx = 0;
0 J2 o! E; u3 G) p9 ^- K j
paramSet.destBIdx = 1;
0 }: Q. N& Q0 N7 ?: y
paramSet.srcCIdx = 0;
3 _2 M: t0 M. c2 q
paramSet.destCIdx = 0;
% D E( ^% m- ^
paramSet.aCnt = PING_PONG_ACNT;
+ {0 k( X- z8 b. ~. \
paramSet.bCnt = PING_PONG_BCNT;
. y/ F. G* u+ ]
paramSet.cCnt = PING_PONG_CCNT;
1 D5 G% N y+ Z2 i; N9 ?" @
( A$ p2 j; A7 A7 i9 N4 O
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 P9 m; u2 m/ N# E) X$ R
paramSet.bCntReload = PING_PONG_BCNT;
- N1 I1 @. E7 w: Y
& I0 [5 @1 B% N# o0 i; p
/* Src in constant mode Dest in INCR modes */
/ G3 j3 {6 x" C
paramSet.opt &= 0xFFFFFFFDu;
' c/ a- v/ g9 W$ z) R' ]
//paramSet.opt &= 0xFFFFFFFCu;
6 G i: _! H; v) Z6 Y; m0 `
& l8 J" E- t/ k3 {( s; n8 ]
/* Program the TCC */
$ K/ N& _& z2 r% q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" J2 x5 \5 e! C( w2 e5 @0 a
7 N9 G8 C! x; K }
/* Enable Intermediate & Final transfer completion interrupt */
) e9 ~5 X [" j8 x6 S
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' {9 J2 w& M" Q* p% l
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 \6 A, o) s) P; E6 ] \8 F7 ~
# m$ \& B% [8 U, j' [; M4 W$ u1 U
/* AB Sync Transfer Mode */
) n9 J; l/ _ u* ?6 s
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
v1 I8 r5 ~; c I% i0 M% j6 m( B
* D( a: P5 s1 w% ~% N
/* Program the source and dest addresses for master DMA channel */
4 N7 Z, h& @. h2 g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
/ k% e# b; ]- k1 X9 R7 }- Q
paramSet.destAddr = (uint32_t)(ping_buffer);
; M! D5 q8 ?* c* y1 h
# D& k, g( g* E; w* d
/* Write to the master DMA channel first. */
+ o5 l( d- c' Y) B: d$ [4 k
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. k5 U- l. W+ M3 g$ K- G3 u' t
}
) c4 c- G* h8 A3 j9 e" s9 c
$ a6 B: V: t/ d5 O( y. j( n
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& J4 ^. l- G; S5 E) [
+ P- ~2 p, A" M, i" o
if(result == EDMA3_DRV_SOK)
* q4 X5 k+ o" M% F% Q2 ]# O8 \2 O
{
9 H9 X4 x; e% `% q9 ~* e& n# O3 j
print2arm("edma3 driver init success.",0);
: w) C& O& j9 O `; |
}
1 O* q/ I3 f4 a' i+ ~5 L
}
6 f& H% d2 O4 P5 I* U1 }6 i7 ]3 ^
. T) Z4 T z' p8 |1 }( k2 r
1 L6 p' Y$ C! b% s( v# z5 i# C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( q, {! L5 Y/ v+ _1 V
6 k: R0 P" V& F& t& x
4 b' ?7 x3 K8 o2 G/ L
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ ]$ i" `( s% }0 d" c3 F: R$ h
每次DMA传输完成后都要再次使能传输
# A, v# c5 f$ w5 _; T. ^+ m: I
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4