嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 c+ f: `" _0 j0 E) i
#define PING_PONG_ACNT 1
8 t/ c0 d2 M, O( m/ C K7 X* Q/ d/ i
#define PING_PONG_BCNT 8*32*40
6 w% X' @% o! r
//#define PING_PONG_BCNT 1
" l4 q2 i+ Y5 ]2 P/ f6 ]6 s0 z/ ]
#define PING_PONG_CCNT 1
5 @2 ^0 a: F, x# U4 X+ @7 x8 H
#define MCASP_BASEADDR 0x01D00000
5 U% K" k1 }$ ]
#define Mcasp_RXEVENTQUE (0u)
+ J# v3 t9 ?$ n; n' T2 s
+ _0 n$ U9 N& g, P% Y* D
/* OPT Field specific defines */
U' |2 Z7 C/ A6 v: V- @) h1 W
#define OPT_SYNCDIM_SHIFT (0x00000002u)
I. J( C- H0 J& \
#define OPT_TCC_MASK (0x0003F000u)
2 O& P: d1 O$ t' e
#define OPT_TCC_SHIFT (0x0000000Cu)
7 I' F3 w& T$ e" T& U
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" _$ f3 d' x' X0 ^! u- P0 M( D
#define OPT_TCINTEN_SHIFT (0x00000014u)
: C' ~- g2 ]' ^
0 V3 d3 \! W; n6 O9 F5 s
char ping_buffer[PING_PONG_BCNT];
( |. G# U2 B0 m4 h$ O* a
char pong_buffer[PING_PONG_BCNT];
( {4 t, M+ F/ T. Q, g0 A
, i8 a# W# ~3 \/ I- Y
6 I+ Q$ z) P( W. T' O0 u: S: {
4 T3 ^0 v( x4 N
0 l2 G. y. V5 M1 D9 A
static void ys_edma3_init()
/ q% k& Z, Z5 Z* n' {& t$ |
{
2 J# h1 _$ {* h% ^
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 ^& L" a. {5 ]8 C
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
G" y+ ]9 a Q+ W/ R' h
EDMA3_DRV_Handle hEdma;
( D* S; _0 o3 `1 [- e! l
uint32_t chId = 0;
6 v# r+ d4 l9 p& t$ x$ q6 B
uint32_t tcc = 0;
$ }2 v# v- v/ K! z
, y7 Q2 o* W$ z5 @& {' I
print2arm("edma3 driver init...",0);
" f4 J/ V$ f) E1 @ z4 g
' H0 `0 R5 @6 z$ J4 g" v$ h. [' s
hEdma = edma3init(0,&result);
! C( J% C/ N9 N
if(hEdma)
i1 p0 ]" e4 h, N1 Q$ n9 ?5 K/ W/ C
{
- x4 `7 P! N4 |. [5 }
print2arm("edma3init() Passed.",0);
2 P) u& t6 \; D
}
$ |3 S7 D( L$ t$ [5 s' f
else
* d" l' k% ]2 [ S
{
, U( F" T d7 j9 \% P0 J! R( n8 N. y
print2arm("edma3init() Failed.",0);
, j, P. u) I8 ]6 N# n# Q2 i
}
% u& J. h0 `" |* H, {- ^! N
) H$ U! L& s( w0 l* z) G
if (result == EDMA3_DRV_SOK)
8 B6 Y8 `! S2 D' o: [
{
; O# A, _7 I! `( M' B
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' g8 o, Y+ Q; L% C5 z
(EDMA3_RM_EventQueue)0,
% S7 R4 A/ E4 D( z i/ {* V+ q
&edma3_isr, NULL);
3 E, a4 S3 m7 J4 ]2 p- C5 _
}
) k& [& i( n5 M0 S3 H0 I
/ }: f7 U0 C2 }. h' U/ l& w
if(result == EDMA3_DRV_SOK)
: E& P7 K. ?6 c4 _7 R
{
u4 p) u) h' g+ g7 S q: w
paramSet.srcBIdx = 0;
, G4 K3 z2 \' l
paramSet.destBIdx = 1;
O% R& d- v) _" j4 D. n
paramSet.srcCIdx = 0;
% e( f; N1 B7 u$ L
paramSet.destCIdx = 0;
( w: `% ]/ v1 G- P! k) j
paramSet.aCnt = PING_PONG_ACNT;
, @7 k, s5 x# k3 O( Z# _9 R: Y
paramSet.bCnt = PING_PONG_BCNT;
9 W/ o: E& I/ Y2 b, ]4 v
paramSet.cCnt = PING_PONG_CCNT;
; }9 t' H5 J6 D
& ^# q$ O4 ^+ A2 ]
/* For AB-synchronized transfers, BCNTRLD is not used. */
: I$ ?6 l) T1 |6 @8 r
paramSet.bCntReload = PING_PONG_BCNT;
; D: m6 a4 R( [) v8 _" }( d
8 L5 k" x9 {; ]! ?4 x( y
/* Src in constant mode Dest in INCR modes */
8 C: l4 o5 H9 j- U4 Y" G$ e. R
paramSet.opt &= 0xFFFFFFFDu;
Z$ W0 X8 X/ ~4 x7 p$ P
//paramSet.opt &= 0xFFFFFFFCu;
8 ?& w( x+ P7 i) f* O
, l: l- q* k G+ z
/* Program the TCC */
4 f; E2 f- q* D9 l2 F" `5 s8 y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) p- y; V' K8 @2 b5 b& i ^
* U" G4 ]/ c0 y; ]) E+ @6 R" Y
/* Enable Intermediate & Final transfer completion interrupt */
# L$ x+ z1 |5 S! ]. {" d9 D5 B
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
i8 w/ L7 }; W* K v, y! t7 q0 I
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 K6 |: c% Q! i$ L9 n" V9 a: Y3 w7 v7 _( W
8 m% N& f$ t( }$ I& S
/* AB Sync Transfer Mode */
' `$ o6 r( A8 O9 H2 l) p; w
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! _' A3 G( [/ W0 s- ~. J
( }6 O& M6 D5 @7 o+ C0 D
/* Program the source and dest addresses for master DMA channel */
4 ]; ^& }: n6 W" o. _
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% v9 `8 `/ {. ?
paramSet.destAddr = (uint32_t)(ping_buffer);
& f) t! t0 b0 b1 r6 K
/ S' \, E/ F& i2 Q
/* Write to the master DMA channel first. */
0 w1 I3 Z/ {& K7 D, ?9 o& `! n4 L L! i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
1 l7 C& r: K9 o, y, h3 X
}
9 u9 x: O9 i. X
) y1 l) M. u+ U- |1 A
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. y. I; v7 {& b4 a9 g
; Y: @+ e+ s1 A2 [0 r6 l6 ~
if(result == EDMA3_DRV_SOK)
2 _1 ?3 L0 N! [+ Z
{
4 f8 l# i( }3 a# D% | Q
print2arm("edma3 driver init success.",0);
. q6 |; Q9 x( Z2 C9 U1 f. ~6 S" L8 v
}
: I( v" L0 L& \6 e
}
+ ]% i M& u! v" Y6 J2 f2 R+ i
- N* y( z' s9 d# }) N% ?
& v- a5 V' c5 H5 @
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; [) e. C" d3 i8 n
( P' H7 Q# z% Q3 v6 L
' T$ N) M1 `$ z. _
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) K5 u' z ]3 `. B
每次DMA传输完成后都要再次使能传输
! f1 B% b- J: w2 s7 w: j
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4