嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 F' k( V6 \+ C& a$ E r
#define PING_PONG_ACNT 1
% F- j& S7 U9 w# w$ q
#define PING_PONG_BCNT 8*32*40
* A8 R! H( ?& y1 z6 k
//#define PING_PONG_BCNT 1
+ `. [& A1 _' \: a! y
#define PING_PONG_CCNT 1
5 t4 ^- y- A- U
#define MCASP_BASEADDR 0x01D00000
$ K& d/ O. C" Z% c4 @$ s
#define Mcasp_RXEVENTQUE (0u)
$ C" r' L6 ?) r& B5 S7 F
" i& u, y8 z, n% P. x, m% i
/* OPT Field specific defines */
/ W1 j! j/ W9 s7 N
#define OPT_SYNCDIM_SHIFT (0x00000002u)
6 s& i t- f* i( x' I9 o0 f
#define OPT_TCC_MASK (0x0003F000u)
$ `9 M6 ^. {& c5 z6 i- Y! Z: H
#define OPT_TCC_SHIFT (0x0000000Cu)
) \. U5 z4 o T' h- r- V6 W, Y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
) |# R* u3 m% a! p% ?# l
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ }: A( {' s5 b# B* D7 [# p
1 F5 W' }1 N3 V7 ~) n/ x3 \: h( {
char ping_buffer[PING_PONG_BCNT];
# d* H, I5 w8 s9 M6 d
char pong_buffer[PING_PONG_BCNT];
) X7 y4 R2 d; ^; g' u z6 T% s, ^. R
* g" q: e( Z" c9 @
) V, X8 ]7 O8 C7 N( B
$ N% ?5 q3 c5 b* X# o
. E; p. u3 b+ c& Y0 m0 W
static void ys_edma3_init()
D- ]! [, V3 T. R C
{
7 [" ?4 Z- x; y' Y9 e
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( @. O* h9 z9 @2 `! j
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 I2 |4 z: |! |4 }: F" I' E
EDMA3_DRV_Handle hEdma;
' L& c- A d/ ^0 q4 Z/ y a% x
uint32_t chId = 0;
+ _$ g& }, n/ _: o- A
uint32_t tcc = 0;
: l) l. l9 L" l. b4 h8 b
& @9 C4 w: Z' j3 f( c: e
print2arm("edma3 driver init...",0);
. d! |! X3 i# g4 s% e$ H/ s
# f. j1 J3 ?5 Q& ~! J9 K0 o$ ~# s
hEdma = edma3init(0,&result);
% c% B' b0 V0 i6 R2 L! b) n0 [4 J
if(hEdma)
( @8 x7 z. p3 f& y
{
$ g8 k2 i5 `; j; _! O" c r5 X$ y5 [# Y
print2arm("edma3init() Passed.",0);
5 Y. f9 o! S* \
}
4 K" d7 c5 h6 ?7 p, V
else
9 V& p8 D! Q) O) E
{
% i4 a* H3 G- b0 g B4 O- B& f6 i
print2arm("edma3init() Failed.",0);
' W) B$ V) q0 c2 _
}
- [% f! y" h t( [$ @
5 J' d$ V/ u/ J, T; v
if (result == EDMA3_DRV_SOK)
! p/ t6 V7 P7 f" v: N+ I" j
{
' Q' [$ w9 M4 o8 d
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ r! x: B$ D0 f4 w! S" u
(EDMA3_RM_EventQueue)0,
+ l: }1 _; {$ l+ z _( f' }
&edma3_isr, NULL);
; y& @3 o) I9 X; Y: n8 z
}
( a/ T" j% q* Z
. K- M; d3 z4 d) |/ Y
if(result == EDMA3_DRV_SOK)
8 V; K$ j: Z* } C: @) V
{
5 p+ Y) K$ y1 @
paramSet.srcBIdx = 0;
( Z5 w5 A# z0 N$ `
paramSet.destBIdx = 1;
' K) d! I$ b! O9 `
paramSet.srcCIdx = 0;
& U+ H. Y5 ?+ k5 S& y" t c
paramSet.destCIdx = 0;
2 c* p( W6 b4 b. T
paramSet.aCnt = PING_PONG_ACNT;
3 n1 k- }- E7 f' v# n% G
paramSet.bCnt = PING_PONG_BCNT;
$ e2 C2 J+ A2 }9 v& j- Z
paramSet.cCnt = PING_PONG_CCNT;
9 W$ j3 j8 B( V" @7 Y
. A5 S' ]* w+ G/ c
/* For AB-synchronized transfers, BCNTRLD is not used. */
5 }. y# Q% C: | o! b' a
paramSet.bCntReload = PING_PONG_BCNT;
" H q* O2 y! |- P& K) y: F
8 c- d+ g+ \2 n+ m( |3 {* E
/* Src in constant mode Dest in INCR modes */
- U% |) q. } p$ l4 |# b
paramSet.opt &= 0xFFFFFFFDu;
" B2 T/ `+ o g% ^2 `
//paramSet.opt &= 0xFFFFFFFCu;
1 w, P$ S3 m% T5 L. T
! n5 W" h+ z9 {; I. k0 \! L
/* Program the TCC */
( y5 x3 E, ~% R; O$ k7 `, I, h/ S
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 \$ ^/ ~, z0 w4 e/ p b$ r4 e5 q0 {
3 {8 ?' j9 V7 _6 U
/* Enable Intermediate & Final transfer completion interrupt */
: ~! g3 s( d: i' {+ E5 Y$ z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* K0 j3 `7 G' y8 `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 H& O; h. M4 {5 t. k* n% n" `
0 z% d6 } I) z
/* AB Sync Transfer Mode */
' A/ e, P6 o0 Q5 B, x Q7 A
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, r/ y9 ]4 n1 R4 k
- t. l- S" i3 p
/* Program the source and dest addresses for master DMA channel */
8 W" W+ ~4 x% {6 }5 r
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
8 |1 q+ H6 v: [" v- w9 B
paramSet.destAddr = (uint32_t)(ping_buffer);
" N: B% @3 N* a$ k1 c0 F) n
# s! f1 @$ }7 x! |( G+ |
/* Write to the master DMA channel first. */
8 P+ ~6 n6 i+ O. a y; H
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; H$ Q9 Z. D. b1 W4 r. O0 l, G* n5 \
}
) m. C; J) w$ Q9 a
' C6 W& k" @- `* `2 i/ n6 I6 k2 D$ _
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 c; ^" ~4 _+ p3 k/ J
3 B1 Y+ F. R C+ G7 l2 f' G. |
if(result == EDMA3_DRV_SOK)
3 V& ?' u; c; R1 A8 V- t$ h
{
% N! J( N5 I' T+ q* J
print2arm("edma3 driver init success.",0);
+ j- l$ t/ A3 O( S+ x
}
V- U9 o* _- r4 x
}
0 p( U; k2 i% O' F# e6 }9 F8 L
& O( B% q$ @, U6 M: h$ T
- M8 `, j9 O0 d$ H- t: g/ L! I+ `5 V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ n7 C- p1 s4 x
1 ^9 [: ?7 P) ~$ u: z8 \5 l, w, U* q
; {/ j' \% ]; o/ F
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' w* P# Z2 f$ \( @: `
每次DMA传输完成后都要再次使能传输
! h! r# p8 C3 U- ^) \1 p0 M
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4