嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; _9 x& e$ _7 N& m5 \4 f
#define PING_PONG_ACNT 1
9 I) i1 Q7 q$ V1 a: i
#define PING_PONG_BCNT 8*32*40
* v% E" b+ A( a4 e1 ^1 \
//#define PING_PONG_BCNT 1
6 `8 D: }" c4 y$ _% b
#define PING_PONG_CCNT 1
7 x/ S% j. `" [0 W6 X
#define MCASP_BASEADDR 0x01D00000
3 m3 x7 m: ^2 L% [
#define Mcasp_RXEVENTQUE (0u)
3 \) m& G. P1 e6 |1 T$ h6 H. j
4 \& I8 Q5 J3 K% `7 C3 M1 E
/* OPT Field specific defines */
2 j n3 N+ O3 G' |/ q. r
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" e$ z- s. K5 }
#define OPT_TCC_MASK (0x0003F000u)
/ ?7 x. z5 g& M/ [0 M& W/ f
#define OPT_TCC_SHIFT (0x0000000Cu)
1 o: F% s+ q4 ?5 @6 q F
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 G, N+ O8 W1 @+ {# A' S4 O
#define OPT_TCINTEN_SHIFT (0x00000014u)
: g) j6 Z& z0 l) s( u
+ r+ N9 {2 j9 a4 w- I7 ?
char ping_buffer[PING_PONG_BCNT];
$ `9 }3 }8 ], i1 B/ b1 b! T
char pong_buffer[PING_PONG_BCNT];
& A6 Z( c/ i/ ?9 B4 u
, \2 Y7 c( A6 ?- S: h$ L+ a
. L, z( n0 \6 d* v0 {1 q) g5 h( {" x& X/ K
6 p+ f, G4 X7 q2 H3 K
x# M5 z2 b3 w2 L$ d a
static void ys_edma3_init()
- w5 }4 {( h a, ^; }& q* U
{
" Q |6 m& j4 [7 y+ k! H
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
7 d$ f8 r! u% o: l' [& G
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
, |* Z5 H2 r) A! @1 a) P
EDMA3_DRV_Handle hEdma;
: G' U* l: D! f; W
uint32_t chId = 0;
7 \: r2 o- S" J R6 u6 Z8 J
uint32_t tcc = 0;
4 G* D0 r2 t4 E" @! V. A
" q: F8 T" p& a/ z
print2arm("edma3 driver init...",0);
3 J# D3 { d$ A
- p( K* ]* }4 b% n
hEdma = edma3init(0,&result);
6 [% s6 M) Z0 X
if(hEdma)
4 |6 B0 Q/ j5 g: z% b x! s
{
) Q% V. O3 C' n7 p- f
print2arm("edma3init() Passed.",0);
3 h! L8 M6 y0 g) d# G
}
/ T& \9 V9 A, `6 a9 S" o; a
else
6 Z& G) c% j# a1 r+ g0 F9 U5 [
{
1 l) E* j- Z- b+ Z8 J1 a
print2arm("edma3init() Failed.",0);
_ ]( t s: K9 m5 ]7 z
}
/ ]+ d# I: a7 o( b2 m- l
J# ?2 u; Q6 [/ y% i) v9 n
if (result == EDMA3_DRV_SOK)
9 G! d9 I, Z% K
{
7 z7 \8 }% g# _! ~3 q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
U+ U! u7 g8 Y# `: g$ Z) J& P
(EDMA3_RM_EventQueue)0,
. K5 J" G: ~+ x$ y+ r8 k
&edma3_isr, NULL);
0 V3 t& [ F' \
}
( _8 m# [7 g8 s/ u( _! x2 E
! x: Q/ B o% t; l9 y( _( R
if(result == EDMA3_DRV_SOK)
4 n$ {# w1 n( Z9 h
{
3 Z6 Y2 N+ d* B" L$ O; z! x0 P r
paramSet.srcBIdx = 0;
' k0 A* J- ~" K3 @
paramSet.destBIdx = 1;
2 _) K9 K6 P1 {$ a' q! b W
paramSet.srcCIdx = 0;
* k: v5 z% ]8 B4 k3 t! s E
paramSet.destCIdx = 0;
- o& ?: }1 M& \; ^: t: x. S [; g
paramSet.aCnt = PING_PONG_ACNT;
4 q7 @5 r# r Z' x9 U2 c2 O
paramSet.bCnt = PING_PONG_BCNT;
( w, ]8 k8 E2 U0 [
paramSet.cCnt = PING_PONG_CCNT;
0 b( A* g) H) y7 q1 N7 b
& h6 Z& P: L9 f
/* For AB-synchronized transfers, BCNTRLD is not used. */
1 D$ U3 X M& J
paramSet.bCntReload = PING_PONG_BCNT;
l' U6 w% h9 k/ ~- ?
1 H# R5 P* i E
/* Src in constant mode Dest in INCR modes */
4 F) {$ \" b$ F5 F. X
paramSet.opt &= 0xFFFFFFFDu;
6 f, I5 Z8 @# h" u: }1 n: D7 n
//paramSet.opt &= 0xFFFFFFFCu;
6 O3 d4 M/ L9 C' u& ?
& {; U( m/ ]3 z7 ^6 L
/* Program the TCC */
2 t- s: p) t0 W( i2 H
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ [5 p7 `' q( W2 M6 C
6 v8 R% a8 S7 e0 M) {' N2 L
/* Enable Intermediate & Final transfer completion interrupt */
5 X0 q6 `( Q) z) Z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 }; ? M7 O2 @/ A
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! }" o/ q) I& U, Y+ z- z. h
% o w" w- l+ i% E" U; h
/* AB Sync Transfer Mode */
$ |2 E) e5 x+ h' g( r. t
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
Q c& q( Y# F' T
! ~6 m! J1 P/ Y
/* Program the source and dest addresses for master DMA channel */
( y+ A# w$ ^" h0 c1 C; ^+ g- n8 b
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 W6 E0 S1 z, P6 b
paramSet.destAddr = (uint32_t)(ping_buffer);
6 q* B7 R9 E: N3 R
% A5 {3 `, V6 J9 ]6 q6 S+ A
/* Write to the master DMA channel first. */
7 S- {* z: b7 P7 Q9 l: Z8 @3 u! y
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 |4 P4 Z6 b$ N* M
}
5 M+ x) T7 P1 W
1 v2 U$ j) f- B! O% t
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; {) [* J' g4 C
% } X) E* m8 l$ \" G0 w
if(result == EDMA3_DRV_SOK)
: u9 O& g! I, P" _+ S, O3 L u6 o
{
5 L% s: a; J& h$ B" G5 P
print2arm("edma3 driver init success.",0);
% }7 N5 K& p- A* D
}
8 t6 s" {$ c y( z3 l' e8 s
}
: N0 Q1 d9 H9 g
1 {8 Z- a; d" ^$ U1 \5 z
- }& H# B! [$ d ~: p5 U6 m
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% ]0 w& ?( c( e$ L6 W( L. b9 t
4 z: B6 d+ O- K: X- N Q1 O5 n
' O8 V) Z! U' P# h
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ M; d0 }/ A: j
每次DMA传输完成后都要再次使能传输
1 k+ F7 @% s K8 c! M# d
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4