嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 G% x7 N8 @2 Q1 t4 ^+ a
#define PING_PONG_ACNT 1
! C, E5 F4 l; M/ n2 I4 I
#define PING_PONG_BCNT 8*32*40
8 h7 b/ i; c& n* {- y2 s
//#define PING_PONG_BCNT 1
3 S) n2 T3 w @- \4 y9 F
#define PING_PONG_CCNT 1
$ H# ~) v) n# D
#define MCASP_BASEADDR 0x01D00000
: j: h: ?% w% E; }; e4 y; l; u
#define Mcasp_RXEVENTQUE (0u)
3 ], i @+ S, c1 }
) S/ o, P1 \2 z& z" v$ @0 Y3 L
/* OPT Field specific defines */
- p' V" j5 G, @* ~0 ] F
#define OPT_SYNCDIM_SHIFT (0x00000002u)
- v5 y+ b$ G! e3 R
#define OPT_TCC_MASK (0x0003F000u)
2 x: l8 a/ C6 D# C3 o$ r" r
#define OPT_TCC_SHIFT (0x0000000Cu)
% b8 |0 E K/ v8 ]% ~+ f( ^
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" a% I+ @' n2 J/ _" S$ `, D
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ o2 @& W# t8 p; G2 x5 Y3 d5 i0 G
, B& n. R6 J" h
char ping_buffer[PING_PONG_BCNT];
5 G3 y1 }' ]) G0 j: r$ C! B' i
char pong_buffer[PING_PONG_BCNT];
; Q6 h6 [/ m& e( x$ t
; G+ w/ L) `% B: o
, s$ n J1 A1 b) O. w7 B6 c8 u
1 T- |& p9 i& b5 ~
% ~, \2 f/ x) L: ~7 w( ]6 O
static void ys_edma3_init()
0 [/ z6 ]9 m: Q
{
0 R' H! ~: a2 J$ S& P
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ }- F/ o, E A- ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ a4 w; s- _+ L+ g4 ?+ ^# O
EDMA3_DRV_Handle hEdma;
& {- B7 L" w8 G$ I4 u) i
uint32_t chId = 0;
7 C/ z$ \0 ], B
uint32_t tcc = 0;
2 }1 S- {# _2 j! f' v% e# s% M
* ^$ S2 O# Y- W
print2arm("edma3 driver init...",0);
5 t' I0 r9 t$ l9 {, p" _
- k) X8 [2 ]/ y/ o( c' @
hEdma = edma3init(0,&result);
# j8 T& I* [0 o# B! S( R% b
if(hEdma)
: w" ^1 }! l1 ^/ C/ ^
{
- r- v6 x5 |: ]/ v+ o& A/ Q9 a
print2arm("edma3init() Passed.",0);
4 [( X6 T4 V- S- I
}
& r, w1 [ w v0 r( c! ^# o: s$ i
else
8 h1 ^" w9 y* V7 x% g
{
0 S: i/ I" D1 H4 k- }
print2arm("edma3init() Failed.",0);
; @( f! [5 O- h' J$ ^, Q9 Z
}
4 P: ~# j6 [) ~; X4 d0 c2 y
6 T# u# j) F. E/ I5 y. }
if (result == EDMA3_DRV_SOK)
& o9 V- p/ H7 U d
{
2 h# O, l) ~4 M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 z) J/ [5 E: G' I& f9 t6 x
(EDMA3_RM_EventQueue)0,
' L1 X$ Y/ S- I% h3 r
&edma3_isr, NULL);
. F0 n2 E k6 Q) s
}
% j7 m* N2 N/ a3 u) j, H2 d) v0 U
0 S4 T7 u7 P$ o; k
if(result == EDMA3_DRV_SOK)
0 _$ D- K" Q9 y1 S( \3 Q
{
/ V! b5 R0 o1 c! N0 F
paramSet.srcBIdx = 0;
" H3 L6 N! o. A/ I$ h( g6 j, i3 ]
paramSet.destBIdx = 1;
+ \: a2 O1 `% J5 h, R
paramSet.srcCIdx = 0;
+ @6 w1 n/ o1 g6 U
paramSet.destCIdx = 0;
3 O9 h( p, Z! g5 w
paramSet.aCnt = PING_PONG_ACNT;
" k8 J! A* m# O! T
paramSet.bCnt = PING_PONG_BCNT;
3 ^, |0 i; i1 V4 g( A3 G$ j0 \9 D/ R
paramSet.cCnt = PING_PONG_CCNT;
, F6 p! r9 R0 M6 Q$ d0 K
( F: [. R( X$ z9 ]
/* For AB-synchronized transfers, BCNTRLD is not used. */
: [: U1 f7 a8 [) p. }3 f
paramSet.bCntReload = PING_PONG_BCNT;
( R" X+ p& ~: q+ ?0 o
7 _. ^, T- `* | g8 u& y; \
/* Src in constant mode Dest in INCR modes */
' i' G2 Q$ f4 J7 _
paramSet.opt &= 0xFFFFFFFDu;
! s8 n' `. R3 P: o, g% N; P! F
//paramSet.opt &= 0xFFFFFFFCu;
# z- l1 A( w8 g/ S7 O4 W/ r
* H4 C# Y+ \' S! {" K R# }8 H
/* Program the TCC */
v/ w5 F, J4 g
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
. K. c+ E( S1 }, g- h0 g) O3 |
8 y E& a: Y, F5 ^6 s) L8 |
/* Enable Intermediate & Final transfer completion interrupt */
1 @$ x; O' u) d, t; q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! s! q! [6 i' n* L: V
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 G/ H; O B7 m4 A* j! x
, @: r2 E1 W( x( a& M( H1 i
/* AB Sync Transfer Mode */
. e& i# b8 |' m/ }1 f$ w. F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 [! o. H% S' H. d
8 j) k2 L% Y+ c3 |* S" H. ]- j
/* Program the source and dest addresses for master DMA channel */
; v( U D# K% _( H/ f2 o( c4 P
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
4 P% W$ l, `8 F, x
paramSet.destAddr = (uint32_t)(ping_buffer);
4 @# W& e- a( [% |
/ R- m+ |5 @' t4 }$ u$ D, |& z' N
/* Write to the master DMA channel first. */
" W: v+ Q$ \3 Q* i* D- E
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 \! ^3 c& m3 m% ^6 W# I H) Y
}
3 v1 X& C% ^: Y7 J% y5 a+ ?% ^4 U6 P
6 L- d0 h/ w, r; q
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) a4 c7 t) h4 K8 y& s) G: _1 X
! b% H! h4 S3 n S) e
if(result == EDMA3_DRV_SOK)
' i0 n& a0 C- V- n1 z, n6 ?
{
) b/ s% N( R0 j+ g$ p Q
print2arm("edma3 driver init success.",0);
5 H( G# A$ o, \1 Y# ]* u0 T2 p" }5 ~
}
" d" w0 @4 g% c; h( R, a x
}
/ v7 R+ ?1 ? E% C U
+ C& l: b! \- D* W" l! r8 m
# V5 p! J# t5 l. \0 s; `
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, w1 s- I) S a
8 M5 ]8 X; c( s% D+ _4 B
" I, `; r: s* m
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% c' T& A6 J' [- @" M
每次DMA传输完成后都要再次使能传输
# a! Z- h. R: Q% z
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4