嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- W% ?" @, V) e+ m3 m) i6 Z- g4 [
#define PING_PONG_ACNT 1
3 g5 _& D( N, i# J8 i" h8 L
#define PING_PONG_BCNT 8*32*40
$ l; U6 t3 X3 }' ?
//#define PING_PONG_BCNT 1
( s' b2 `* [7 Q2 H- R
#define PING_PONG_CCNT 1
8 Y, |( B6 Z5 W4 \& Q0 d' a
#define MCASP_BASEADDR 0x01D00000
- ~7 p, r K9 T* x1 f
#define Mcasp_RXEVENTQUE (0u)
& B ?) X6 {( ]9 J8 X/ z
x7 A ?+ @/ n7 [- H, G
/* OPT Field specific defines */
/ X; B3 T( I' M) l: O7 E* B# n
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ ~+ d7 H' D# Z
#define OPT_TCC_MASK (0x0003F000u)
- P1 E' z8 r) Q
#define OPT_TCC_SHIFT (0x0000000Cu)
) @! T1 H/ \2 @7 v3 ]0 v
#define OPT_ITCINTEN_SHIFT (0x00000015u)
( I( i$ L9 [6 r
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 P% ?! F8 e, C) G: ~+ _
& y1 h# W+ R% c( W+ P: ]4 h4 y- \' E
char ping_buffer[PING_PONG_BCNT];
; E3 E3 ~: g; W% L, U3 J; H) d/ |6 k
char pong_buffer[PING_PONG_BCNT];
0 ~+ ~5 B9 i. m3 a9 Z
f9 v, k o0 s
, C! A) b2 L/ y. P
, S; h9 {8 G5 d
W% D* q7 x8 c4 G
static void ys_edma3_init()
' l; r1 k: ], h8 f7 Z. o% c* ~
{
& n8 D6 \. Q) Z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 _8 ]5 y0 e0 l: v2 i
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 C @: H S0 u& T
EDMA3_DRV_Handle hEdma;
9 ? V# b0 }) c( A) ], D# f
uint32_t chId = 0;
% U# G+ e' f5 V; G/ `
uint32_t tcc = 0;
% X* Q" z+ o' \, n
- q7 \' Y0 L4 u" F
print2arm("edma3 driver init...",0);
" h9 N6 `7 _. B$ n1 ]1 A& d* ?- A) u" g
a$ z' t, R. ~, j
hEdma = edma3init(0,&result);
* k( Y1 O) Y. ~- U8 n+ W
if(hEdma)
8 k; _ V' a: y" W6 a3 q% g* Q
{
/ M# N& W! z9 |; n' s$ V
print2arm("edma3init() Passed.",0);
/ _4 U+ J' w) T0 I) ?) e
}
# @4 ]; b( w# c$ Q; R
else
- A, E' u. u$ h* D
{
) u- K- Z: R' C6 p% x. ]9 q
print2arm("edma3init() Failed.",0);
* ?: \4 }; ?& u$ @4 b
}
8 ?0 j* O; i+ b, ] x9 {7 g% {
+ H8 z$ Z# @) G8 }
if (result == EDMA3_DRV_SOK)
, ]6 H) g+ F; O7 @ R; e/ z
{
# n* i& D! c1 o! j1 C
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 t0 {; F ], V! Z G% h3 c
(EDMA3_RM_EventQueue)0,
- R* k+ q0 l E
&edma3_isr, NULL);
9 p" T0 i3 k) k) D$ R! E. e
}
0 p, r- C2 X: ? _( S
. b$ u0 @) g: H" t5 o
if(result == EDMA3_DRV_SOK)
- g! j1 f9 s, I+ z9 d9 F, ?8 a
{
# @$ ]9 Y; _: {/ W# {7 R! p3 i
paramSet.srcBIdx = 0;
0 [2 a6 i: A( ~# ^6 F! C
paramSet.destBIdx = 1;
& J. [) z1 l! a7 u5 s
paramSet.srcCIdx = 0;
3 J* C; n% F/ L* F
paramSet.destCIdx = 0;
/ V5 F! @) [2 j1 n3 X
paramSet.aCnt = PING_PONG_ACNT;
/ P3 G! Q! W$ S) B. b7 q
paramSet.bCnt = PING_PONG_BCNT;
8 A9 N) h& g! U
paramSet.cCnt = PING_PONG_CCNT;
5 T' F1 q# O e4 e2 H2 s) F L
+ f/ S# U( z8 C* Y5 i! K0 n
/* For AB-synchronized transfers, BCNTRLD is not used. */
+ L2 _* }+ P' I; f2 J
paramSet.bCntReload = PING_PONG_BCNT;
! G2 T) T+ H3 C- ?$ Z! e
9 z) [0 f! s/ Y" X* g: p
/* Src in constant mode Dest in INCR modes */
. x- y6 K$ @" p& x
paramSet.opt &= 0xFFFFFFFDu;
/ r) u' j( i- E( R. U! n
//paramSet.opt &= 0xFFFFFFFCu;
4 ?9 A2 ~1 M0 a' Z, _8 A) t' A* ^
0 V7 j6 D- H( @9 J+ K
/* Program the TCC */
! R3 I7 A) G( i1 V6 H, `. q
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: G6 C( F W; N3 b
7 @5 O; s* g* Z8 v5 Z! C
/* Enable Intermediate & Final transfer completion interrupt */
3 w* e. }5 _! c v) L
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 @, x0 o g2 ]$ j+ E, I
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 P/ J" n3 {+ E$ o3 z" a3 Z `; z
. Y3 B: o0 ^0 Q9 A7 i7 q( j
/* AB Sync Transfer Mode */
* y0 o2 t; Z' |# J+ U& w- i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 h! s( q3 |6 y: a1 [, j4 u4 I+ W R' G
( c( z4 B8 g* G7 @. M
/* Program the source and dest addresses for master DMA channel */
9 Q G) ]- C+ j: H4 n# t' G& O
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
6 r. a$ T7 V; F- } q9 b! @- z
paramSet.destAddr = (uint32_t)(ping_buffer);
, K% T, L/ |8 ?& x
6 B- l# v/ j8 @8 Z; r8 }
/* Write to the master DMA channel first. */
+ O) u7 C5 F/ w$ g( o4 \* R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 a( b6 X' d: w# j# p
}
6 z2 Z7 A( M7 N3 v& O
+ Y9 O! y! H0 F4 m; g: o- ?4 i& b9 `
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( f2 G# z1 \) \' P) S6 _
( K [4 X4 E4 n
if(result == EDMA3_DRV_SOK)
0 B" V$ D$ e0 b: k1 i
{
( X/ r: n. M0 M# L
print2arm("edma3 driver init success.",0);
, F+ r7 y7 \. [% n
}
7 o9 V; `( |& T; V" m2 M* V8 \
}
% v# Z- A9 Y W D& j2 L- l+ y
; I/ \( V6 ]3 S8 ^" @' E' l" m
; M E' [' S1 M t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; K) ?$ D9 t& v' O O3 t
2 Y1 U7 F6 v) }; p7 K# U5 U* e
/ G7 ?7 m" [$ r, x1 ?# c
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; o* T9 l' @! F% S! B' U3 u. G( u$ W
每次DMA传输完成后都要再次使能传输
6 @) Y3 Z: e8 m+ s+ S$ R% F
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4