嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" {; K& N/ H3 ?7 |( V% e
#define PING_PONG_ACNT 1
" _0 e3 X X2 G
#define PING_PONG_BCNT 8*32*40
6 I5 J: d! Z4 b# E: A
//#define PING_PONG_BCNT 1
. V" {: s+ D$ h- F( B
#define PING_PONG_CCNT 1
6 M4 ?+ I1 z$ C( U6 U3 t. u; ^
#define MCASP_BASEADDR 0x01D00000
" j \, T+ x3 [
#define Mcasp_RXEVENTQUE (0u)
) a$ v( ~# r1 [& i- u6 e, U
6 L0 o* y: s: C& a1 n
/* OPT Field specific defines */
; Y5 F; B9 ^- d
#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 `5 c" c& X4 t
#define OPT_TCC_MASK (0x0003F000u)
7 v( H6 }1 F$ J7 B: K% _
#define OPT_TCC_SHIFT (0x0000000Cu)
. ] l8 d* |7 J0 g8 m9 f8 D
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ i" X; v, d4 ?6 x( M
#define OPT_TCINTEN_SHIFT (0x00000014u)
% R$ y# k, G/ n
. J6 g% e! m1 A5 d: ~& ^( a
char ping_buffer[PING_PONG_BCNT];
1 u+ I; t3 a' a6 S& g3 H
char pong_buffer[PING_PONG_BCNT];
* U3 b- n' I- @& \5 X7 @
* n) @1 k, ?& b* b9 r! L
! ?- {$ T; j& O5 F
+ h0 ]7 C' k- W2 J) E4 B
2 U, d% B& Z* q5 ]
static void ys_edma3_init()
# N1 M3 j+ M' r7 c( K3 O: ~; e
{
9 [& h4 M) [' V, c; j, q4 ~
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: ]/ W( W( z$ v+ `& }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# h) `# h" B( y6 q: \
EDMA3_DRV_Handle hEdma;
z, ?" a" l1 D/ f5 { h# O
uint32_t chId = 0;
# U1 O2 R, Q6 ~& w7 [# W) J
uint32_t tcc = 0;
' Z( z* @4 v# N, K% D
4 E: d7 R8 X, g: A* w* r
print2arm("edma3 driver init...",0);
! ~6 c: A$ z0 {! |5 G$ u
7 o4 `, c6 p1 M4 o7 l1 l
hEdma = edma3init(0,&result);
# r6 a% ]0 ^: Q8 {4 j; O/ t b" `
if(hEdma)
; K& N$ ~4 c/ t0 m# j) T4 p
{
7 U: g7 E0 S, o4 Y
print2arm("edma3init() Passed.",0);
, p8 n1 g# T2 V2 i* K
}
9 T0 p5 ^1 b" H- m
else
, R6 r) `# r4 W+ p8 c/ {+ P% _# p
{
' W. ~4 Y# r4 z8 D! D( J2 j
print2arm("edma3init() Failed.",0);
# |, j* t7 K' o6 [" ^, \
}
4 F4 Q) l' d* p9 m. A* Y
! b W6 y8 ?3 D- T% |& |4 E
if (result == EDMA3_DRV_SOK)
# S7 f2 T! Q- Z( V X! R. ~
{
. m; _+ M, ~( Z/ P5 I' J; z
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& c; r. \+ ~4 R' a/ o
(EDMA3_RM_EventQueue)0,
/ w7 s, u' S2 ?# [
&edma3_isr, NULL);
: f: F- U$ M/ S% j
}
3 B2 G5 O( I& C6 {! }4 `
1 x7 p: D, Y! |
if(result == EDMA3_DRV_SOK)
8 ?0 D# J+ W7 J7 L: w
{
. }; Y! [ `9 z M* S6 u& \
paramSet.srcBIdx = 0;
1 h: D9 C1 r; V+ J- @3 K6 z, l
paramSet.destBIdx = 1;
$ q/ x! w* y# t8 T2 \% o
paramSet.srcCIdx = 0;
6 p4 ~* r% N& A: N2 T" e
paramSet.destCIdx = 0;
) _; r f4 y3 Y% F8 L0 F
paramSet.aCnt = PING_PONG_ACNT;
7 _! K. ]. I, j# h( S/ K, n/ ?
paramSet.bCnt = PING_PONG_BCNT;
$ w& q2 Y: P7 @( J
paramSet.cCnt = PING_PONG_CCNT;
$ f, @0 S$ N( C( K, i* e8 U5 B
# q6 C8 y8 |7 r+ {4 T
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 q/ x) H* Z) \ K+ ~- j' u! E* R
paramSet.bCntReload = PING_PONG_BCNT;
1 N+ x3 V Z0 k, {5 @; }7 ^& p) N
6 K4 |. m; P D4 |, ~- E- c
/* Src in constant mode Dest in INCR modes */
; F. a/ _/ G: e; c3 ?" ]
paramSet.opt &= 0xFFFFFFFDu;
- m! z" g9 f( `" ?8 u3 I
//paramSet.opt &= 0xFFFFFFFCu;
; A a! u8 f) W/ P) R1 |2 L" Y
" i. b4 i7 r- m2 w, d% D. V6 r" f
/* Program the TCC */
6 T; l: p4 d, d! a% O- r
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% V% z9 _8 p" F+ y% ^$ l7 p8 y
/ G4 A+ ^! r$ ?2 M& m& q- k( x
/* Enable Intermediate & Final transfer completion interrupt */
, L( c' B( m5 x# }/ H
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 x+ B. D! b4 p3 p) i5 K
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 ?# \! S2 _% R' ^+ L
9 M1 F. ^6 n: w8 r
/* AB Sync Transfer Mode */
, I4 g `2 w/ K5 t
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ a# R# t; |# b+ n; v9 B1 N
! J$ u& J) u0 }
/* Program the source and dest addresses for master DMA channel */
8 ~2 K- {$ S+ p4 i0 M. \+ a! E3 ~. a
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' d/ o5 q7 g0 \+ o
paramSet.destAddr = (uint32_t)(ping_buffer);
+ Y/ B( ^' [5 c2 p/ V1 {- I! N2 L
0 q1 P" |4 e# L) N- d- p* I+ c
/* Write to the master DMA channel first. */
: M9 h1 f+ G9 u: g
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' l8 T9 ]1 O* _" f
}
R4 v4 s# d% K( i0 O& J
# ~( V; m- P( O+ ?) Z" R$ c+ P
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" ^, ]6 M5 z" Y$ c: ^9 H- e
% s! K# {! O3 V9 c6 i) X3 I
if(result == EDMA3_DRV_SOK)
" ?9 F. B, O/ |3 @# A0 l
{
% W6 [: p& Y- z3 M6 x6 r3 V
print2arm("edma3 driver init success.",0);
3 V% {# B: I3 j. q
}
+ \1 G. n3 G ^& S; C3 {7 [- A, {/ o
}
# `1 C$ z' M3 S2 v; o7 e) y: j
7 p5 S. E& ?" S5 G9 e# }4 L
2 B( X. p- G" I# b' Z1 X
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- k( \# L$ Q) f& }- M* g0 z& z
2 s9 k# B$ ]. i7 R9 u' Y, A: j+ L* l
0 \: y- g: U" m9 a/ w7 F: I, N
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 p& I: Y8 F3 g& P' A- l p
每次DMA传输完成后都要再次使能传输
# C, a8 H; K' u9 c3 M
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4