嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ Q+ V8 o; M, u. o
#define PING_PONG_ACNT 1
' q0 v# ?; T2 |- f: k; @( Z
#define PING_PONG_BCNT 8*32*40
8 N+ y. Z# A$ A3 J
//#define PING_PONG_BCNT 1
0 L& v1 _! V/ ]4 O# [7 O" t
#define PING_PONG_CCNT 1
% C# U3 e7 V, q% s# S
#define MCASP_BASEADDR 0x01D00000
1 M% q& [; e; ?" ]
#define Mcasp_RXEVENTQUE (0u)
' d) h$ z0 k9 ^; j
! V8 j7 f4 f! I+ j
/* OPT Field specific defines */
# u( T* } u+ v9 ~/ ?
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) t3 w" P5 v; v! E9 L# z5 n* e
#define OPT_TCC_MASK (0x0003F000u)
7 X- c% @* u% `! i: j5 v9 y+ M% m8 C
#define OPT_TCC_SHIFT (0x0000000Cu)
3 S+ i3 J! _& _ |8 ?
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 l3 y0 [' I9 B5 x- b" v. Y+ k# }
#define OPT_TCINTEN_SHIFT (0x00000014u)
, i3 S: d! B) d. R/ J9 C/ z# g5 L
9 }& {, k. I4 Q; x; P
char ping_buffer[PING_PONG_BCNT];
% p. c2 C/ g& W- W! y
char pong_buffer[PING_PONG_BCNT];
. a. u1 y/ `% o7 e. A
7 F: a. R& T) q7 h Y
0 E O; u5 V4 V; t. H/ |, L" q
. z( f* ^3 v' e
9 y/ {. c$ |2 A! K) B
static void ys_edma3_init()
: p0 h( A; p. p: d% W/ U4 a& \
{
* S8 ]9 r: f3 X* n, \* J/ N
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) Z d5 b/ G/ d: m( t. L% \
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* z o7 x; z. Y; A
EDMA3_DRV_Handle hEdma;
- Q% P. ~2 r( j @
uint32_t chId = 0;
" m& c- ~* L: j: b( T' [
uint32_t tcc = 0;
/ k; L2 ^0 Y+ T5 ?
/ \# u% g3 H( W) @& k2 v; c6 s' j
print2arm("edma3 driver init...",0);
& V/ B4 w; x- J; R# s! A9 L
9 { L1 q H/ \& I
hEdma = edma3init(0,&result);
6 U% s0 ^7 q# _! w e0 D! M0 D. R% s
if(hEdma)
" Q' `9 o5 D P$ L
{
# V6 }; m0 C$ ^. V7 J2 s/ u1 o: C
print2arm("edma3init() Passed.",0);
' l& D3 Z S o( m
}
7 Q0 f+ b! a, g2 G8 Y- l- Y
else
3 d, a$ B* R; c |6 [0 _
{
/ b- l5 n, t7 l* w; g; ]& X0 L, ?
print2arm("edma3init() Failed.",0);
% T4 K8 g5 C! `/ D& Y3 F& W2 Q
}
& v- w5 y' V* k; F
, U, u$ E$ V& Z M
if (result == EDMA3_DRV_SOK)
- E7 i/ f! D) p9 {
{
a3 K2 j) H/ _# N% `; g
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' V; ~$ p5 A/ x/ ~; k: c
(EDMA3_RM_EventQueue)0,
" _, A# p0 r+ n( S% F
&edma3_isr, NULL);
0 r2 b) P R; ~9 Z
}
% o m3 w- y. o% F
/ D- n9 \3 X" y
if(result == EDMA3_DRV_SOK)
8 E( U/ v/ |- i B, m
{
7 ?' N4 j! d" d# H
paramSet.srcBIdx = 0;
4 n% W) {" l: j/ `5 b
paramSet.destBIdx = 1;
( }0 L! u- a0 ?5 h* F# L& Y
paramSet.srcCIdx = 0;
9 X7 H8 W; J" w, d& D( I1 _
paramSet.destCIdx = 0;
+ E% T3 p1 y8 m( U
paramSet.aCnt = PING_PONG_ACNT;
7 C9 ?3 p$ N$ }# o5 u
paramSet.bCnt = PING_PONG_BCNT;
5 `8 Y2 W: i S6 O7 k- o
paramSet.cCnt = PING_PONG_CCNT;
7 T4 R" m& a S' t Q
/ Z" }) t6 E0 S& n+ _+ |
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ i8 S3 U6 H: f3 g& s# f
paramSet.bCntReload = PING_PONG_BCNT;
3 ~) K0 H) Y4 T1 e
( \0 W2 Y$ ? @! k( I
/* Src in constant mode Dest in INCR modes */
, w. w+ D) Y7 s8 S' O
paramSet.opt &= 0xFFFFFFFDu;
3 b2 ~( T) ^6 [. y5 o- F
//paramSet.opt &= 0xFFFFFFFCu;
) _+ t4 @1 P; M+ H# f) x4 w
, J- g9 Q. \# z
/* Program the TCC */
& G4 J V( L" T: T) c
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 e% N6 X7 i( l1 d
6 i) [0 v; b7 S- l9 r0 A# _" d
/* Enable Intermediate & Final transfer completion interrupt */
% t* T& f6 [5 G+ i0 v0 D% u) Z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; c- _; e7 R5 E# ^6 h( K9 |
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) m' q( L. p! \# h3 o
, w! t4 e% w$ V1 P% p. ~' Y
/* AB Sync Transfer Mode */
L& M, F! y5 m: C6 m" e
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ u7 ?0 A: j9 h5 I
J- y) F, K- F1 y8 m% ]
/* Program the source and dest addresses for master DMA channel */
- C3 ]4 g8 `: B
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
7 C/ Z2 `% i+ F1 j; s4 g+ J
paramSet.destAddr = (uint32_t)(ping_buffer);
* x, v5 D! C7 p
, p) F; J0 d0 s1 @- {% w' P
/* Write to the master DMA channel first. */
# j# J1 I8 w# A% T2 M. J
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" O0 s1 k9 M" f( u7 r
}
4 O0 d5 N& A: o3 _8 M
. b2 }# y8 Q0 N3 K
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' K" a9 S8 C& b
! D) } a$ m( d7 }7 ^5 ^
if(result == EDMA3_DRV_SOK)
: _9 s& I5 {# h; o9 L# b- D) D
{
. Q2 ~. |$ S/ J, Q0 j) o
print2arm("edma3 driver init success.",0);
/ v4 z% b4 Z- L* |
}
: w u3 O" c( M
}
5 P5 M% ?8 m( l. Q: r4 ~
0 B/ N) u6 v7 y. g( B
1 C2 R7 r1 ^9 R/ P% ?8 H
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, w1 m u$ n- w5 N$ @2 h! p
# ^1 }) [6 N$ ]6 C% E, C
$ \6 i) A- W2 y4 q# H0 F* z/ Y/ v
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 B3 n6 Y$ E4 O; G+ p
每次DMA传输完成后都要再次使能传输
" l2 x- o' J& n
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4