嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! P1 b' {0 V+ F# R% E' c
#define PING_PONG_ACNT 1
! x% M! i, `2 {4 B2 u8 |( t; R
#define PING_PONG_BCNT 8*32*40
- x) ~3 l' j9 X' z
//#define PING_PONG_BCNT 1
I+ P |1 Y9 O$ M5 f
#define PING_PONG_CCNT 1
$ W3 V& A6 N7 y4 d
#define MCASP_BASEADDR 0x01D00000
n% J+ X9 T [; J: G$ ~
#define Mcasp_RXEVENTQUE (0u)
- S9 p0 t+ a+ ^9 R5 ^# i
; l0 m! ?" [! i/ l9 ^, q+ v7 J& A ^
/* OPT Field specific defines */
' K: n [5 g! R0 S1 [& e, L9 _6 A
#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 u# T- c: j; T9 N+ m, Y1 e) n
#define OPT_TCC_MASK (0x0003F000u)
) _4 I4 t W% u* N1 o
#define OPT_TCC_SHIFT (0x0000000Cu)
5 _$ W% U4 e5 Z& H
#define OPT_ITCINTEN_SHIFT (0x00000015u)
: r. y6 C$ u# o0 u
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 \0 N3 h' |+ ^% U9 x$ u
7 |4 H# G2 D# B9 B/ y6 P! ?
char ping_buffer[PING_PONG_BCNT];
_8 @! w$ m9 s# L. t
char pong_buffer[PING_PONG_BCNT];
& |/ T0 A% r" Q1 g5 X0 p5 f
" W8 y: _5 g+ C7 e+ t" B' s! Z) l5 J
6 e3 c \# [6 S4 P; u; F: t
. ~8 `3 [+ C9 \, l9 F9 [( A; w, H
$ @) h7 u. G* Z0 @6 M; I
static void ys_edma3_init()
5 B- e5 Z: n' z, \. u/ A1 u/ e
{
# `9 t- ?8 L7 u/ \: R
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 o! T- C8 M% _! V* H7 \' L7 x
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* O' e! j; x9 Y6 Y- y
EDMA3_DRV_Handle hEdma;
# U- R3 K$ |2 u
uint32_t chId = 0;
, e3 n/ d( @) I. {; t; T6 S. d
uint32_t tcc = 0;
" [7 c% n. X# c3 s) X
$ @1 u3 H* f! S
print2arm("edma3 driver init...",0);
* Z; d/ g O/ w1 k+ K
+ a9 ]' F$ X+ S* p( _# R
hEdma = edma3init(0,&result);
$ J9 E( M$ F# E7 b7 ^; b. Z; e
if(hEdma)
+ [2 p9 r7 f4 C4 V/ y
{
8 c0 {6 ?, R! V4 M+ u
print2arm("edma3init() Passed.",0);
7 C# V! \( \) P$ P- n; s m3 J
}
& j9 V3 E4 D1 F: i4 v2 a
else
) g/ w/ t. I# c% q3 A
{
6 s4 d' H' Y& r9 `9 h2 O7 y
print2arm("edma3init() Failed.",0);
8 G o$ ?! B: A1 I2 U
}
) h- F7 w, B: y8 d
& |0 R; V5 @$ g
if (result == EDMA3_DRV_SOK)
' H) I9 J# c2 @% E9 W
{
& ]: Y$ |, @, o7 E: y% C) c f) s
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 W% W" H* S9 g6 L9 I7 V: M1 W
(EDMA3_RM_EventQueue)0,
* D- }: I) A8 j7 M& i
&edma3_isr, NULL);
Z) A* N# c L- A
}
/ N, X$ F9 M& }3 I& J8 I9 N! q
% n; @: S( p6 m. i0 U
if(result == EDMA3_DRV_SOK)
" O, `9 ^' @6 h' q3 c
{
( h" w# o; m9 P2 ^" b6 Y
paramSet.srcBIdx = 0;
9 S* D. u3 e1 [$ Y
paramSet.destBIdx = 1;
$ g# a" S4 `# z! V' `+ N
paramSet.srcCIdx = 0;
! b! m q7 b7 J- |' y
paramSet.destCIdx = 0;
$ i8 Q0 C3 x* z7 _
paramSet.aCnt = PING_PONG_ACNT;
& f) @, T# ?% f6 ~3 ]9 S" k
paramSet.bCnt = PING_PONG_BCNT;
! _( g' x! V1 t% I% q; E; I9 X7 j( V
paramSet.cCnt = PING_PONG_CCNT;
* ]; C/ N5 g9 k/ p% q' {, j
2 ~" @: @# b: o1 b
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 M/ E1 J. s% p5 V- K9 ?" V
paramSet.bCntReload = PING_PONG_BCNT;
N4 o$ h& y9 C8 [4 f
9 S. O; Q+ ^/ J; v4 ~! V
/* Src in constant mode Dest in INCR modes */
, c! ]/ i( C" k3 f s3 z
paramSet.opt &= 0xFFFFFFFDu;
c' ?$ l* J" }: D& f6 K k+ S+ @
//paramSet.opt &= 0xFFFFFFFCu;
8 j i6 L% p- L
- W- z- u: Y: C, l$ z
/* Program the TCC */
/ t1 n& S" q9 O' o8 P9 w ^* N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# f+ c( h6 ?# u
& |: k! X6 Q6 E& Q/ q3 n3 S. F3 |
/* Enable Intermediate & Final transfer completion interrupt */
! s6 l# g8 w5 u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# ?: O; T3 j/ q" q" {. }5 I
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 d4 A: R# I. u, I0 T$ G! B7 N" c ?
; o4 L5 S/ q0 ?1 ~2 N h; J
/* AB Sync Transfer Mode */
6 u% X- U" ^6 W: o! l9 A b0 c
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 b* h! A s# C* J
& f" |# \5 S" c( v
/* Program the source and dest addresses for master DMA channel */
' ~4 m! Z6 A' Z. I1 e7 E
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
9 K1 ?4 i0 F! Y% T6 M+ v+ P* n1 L5 \
paramSet.destAddr = (uint32_t)(ping_buffer);
9 h+ G; ]9 p! n/ r. \
+ t, {" v5 e3 p1 } g4 x4 S
/* Write to the master DMA channel first. */
6 S9 i# X+ N7 s( Q3 a
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 Y1 O5 ]4 h. [* v, e) q( J
}
) m: P. e5 O% U% b1 k( n
+ l2 x; M. c1 K2 z/ O: j d3 L
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& k w7 s8 _: N; ]. Q; L( r- M5 J
4 O* w7 ?/ `/ [. n$ k6 g# g3 k
if(result == EDMA3_DRV_SOK)
1 ]% g) Z5 B9 t
{
* h/ U" F- t$ A0 s9 `- z) [
print2arm("edma3 driver init success.",0);
2 ~4 \- n7 t, u4 K/ u/ Y
}
4 I7 S# R3 i1 {7 n5 Z. h% ^7 H- }
}
, B4 n3 y/ Z% c! A9 \. T6 M$ a
+ M0 \8 ?3 H+ L% G
0 q! `5 A) O8 N2 \
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& s, m3 {' X4 Q% [ { M r
1 g/ w Q. m3 J4 J. R1 `0 h
0 _+ _0 M; h5 G# e
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( p- ^4 Z2 I1 _
每次DMA传输完成后都要再次使能传输
@1 x- A$ o/ s+ l+ q6 P$ I) R
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4