嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* J' X# F% P& @" m7 t3 m
#define PING_PONG_ACNT 1
% S) T8 S6 q6 m6 E
#define PING_PONG_BCNT 8*32*40
8 f/ G: g! s2 a! E/ C
//#define PING_PONG_BCNT 1
7 ]4 [- P! u8 L% I) }; V+ S
#define PING_PONG_CCNT 1
( }4 v( o/ J& F# m; e
#define MCASP_BASEADDR 0x01D00000
9 h/ b3 y/ O' V! ~' a
#define Mcasp_RXEVENTQUE (0u)
) r$ K# s7 u5 \% c
. e: f8 g. ^, q& d5 V$ N' {
/* OPT Field specific defines */
( J8 r7 a% c, Z& e
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 m2 O8 Y% ^, ]$ t1 {
#define OPT_TCC_MASK (0x0003F000u)
1 e3 e( T$ h& ]! W
#define OPT_TCC_SHIFT (0x0000000Cu)
6 C; P6 Z+ n3 i3 i
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ ~- w+ l2 @) [
#define OPT_TCINTEN_SHIFT (0x00000014u)
' w& T! ^2 r* c9 e1 i
" T8 T' E# z# X2 U: R
char ping_buffer[PING_PONG_BCNT];
/ {; ~* v' N! t
char pong_buffer[PING_PONG_BCNT];
+ }/ O- ^4 A, l5 M
; T/ n( p, a, R
& N! N9 }! f1 @) o: p
; x5 ]( F2 m5 i9 ]9 ~4 v
7 g% j9 O3 U! L9 j0 W6 W& y. l$ o% p% F' J
static void ys_edma3_init()
, ]% J$ \5 t: l$ e$ `: w& |
{
$ t5 K+ e7 u) b9 F
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' ^. a& x( Q% e: S" H$ D, B
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 F6 v' D) {- X$ K
EDMA3_DRV_Handle hEdma;
' N/ u. o$ g1 t/ ]9 K: _! Y
uint32_t chId = 0;
/ P% M8 j+ ]% o" t& H
uint32_t tcc = 0;
/ T9 _$ V. a! u
0 x2 |1 d! Y- Q
print2arm("edma3 driver init...",0);
7 f, K1 Q0 c: P- P, S5 v9 W$ _8 W
# n3 d7 B7 n% g# g6 i* S
hEdma = edma3init(0,&result);
6 n5 m2 R* W# T( T3 z3 K6 @4 P
if(hEdma)
% r6 m6 L3 ?8 t
{
' D1 a( v: p0 H; q- H7 ?
print2arm("edma3init() Passed.",0);
/ L; q5 Z% b3 I1 k8 K0 r& j
}
; k6 C5 k4 c5 P5 V5 W6 w
else
5 N! x$ ?# v1 o5 W" m
{
0 g4 ]5 d; o# b" @6 s6 j
print2arm("edma3init() Failed.",0);
2 r4 p% v5 y! J3 B1 r
}
, S" t2 F6 P, S. q. X' `- y* g0 Q2 r
7 V2 |% @0 M, ]- Q3 b
if (result == EDMA3_DRV_SOK)
0 X$ s/ @& s5 ^3 F
{
+ I; s' Q% z" ?" R
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( H% e9 R/ F' P k
(EDMA3_RM_EventQueue)0,
1 h$ S( p/ w% f/ N% F' G1 _8 e3 Y
&edma3_isr, NULL);
$ Y$ _+ i {0 A. l6 O, u& I
}
. y" Q: \- h* w' @& W
: J" p" G0 W$ p0 V: c
if(result == EDMA3_DRV_SOK)
1 S7 K0 T; m5 A: o0 q. l* l5 a
{
! v$ A% v* y7 N3 t
paramSet.srcBIdx = 0;
( h3 A9 z9 O5 x9 ^0 b# N( c
paramSet.destBIdx = 1;
8 x6 S- d( m' j, l
paramSet.srcCIdx = 0;
- {1 u- p, ~5 a$ { |: l. I
paramSet.destCIdx = 0;
6 \3 I: C( i3 c% o' @. h5 l
paramSet.aCnt = PING_PONG_ACNT;
6 d7 s' x( ]2 Q: B/ V& b
paramSet.bCnt = PING_PONG_BCNT;
% H$ K& ~$ x+ y. U7 O* W* f* p
paramSet.cCnt = PING_PONG_CCNT;
7 w% C3 K! y* `! y1 P
9 H: w! f J$ j. {* T8 h0 `4 e0 C: P; w
/* For AB-synchronized transfers, BCNTRLD is not used. */
. \- a0 N" ^8 X# y9 X
paramSet.bCntReload = PING_PONG_BCNT;
" t3 N' [2 T! f& z' L1 K
5 g; f- ?8 K) H, p& B9 P7 P& Z' p
/* Src in constant mode Dest in INCR modes */
- H* M. x O& g; y: ~, h! \5 P
paramSet.opt &= 0xFFFFFFFDu;
: O4 U* z+ l3 H, w# }; B
//paramSet.opt &= 0xFFFFFFFCu;
$ @3 g0 D( E/ ~. d5 [
% w6 ]% o9 V* j" i$ E8 @
/* Program the TCC */
( G3 y! ^2 I y& W* E: q2 I+ k
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 |! S, B; | Z* O
- N# U6 I( h; T: d* A! L# b
/* Enable Intermediate & Final transfer completion interrupt */
# p" S2 q* n L9 T# t
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 V1 }4 l" a6 M
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ [/ b! C! Z1 X+ O* i: b4 F
% l0 T3 }. G8 ^. _1 y+ ]" F3 R3 e
/* AB Sync Transfer Mode */
]6 m9 {( f4 u- F+ l- M0 ~1 y
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& F0 V4 f! W+ q8 U0 ~, F
5 J8 p9 F7 c5 e2 y( m
/* Program the source and dest addresses for master DMA channel */
0 ` g0 @- ]" M
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
( D" r5 ]/ U( F
paramSet.destAddr = (uint32_t)(ping_buffer);
" V: Y6 A! L; s$ L) u9 A- [1 d
3 J7 p+ x! n5 e/ A/ C% q
/* Write to the master DMA channel first. */
. q, \& P( [# D' Q) H0 S2 W, E) _
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" O* q ~/ W2 R& t! _
}
e; N% n& ]; u3 H# v7 L R, H
# i: u- u0 X; I9 r
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) `! |" i4 C6 w( R
5 n7 R( r( n6 n9 |1 F w4 N
if(result == EDMA3_DRV_SOK)
" w/ D4 \' i* ?) t! I7 k/ a
{
& o! `7 Q2 n- U! Z9 J- G
print2arm("edma3 driver init success.",0);
0 ~) y9 Q" H- ]- Y
}
" d! V1 |. V9 U+ _3 y+ \; h9 _
}
; D2 Z% t, \- Y6 F) ?! C! }5 P
5 ]# l9 f+ R" y: u. }! E9 ?
1 f) A9 M" Q6 }# ^. Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* ]; f+ \/ t A
9 S. C0 g }5 I& z) M3 E! O5 Z
3 t! l( e2 ^) n4 D9 _0 v0 E8 t
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* `- u. M' g# ]( K3 r) `
每次DMA传输完成后都要再次使能传输
- X3 i C$ r7 L5 J! j
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4