嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' P, R2 N7 h( q% n$ S9 h5 h
#define PING_PONG_ACNT 1
# O# F: ]7 c: e7 Z
#define PING_PONG_BCNT 8*32*40
9 |& v, y1 `! t4 I/ p) Z) n
//#define PING_PONG_BCNT 1
6 ~1 W0 ?( G& T: G
#define PING_PONG_CCNT 1
. |+ ~. z# Q+ A' J6 F3 l
#define MCASP_BASEADDR 0x01D00000
4 c ~8 z+ A, Y2 n" e4 s' ^' x8 l
#define Mcasp_RXEVENTQUE (0u)
: J/ v+ }( m$ h: r. [) z; u' Z$ }, T
1 n, |$ Q# k! e+ L: z3 | C
/* OPT Field specific defines */
5 h- f! h7 q. t& G) O& b3 @
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 z8 N7 s- Q9 v4 b
#define OPT_TCC_MASK (0x0003F000u)
- Y* @" O5 g [5 e0 S
#define OPT_TCC_SHIFT (0x0000000Cu)
/ v5 l2 M% U' x$ H; Q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 r" ~/ c* _$ A1 |4 j
#define OPT_TCINTEN_SHIFT (0x00000014u)
7 d4 X6 U2 N9 ? D `
! V- B, o/ W* M6 ?
char ping_buffer[PING_PONG_BCNT];
. C3 f( ^' |) l. k
char pong_buffer[PING_PONG_BCNT];
* c: n. [ G3 V; `
+ c N7 ~* S S4 u; U1 W; W3 E
% s! Z7 O* b1 t& J7 @4 Z2 }" l
. N. Y# k. V5 I! W8 P
9 z2 m; i/ R4 L( r2 V( j6 h `
static void ys_edma3_init()
& Q' T) ` [" H. Q( w
{
4 p* }- h3 y% V* t. x) m4 ]
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- d8 {# \ T8 a4 C5 s! n8 {
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 b; C" q: x! I0 T8 F3 K
EDMA3_DRV_Handle hEdma;
0 e8 ~* P% H+ [* ]) M1 |% j
uint32_t chId = 0;
: a! Y+ f- `) T9 q
uint32_t tcc = 0;
5 R& y- [3 r5 m
8 m) M% t) I% g" O$ v8 U# \% W g8 }
print2arm("edma3 driver init...",0);
7 j F5 L9 q |( Z! C; |, o
& b( d- f% w% y$ F% C
hEdma = edma3init(0,&result);
* P* m0 D1 ~. [( d
if(hEdma)
7 S6 V0 U5 I6 l3 a2 c$ ?3 c# v
{
c& v4 P) `/ P4 r; H
print2arm("edma3init() Passed.",0);
7 t5 O- q) b- ]
}
7 x% F! t( r' ?: z
else
9 u' }. z( U5 ~) b, S
{
6 R' t/ [: z; [) W5 i7 r4 u
print2arm("edma3init() Failed.",0);
+ a0 M: a _ ]6 n8 y
}
$ L& S7 B9 g+ L. W2 O# s- c
2 K! V0 r5 \% c
if (result == EDMA3_DRV_SOK)
$ z/ o& u: J- A* _5 c( ~; ^
{
7 t* O4 K9 W9 u" a# b; m# K
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ y3 I8 I* }- O
(EDMA3_RM_EventQueue)0,
' v4 G a& A3 a4 o5 j9 l; u3 K0 G! }
&edma3_isr, NULL);
/ _; [0 w, V/ I$ A( j7 a
}
) A3 d% @" l" N( C; T
3 Z/ q: Y7 X2 p$ n
if(result == EDMA3_DRV_SOK)
4 X1 n8 R+ ?% F' e* i+ o2 `! }
{
) f/ [- a3 s4 ]) B
paramSet.srcBIdx = 0;
% p% M7 q9 }$ p2 R$ R: L0 R
paramSet.destBIdx = 1;
& M$ `) T7 t2 Y# e" _$ X
paramSet.srcCIdx = 0;
j7 E/ T) O) @2 V6 o
paramSet.destCIdx = 0;
) |8 c. D8 f. f f$ j
paramSet.aCnt = PING_PONG_ACNT;
' i/ q( {! y! L3 [' d- a
paramSet.bCnt = PING_PONG_BCNT;
- W8 M+ }5 c" T& M% D
paramSet.cCnt = PING_PONG_CCNT;
6 q% f4 O7 m* a
7 [4 A J; F$ H6 G
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 P! q- u/ ?! Q. |9 r- p- u
paramSet.bCntReload = PING_PONG_BCNT;
) U, k% q& B$ b' W
) I: y7 O( T# u! G& ?
/* Src in constant mode Dest in INCR modes */
" t% n" d% K+ y, h; ?! U* |1 {
paramSet.opt &= 0xFFFFFFFDu;
2 @, n5 z% n4 p3 X, O
//paramSet.opt &= 0xFFFFFFFCu;
# D1 A3 C9 t( y
7 L4 E8 C2 i$ h2 N/ O. T) v
/* Program the TCC */
" t/ h p" L5 {1 o
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 ?( K& n& Y( |2 O5 ^3 @5 I
3 X8 _" k- z0 x
/* Enable Intermediate & Final transfer completion interrupt */
" q k1 I5 J2 |6 r0 w& m
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" `* T3 U9 a# ^; g. G. y- }7 a
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- g5 J0 c1 j% ?0 f
# y% b. }! k" N/ |* Q
/* AB Sync Transfer Mode */
8 d* }5 C, R, p: Q4 z P1 M7 y
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ A1 k7 F: P- b
" H; v) u* R% m9 L
/* Program the source and dest addresses for master DMA channel */
6 d: Q w2 t/ q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- N: T& r& n5 w3 }9 k6 E
paramSet.destAddr = (uint32_t)(ping_buffer);
# [8 Y9 T7 }0 d( O9 Q: y
j, x" |( x1 @9 Y! `
/* Write to the master DMA channel first. */
3 h! r) \3 O1 r9 h+ ~ L
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; Z5 h4 T2 Y( F2 }5 X
}
$ C) f! H2 e% S. T& B! o/ B
) r+ h6 z9 a0 @: W3 o
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* r7 W. \ a1 F7 D( I! ~' d
4 m/ [" l- B# I
if(result == EDMA3_DRV_SOK)
! K! k: R8 J6 K w& d
{
4 `" u9 k6 {- m: @7 s) k
print2arm("edma3 driver init success.",0);
z2 q0 h$ X0 B M
}
/ \& \- D' I- T# F8 T
}
$ i* _0 ]- t. a" w! }* x
/ C8 J6 c/ v* O( b/ ?
( o! N* D, ]9 o% b$ ]; C, P
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" m6 k; G* H+ o0 j9 l- X* r( N
) N0 P6 ?. L4 E& F* N& Q5 q
; W s8 j5 l) p5 l5 W4 k. W
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 u/ y W) u/ U" `$ y2 `3 y5 C0 v t
每次DMA传输完成后都要再次使能传输
0 S1 S3 @8 p1 F4 i: T
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4