嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& ^. W# e# }# d% S
#define PING_PONG_ACNT 1
8 N0 U( j3 x' {9 ^3 l
#define PING_PONG_BCNT 8*32*40
% j' k H( g; E4 o6 ^
//#define PING_PONG_BCNT 1
% \9 j+ D9 x3 S
#define PING_PONG_CCNT 1
) ?1 G& ]0 X% @" m* H# I
#define MCASP_BASEADDR 0x01D00000
6 P* h1 T+ D- c) ^2 p9 ?! r$ m9 _
#define Mcasp_RXEVENTQUE (0u)
L( R& ]7 D3 ~1 `* U& B
' d; {& k; y0 @/ ^8 Q1 @
/* OPT Field specific defines */
. |2 L4 o- c j
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# J; O- R" e( F
#define OPT_TCC_MASK (0x0003F000u)
& e/ Q2 g$ h$ y% p8 e: Z8 {
#define OPT_TCC_SHIFT (0x0000000Cu)
# e+ Q3 w, W( U/ V
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& e$ J& [0 Z" L
#define OPT_TCINTEN_SHIFT (0x00000014u)
: Y/ @4 F7 I+ N* R
! c; y X; @3 A- H# y3 b+ y6 e% K
char ping_buffer[PING_PONG_BCNT];
( x- {) z3 q) J* @1 n H4 U7 ]
char pong_buffer[PING_PONG_BCNT];
) }6 v+ I' h% j- T% z
) d4 k8 L6 g* N3 k0 S
3 u2 m: J. U2 R9 O
* S; V4 F3 a" u4 f7 i0 p& C, M
0 l% |, |7 i, e2 S0 o3 v9 f8 C; }
static void ys_edma3_init()
8 F+ W* J5 u% f) R3 y
{
4 D! ]; c4 @ B I# I
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( V" q- k7 \( q/ @2 w6 ~1 Y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ Q0 s( _7 }, t/ `2 T
EDMA3_DRV_Handle hEdma;
* k+ h M# j2 o& R
uint32_t chId = 0;
2 j' K4 k/ C6 U3 ^% n) Z
uint32_t tcc = 0;
6 u; Z' c8 u. E* V
' x9 w- H2 W. J, f0 F' c
print2arm("edma3 driver init...",0);
1 t: Z1 h; v, `0 `7 T G
! B" }2 `& c1 l" ~$ ^, [2 C
hEdma = edma3init(0,&result);
% C. j' g' V4 \% c( ~
if(hEdma)
. p. g' @9 Q# q; l, R) w" D
{
4 y' M; t7 w% p, N- C7 C r
print2arm("edma3init() Passed.",0);
, t3 y6 t$ O* W9 x9 V3 W
}
) Q; W. ~0 F2 {) {9 J" C3 v+ m( F( b5 J
else
- ?6 r& @7 ]7 k1 D
{
/ W7 |& u0 u4 G9 s- ^, l
print2arm("edma3init() Failed.",0);
9 e! e. N3 y% S8 A( c
}
7 g6 D; D+ i5 k- A7 z' l
- q7 w. \* {' ?2 G$ B. F2 t: F
if (result == EDMA3_DRV_SOK)
8 B9 }" v, C6 ?# I# V; P! O5 q* y
{
$ Q$ u7 A- V9 m
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( k% s2 }' {; ]) J- n9 ^
(EDMA3_RM_EventQueue)0,
# k! t/ o5 S' w; P h1 E6 u
&edma3_isr, NULL);
& k" E3 \ N' Z, A& r0 E+ r( i) k6 K+ o$ N
}
0 u: {7 p2 a* D, S1 s
& U( E6 M; d6 N* }) z3 ]7 z: u M' D
if(result == EDMA3_DRV_SOK)
, t5 O7 v7 l0 z+ _* H
{
" I# D' M. z% q4 R& t3 G8 G# k
paramSet.srcBIdx = 0;
& N" Z% Z# X& R1 @/ E; M
paramSet.destBIdx = 1;
& V) \" S% k5 R9 v0 Z, |' y
paramSet.srcCIdx = 0;
, Q- w1 X+ y y8 T) q% T; o4 Y
paramSet.destCIdx = 0;
& P- p) B( R6 K2 x# ]0 O
paramSet.aCnt = PING_PONG_ACNT;
7 J" h- m, X% h2 y( U, h
paramSet.bCnt = PING_PONG_BCNT;
; o6 g2 x7 w* ^ ]$ q1 ?9 a& _* Z
paramSet.cCnt = PING_PONG_CCNT;
/ J3 m) y0 c3 h
0 J% K4 W1 `, ^( N0 f5 ?
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 r) _2 J, `/ W& S0 t
paramSet.bCntReload = PING_PONG_BCNT;
: G( C. Q Z; _( f p) ^& `
% i8 m4 g) R) U
/* Src in constant mode Dest in INCR modes */
1 F( y) y- }; Z; r
paramSet.opt &= 0xFFFFFFFDu;
: ]( i# e3 H4 Z
//paramSet.opt &= 0xFFFFFFFCu;
6 V' x; N" j6 I1 ~6 {3 x
% C- H3 d9 s, G/ _7 \
/* Program the TCC */
* N) i# c- m( k. v+ F- \
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
- Z& z# l" q4 m
' [9 s& D6 W! A
/* Enable Intermediate & Final transfer completion interrupt */
) \' J8 ~9 a" S8 F8 D# s* `. L& P
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, G+ i5 e0 q2 h- {
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: m! q# y+ x% M, g5 \6 z9 p! Y* R
% l) E6 W) G( R0 _7 w4 b! i# A
/* AB Sync Transfer Mode */
4 v# R# P" v* b" e( H, z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# p% u5 E3 _1 G/ D8 D# ]5 p( l
$ q* J8 R2 \% Y) C @; b- A
/* Program the source and dest addresses for master DMA channel */
8 i/ W. U7 N, ~& t t
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ h8 l" V5 e* o* r; c Q
paramSet.destAddr = (uint32_t)(ping_buffer);
9 P+ i1 N( _6 B7 b) ~# ~' p
+ o; v3 p$ K( v) u2 k, e& W0 h
/* Write to the master DMA channel first. */
1 ` A# c- E% @" X3 C. Q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' F- i0 `9 a0 _+ ]5 `
}
' X' Z8 i) d3 Q+ H% x c
) |. I- \( q4 T
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% K- M; U7 V0 K' r
& o0 W) d# V1 r! C# G, V" _
if(result == EDMA3_DRV_SOK)
' M7 V0 z: A5 S+ y+ D9 [
{
7 O3 B" m9 P z) y. U& t
print2arm("edma3 driver init success.",0);
* I& x3 P+ g4 z, B. r* N" Z3 F) d( r
}
' Z, [* A3 ?& d f" S$ ]
}
9 ?5 h) @' s, s* z
$ J: Q" q0 o( i" [. J( t5 k& v
6 r9 @& b; V; o& t. A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 S; a) a8 J6 ^$ t7 A
: Z2 D$ s2 A4 N; I9 u$ [* Q
6 T G+ Q5 D' F8 u3 Z# t K) ]
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 m" r ^9 P) B
每次DMA传输完成后都要再次使能传输
' I4 R! R. L7 f4 N. ]
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4