嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 p6 `& x; h1 ?2 E/ k' X0 W2 A
#define PING_PONG_ACNT 1
5 y% o% F$ t/ G% Z- w9 s# B& L- A
#define PING_PONG_BCNT 8*32*40
% Q& W7 _. u7 R( v' o$ u8 a
//#define PING_PONG_BCNT 1
& G! K+ R* {4 r0 e+ d- J
#define PING_PONG_CCNT 1
& S: N5 D& A) c4 x. _1 ]1 b
#define MCASP_BASEADDR 0x01D00000
) ]9 H* t) T9 d# n
#define Mcasp_RXEVENTQUE (0u)
( h4 u' ~8 Y, O" X/ A6 z
3 s( ^6 r/ |8 L1 P, \- n6 u m4 }4 R; l. i
/* OPT Field specific defines */
3 s! F& F7 E6 P$ S
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, I$ c3 m2 ?9 G5 W
#define OPT_TCC_MASK (0x0003F000u)
' L, Q" N O9 v- T% w' q" H& m
#define OPT_TCC_SHIFT (0x0000000Cu)
9 i, y* O9 B& F2 `( F
#define OPT_ITCINTEN_SHIFT (0x00000015u)
5 Q* P' q: }3 a3 y/ v0 R- b6 b* w
#define OPT_TCINTEN_SHIFT (0x00000014u)
* k- |1 T! [$ D! A6 a# K1 f2 h
9 L9 u0 H0 U, Y8 A' ?
char ping_buffer[PING_PONG_BCNT];
+ f& O8 x6 k& s8 W" X3 v
char pong_buffer[PING_PONG_BCNT];
1 Y3 p* n9 \: v' B, R& X& p6 B
( V a& L9 R- x" @
; K5 B& x8 s1 l$ Y% `0 z+ Q
+ X5 x! q# a) x8 Q, p3 o# ?6 }
1 E2 Y/ i& E5 }1 h6 a
static void ys_edma3_init()
5 R9 @/ C! N' \
{
# I6 a& s- U7 C: [
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 Z9 T9 ^" V& o' l& w, z7 `7 E' D+ \
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 l! l! r0 ~; |( j
EDMA3_DRV_Handle hEdma;
7 s: B4 \9 S; F, ]4 U& h
uint32_t chId = 0;
$ M" D! Z; y$ K2 k/ n9 A
uint32_t tcc = 0;
$ c. O2 A! }: Q3 x* r
6 n) U: [ T% a* I6 p. U2 v! Q
print2arm("edma3 driver init...",0);
3 ^3 d) T" @; a6 g+ H
5 p5 ?: C4 h$ o. E0 k
hEdma = edma3init(0,&result);
4 Y5 u7 |3 J3 Y1 C
if(hEdma)
8 a: ^3 o5 e: h: A. _8 N' x3 Q
{
: u" ]4 J5 k! h$ _6 [6 _' `2 |, C
print2arm("edma3init() Passed.",0);
8 W y6 i i7 K& U' ?8 L9 `
}
6 L" R1 p6 T0 s% c% s
else
5 n" r9 h v8 Y! B2 N. s! B
{
2 o, F+ T7 h" C" [
print2arm("edma3init() Failed.",0);
+ ~9 u7 z1 T) J( Q. \
}
0 L4 B/ t8 i; G. U p
' |9 D( n$ X; ]1 \! O# b
if (result == EDMA3_DRV_SOK)
' B9 s6 }+ i4 w* g' f
{
: [2 V- u! J7 B2 a, x- e4 l6 f) j
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- z. i- c5 |5 g2 h) M7 G
(EDMA3_RM_EventQueue)0,
7 r8 V) d% }% k
&edma3_isr, NULL);
8 z! e, ^, H5 H) g0 _6 \3 W
}
) |6 c4 G1 L* H! `
2 i. C) _$ A' f- Z: R
if(result == EDMA3_DRV_SOK)
1 |4 [5 ]8 ]% v7 _+ p: q3 J
{
; |4 m# a' l! Q4 l) `) }
paramSet.srcBIdx = 0;
/ O& l- A$ F4 i% O
paramSet.destBIdx = 1;
. V+ h. x8 D5 a
paramSet.srcCIdx = 0;
( U- ^1 V, v w! W- _1 M
paramSet.destCIdx = 0;
5 f" }5 ^. F6 [ P! [
paramSet.aCnt = PING_PONG_ACNT;
" c4 v$ E' u1 h. n e+ e
paramSet.bCnt = PING_PONG_BCNT;
/ c& R. F; x$ q" T
paramSet.cCnt = PING_PONG_CCNT;
3 O, P8 Y# @# T+ ^, p0 G* E" p
4 s7 S/ f& D- @9 ?
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 O! j* ~' ]/ t* t+ F6 ~4 X
paramSet.bCntReload = PING_PONG_BCNT;
; A2 n: u% U& a% e
. {) X2 x, h/ U" g
/* Src in constant mode Dest in INCR modes */
* X2 h( O- e) X: D( I+ \5 K
paramSet.opt &= 0xFFFFFFFDu;
7 d Z2 d- y+ o/ [; x
//paramSet.opt &= 0xFFFFFFFCu;
5 }! F' e# o9 ^* w
/ V i" K. N$ |* x5 Y
/* Program the TCC */
9 j+ d! e. h& i4 S3 j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 ], l; Q$ c; c' r; Z/ [
' }7 G8 G" j2 l/ E
/* Enable Intermediate & Final transfer completion interrupt */
4 f: q$ l! l( U. Z( ]$ p$ s0 ~* P
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( b9 T5 W* Q! T; c5 G
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ y/ p3 r$ n- \2 T
( I" q; Q2 B! x1 P* a' `
/* AB Sync Transfer Mode */
: S1 }2 G3 v: {, o
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% b* z' V& V4 ]
$ V+ r' I- R$ a- T5 J! `8 o& [8 T
/* Program the source and dest addresses for master DMA channel */
7 B/ k8 y* a/ G0 X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
{: \# ^! p4 K- t, Y% L
paramSet.destAddr = (uint32_t)(ping_buffer);
0 }5 h$ z9 Q5 P: I. I' v' K% e
/ B) `+ g" |+ g1 g, r; ]6 d
/* Write to the master DMA channel first. */
9 A) T _; N' g2 H7 Z5 X
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
/ P; s0 S* h. v" i) t6 ~4 V, C
}
1 f: V4 Q8 c! @; L {4 k, ?
7 b3 T0 O3 T* U+ `# F& l* Y" d: t' w
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 u2 E/ K0 ~6 M& E; ^
1 ], U! M1 r& p
if(result == EDMA3_DRV_SOK)
+ E; w! _& m4 ^* Z5 t- L; p
{
$ s$ [! H9 c" L# G- ~& m+ M
print2arm("edma3 driver init success.",0);
: ?5 s; Y% D+ M; Q2 F
}
4 M6 a* T9 g/ u0 p! P0 ?' R0 t
}
1 M( {; `/ X. K
. K$ Q( ]) ?5 L) x( ]: l5 E
; p: s# ^1 N0 m8 ^
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) i' O5 ?2 M$ I; R- S" _9 p
! ]8 g& W7 G. t
, ?' o! X3 B7 }
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
q3 U( A @) o e) |& l
每次DMA传输完成后都要再次使能传输
9 g X x, t/ t
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4