嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ O* r; c; V, I+ A
#define PING_PONG_ACNT 1
" T3 B8 o1 C& j/ r
#define PING_PONG_BCNT 8*32*40
^* t2 \& e( k8 @5 y8 X
//#define PING_PONG_BCNT 1
- Y; e$ y; E1 L$ S3 G* s* c1 R$ Y
#define PING_PONG_CCNT 1
3 Y% b3 h! x3 j0 I$ s
#define MCASP_BASEADDR 0x01D00000
- e& N9 R1 Y% j5 V
#define Mcasp_RXEVENTQUE (0u)
1 c9 ~0 L% b. @% e) N6 e- A' E
2 T& d; x! U \& }5 g2 s% K
/* OPT Field specific defines */
9 R& ]! R" a* r; P' N( e% g8 R
#define OPT_SYNCDIM_SHIFT (0x00000002u)
# H1 O4 o" T) D7 x# W# T$ ^; B' ^4 c
#define OPT_TCC_MASK (0x0003F000u)
0 ?/ j }* g% ^# M' o( ^9 |
#define OPT_TCC_SHIFT (0x0000000Cu)
2 [- x% R: M" X- Q2 d" G
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 d& r1 C. P* ?# y1 J* S4 p1 ]
#define OPT_TCINTEN_SHIFT (0x00000014u)
$ d- m0 W( b4 Y' J
) U T: D, L, c" n
char ping_buffer[PING_PONG_BCNT];
. P4 D, E8 E3 O' v o
char pong_buffer[PING_PONG_BCNT];
* A, r, `% o0 G1 t9 k: ]- g1 z. @
" v; O( A9 m/ E, r8 g/ u9 @: I( ]
( l% E3 J, M. C5 S/ ?$ D
! M" S! T- |- Z. }: I
5 Q0 x% s+ s* p: y- X
static void ys_edma3_init()
% F; a2 S( Z- y* {
{
# n0 v1 L* ^% ~! ?
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' k/ {$ t. y [. m) J* }
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) ^5 s+ p; [. B% Z2 W `/ x
EDMA3_DRV_Handle hEdma;
9 |. J! ?/ C" b0 @
uint32_t chId = 0;
8 H* b' |+ {$ P& \) Z" A1 O
uint32_t tcc = 0;
r8 i1 r* L+ d- }
4 j) m9 s* M% A- ^2 _4 D
print2arm("edma3 driver init...",0);
5 x* \0 F) E( Y4 b% K
: Z9 s6 y) L2 d7 D
hEdma = edma3init(0,&result);
3 p8 z) g6 S: _, {3 W' B& [' c% e L
if(hEdma)
4 n0 b+ M& h5 D0 o5 s% Z- r& N
{
% T0 `& a4 U7 y8 u
print2arm("edma3init() Passed.",0);
( `/ M- b: Z" W" ?; H" B0 B
}
+ j% `& w' F8 m! W7 W- ~9 R$ m
else
/ s; _- b4 O& m4 J% ?* m
{
* G# |5 C' T6 H/ z8 u' v. e
print2arm("edma3init() Failed.",0);
$ L3 H" \! R K- I; c
}
1 y/ \" ^ ~4 j4 j9 S/ S& r0 S; K
* l6 f; x& s) H. U& W2 L
if (result == EDMA3_DRV_SOK)
( I2 R7 T! K5 |5 [7 O
{
! p6 U" t: E$ |3 e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 h. L3 `! e2 V% O
(EDMA3_RM_EventQueue)0,
$ j) S# h9 g9 O- c9 n5 o' P
&edma3_isr, NULL);
, b2 y1 v5 w! h3 j' ~ @ R
}
- V! J9 ^* O$ u
+ F' R; m( l6 t; }( R+ i+ i( a
if(result == EDMA3_DRV_SOK)
( \) j; g5 x+ t/ T
{
7 z' t4 s7 j$ H2 Z: @' r* [
paramSet.srcBIdx = 0;
) u; c% D; r5 u5 ]# j1 y
paramSet.destBIdx = 1;
@. w. u! I0 ^4 T8 h3 \- ?$ V) s
paramSet.srcCIdx = 0;
& t5 L8 u4 v5 N( f3 B' p- k
paramSet.destCIdx = 0;
" I. u$ e1 r3 r0 B# `( Z1 e
paramSet.aCnt = PING_PONG_ACNT;
& ]; f, a; t, Z9 y4 q: V9 A; |# C0 a
paramSet.bCnt = PING_PONG_BCNT;
) r- c; R( j* Q& L% Z0 \' H, d' [
paramSet.cCnt = PING_PONG_CCNT;
' {4 R( @( x W: m/ e7 T
, r! `" |/ a a& [; C1 |9 R9 [ b( f; Y3 K
/* For AB-synchronized transfers, BCNTRLD is not used. */
* y: c( z% k+ H# B1 U0 h0 U
paramSet.bCntReload = PING_PONG_BCNT;
, {% A- [$ I0 v
1 a4 k2 `) l' g0 D
/* Src in constant mode Dest in INCR modes */
6 f0 l) j o6 o- u$ d2 U
paramSet.opt &= 0xFFFFFFFDu;
) `! X! \( p, z5 w- `5 X
//paramSet.opt &= 0xFFFFFFFCu;
2 }) Y+ ^6 K- g, D( d6 X
$ ^- U) r7 v% H, K! t( R8 j
/* Program the TCC */
: W) K$ V% O4 P2 W
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 i9 j7 S0 E7 m4 Y" w0 f, f9 ~+ x
p5 w0 j9 ~) R( l
/* Enable Intermediate & Final transfer completion interrupt */
5 n; {* r% I1 n9 V
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" n2 x9 H, ~2 u) R5 f0 |5 x
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 t4 A V6 T6 r; _5 z5 p. M7 t
8 g: \" d4 O, F5 p( ?" I7 R
/* AB Sync Transfer Mode */
) p9 V- C( j7 E1 D( K
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; P" R- c4 F l, O J
( }1 Z* v6 P2 i8 f9 p
/* Program the source and dest addresses for master DMA channel */
" R3 v0 @; q. O" f( z) N4 f# P+ n
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
& P& v" b- M" W( L' }- U. k
paramSet.destAddr = (uint32_t)(ping_buffer);
4 B2 U2 a6 r3 d( R6 P, G/ L4 |+ s
- T. e, v. Z' @2 u# @
/* Write to the master DMA channel first. */
) t7 {9 h8 ^; K* m
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% z% X* @& n1 X1 i8 S
}
1 N/ m: |/ K6 Y3 m& |7 t
9 S3 Q- N8 }6 X1 ^
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# j7 k# w' C( t+ l
+ w" C4 [ a% u: X
if(result == EDMA3_DRV_SOK)
! a+ P5 |- A+ d# U
{
9 Y0 \5 M3 W4 M0 x2 p
print2arm("edma3 driver init success.",0);
; ~/ E7 J' U+ G& L0 i/ h
}
% b/ c* b% x/ o( P1 _
}
) O0 `$ `! q& `7 p' f2 m6 } m
3 T# L4 E/ y% c' ~! P( d! I$ y' |
) M8 i7 e3 f0 i2 z2 C. s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, K" x" y+ X; X9 y; z: Y" ^
3 Y$ f6 {) o; {: c8 {2 x5 g T
4 j+ v( n5 R! [1 _( n& e! w2 c/ I2 ]
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 S3 C5 ^8 g$ X' ?* l
每次DMA传输完成后都要再次使能传输
) t3 c2 h5 L: E; r1 G I( F
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4