嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ s& A' |6 w" y1 [% l5 P) Y7 `
#define PING_PONG_ACNT 1
5 ?- Q+ ^# j( P2 j: M5 Q8 ?: _
#define PING_PONG_BCNT 8*32*40
$ ^* y2 N# Y8 K( S& o- Y) X4 r D4 ~
//#define PING_PONG_BCNT 1
7 F4 A* L% h$ r2 V0 J. b
#define PING_PONG_CCNT 1
) q. d5 ~/ Z0 K u! @1 L
#define MCASP_BASEADDR 0x01D00000
o; Z7 Y0 P8 ?3 z# p* M* R# l
#define Mcasp_RXEVENTQUE (0u)
) |% \' ^/ j& E* f; ?# G
1 V1 P% n# q' S* x* ?6 l
/* OPT Field specific defines */
% p# |& o- Q( D! U1 Q4 u
#define OPT_SYNCDIM_SHIFT (0x00000002u)
6 Z( G" [% D# ^2 D2 g( H
#define OPT_TCC_MASK (0x0003F000u)
# ^ W3 E; x" O
#define OPT_TCC_SHIFT (0x0000000Cu)
/ V* |( r2 }4 j
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 K; X( H8 Z2 ^$ G5 z
#define OPT_TCINTEN_SHIFT (0x00000014u)
K7 S: D7 s8 X4 k3 V0 H
1 A K/ Z- U: D9 _: r" ~/ Z- @
char ping_buffer[PING_PONG_BCNT];
v# H; h3 t6 P
char pong_buffer[PING_PONG_BCNT];
8 D9 c4 x0 d* N& W
. d" T' s+ _/ l1 r8 v( O8 {
8 S) t- |3 ]6 Q9 v5 ^; L
' A* g2 e5 [1 S. a) Y9 k
# p: H- s0 x0 r, o% Q6 l" f- i9 g
static void ys_edma3_init()
* d7 c' x+ c) {1 c$ A
{
7 ?9 Q- o7 R+ H. I
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, g4 i8 C5 B1 K; _* \
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 K4 d7 e. }" k& g9 w7 i8 G$ M" y7 Y
EDMA3_DRV_Handle hEdma;
1 Z5 n* }7 g/ y1 H
uint32_t chId = 0;
" f" R( y0 k& \, g4 x3 D, X
uint32_t tcc = 0;
) b( a; ^: L" Y* o1 W
" h" i2 ^# p6 l' c- f2 U/ p
print2arm("edma3 driver init...",0);
4 x: i' W( x. r. e( z( x
/ s! l1 n3 z( _) @; S! @8 ^
hEdma = edma3init(0,&result);
" a' o( @5 ^1 F9 s
if(hEdma)
6 x% F, ^ w1 V
{
; _ J' Z( B/ S9 T* ?& @7 L% I
print2arm("edma3init() Passed.",0);
* s$ {* T9 b2 F ~
}
8 i4 V$ \ p$ c3 I
else
: b/ A4 R: ]- l V4 y+ n
{
: K* V7 \2 V+ x, V' d
print2arm("edma3init() Failed.",0);
0 l- h; H9 w& W: h6 A! j4 H( R
}
$ Q2 Y4 F1 q: O3 h' b) C" n
- K/ Z! i) }2 `8 I! J1 g
if (result == EDMA3_DRV_SOK)
+ Y& g. o+ f% e4 h1 l
{
8 R, R4 b$ m+ a" p5 M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 \3 ]* N! _9 y9 v
(EDMA3_RM_EventQueue)0,
6 z& d0 V5 P$ k; ~7 V
&edma3_isr, NULL);
5 B9 x7 B9 S" j
}
9 d7 d& L! {/ Y1 o* G; n
+ ~9 c$ ~6 m# p s1 x' ^, `
if(result == EDMA3_DRV_SOK)
9 p: ~( i, F. }5 W% h
{
% K$ t {# s7 ?& }2 Y. G
paramSet.srcBIdx = 0;
' o( w4 F9 K2 Q8 x5 k! x' w
paramSet.destBIdx = 1;
- g, R$ ]/ m1 [$ U: N; s
paramSet.srcCIdx = 0;
0 v3 d# A5 O: F; Y, q
paramSet.destCIdx = 0;
5 }( C. @$ y; d k; b, e$ Y1 g
paramSet.aCnt = PING_PONG_ACNT;
4 ~0 {2 ?! m. L. L8 N
paramSet.bCnt = PING_PONG_BCNT;
0 Z& }( ^& M- l1 E% c/ q
paramSet.cCnt = PING_PONG_CCNT;
9 h7 S5 {0 K0 p; x6 Y4 G4 I/ x
7 d) C4 Y. q' b2 Q4 F6 d/ i
/* For AB-synchronized transfers, BCNTRLD is not used. */
o2 l* C \$ i7 N
paramSet.bCntReload = PING_PONG_BCNT;
: B$ Y3 L' E" @: l0 n( l
! t0 Z/ ~( y) V8 A$ C0 ?5 b
/* Src in constant mode Dest in INCR modes */
5 V" T* f" X" T7 h* B5 N. i
paramSet.opt &= 0xFFFFFFFDu;
- I& `. s+ P: [4 N5 }/ F: X) z b
//paramSet.opt &= 0xFFFFFFFCu;
( G" Y$ _9 f/ c' Q# e4 y' j
# c1 n$ z3 S% }4 V
/* Program the TCC */
5 r* ^$ |: B$ t* J9 M( s
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( f: l- d! l( |9 K' s O$ l+ o( V
4 U4 g, I% H/ i- J+ B0 t( T) q* L& f
/* Enable Intermediate & Final transfer completion interrupt */
7 [4 w% m- M7 F
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
1 O4 x) l5 I9 x7 [
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 O7 ^2 G2 a- V% _% T# I! U
1 f+ U" `) {8 [1 l+ N
/* AB Sync Transfer Mode */
6 _9 _, V2 K! {
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ r+ |1 |3 W! c/ x
7 X% H: Y; ^0 Q' z- X
/* Program the source and dest addresses for master DMA channel */
$ H! E3 v# Z: x% s2 W7 h; x
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 k4 E" |6 \2 v4 n3 {# t
paramSet.destAddr = (uint32_t)(ping_buffer);
8 [& J) X! P6 ?- Y
8 w# }& B9 O2 v( O
/* Write to the master DMA channel first. */
8 Y2 p. p5 o: c) K* l
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" ^7 l$ l A% L: L; y
}
8 F" W( V* o% V- g- D4 o3 x
8 |$ K- _# o* @1 ]
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 u0 W" J6 X9 Q2 ?, S& N
7 u4 |5 w/ s2 x e
if(result == EDMA3_DRV_SOK)
* f+ E% ?5 p+ I% v1 T
{
5 K, r, C8 |! N( [' x
print2arm("edma3 driver init success.",0);
# o0 [, V3 C/ A' \% E
}
4 J$ ^" r9 S9 M( r2 _* N/ X- V
}
6 w4 p8 X0 \. p
3 X0 f9 k- n9 \" I+ v( ~& S
) p/ S+ C6 G/ c% n
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 P! F+ N9 }6 p4 g }5 E
a! O" g1 }4 y9 o1 Z1 A" `* Y
# k8 x# c5 x" t
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ \2 F/ n% j0 Z/ Z0 g( u
每次DMA传输完成后都要再次使能传输
' |5 t. B( Q1 S* b5 P+ X
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4