嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% a6 S8 J7 n2 M" P5 k
#define PING_PONG_ACNT 1
) j9 L- W4 q3 I
#define PING_PONG_BCNT 8*32*40
h* M! c& u% z7 U* w3 ]+ @5 _
//#define PING_PONG_BCNT 1
1 O: L4 X s' I5 o: J) I
#define PING_PONG_CCNT 1
: K- W( L+ k( s
#define MCASP_BASEADDR 0x01D00000
c* ~5 P- \; j2 x
#define Mcasp_RXEVENTQUE (0u)
+ x1 H% t$ F! H* S0 K& ]- y
9 j9 t7 G& m9 t/ K6 q
/* OPT Field specific defines */
' \* @& f0 M6 b Z( i
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& }4 e+ h9 {: W1 }
#define OPT_TCC_MASK (0x0003F000u)
$ T* I# X1 b* |( y
#define OPT_TCC_SHIFT (0x0000000Cu)
( d' x0 P, `) o: b# T8 ~
#define OPT_ITCINTEN_SHIFT (0x00000015u)
4 J3 _1 H& q9 z) f1 Y; ]+ v( K
#define OPT_TCINTEN_SHIFT (0x00000014u)
8 N/ W$ ~9 R, u- M4 m/ w/ L" {, w
6 R$ o$ X8 k* Q
char ping_buffer[PING_PONG_BCNT];
7 @1 r3 I1 Q& H! |( C
char pong_buffer[PING_PONG_BCNT];
# N1 v" e/ ]7 r3 i& {9 z+ s
7 o1 r/ G7 w% e& n
3 P2 V, e+ f% w9 V9 A) t' H( P
5 F$ _6 O, Q. N% J) m7 e6 Q
# I# _9 n+ E* d, H; C
static void ys_edma3_init()
k; u, b% M1 x, G2 G
{
7 W* y S2 c- K( r0 q
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) g. ^! z" [# k0 ]
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( ]4 a M( `7 W$ K
EDMA3_DRV_Handle hEdma;
% o+ z, j; j$ ?4 o9 {6 ^
uint32_t chId = 0;
1 K. q. l+ E# s* v
uint32_t tcc = 0;
8 e/ S- r. x! S7 Q; a/ L B
M. v/ @+ s( Y6 M
print2arm("edma3 driver init...",0);
. \; }" m9 E( F
5 b" k4 ?6 F- z
hEdma = edma3init(0,&result);
9 b9 m* N! Z+ M8 D, c
if(hEdma)
" j3 J- h3 W1 q- `
{
% F/ f. A& n% e8 b1 {
print2arm("edma3init() Passed.",0);
. x/ J6 o3 O) {) L0 K. t
}
L. j$ A8 X# V9 q
else
) b0 U1 |8 H' {% z& x
{
' [/ y% u- U) V7 R
print2arm("edma3init() Failed.",0);
( ~4 y, M! P8 h# F9 U/ t) f
}
- H/ Y+ @5 O+ {1 d
0 d- W2 \) Y+ z$ H
if (result == EDMA3_DRV_SOK)
; h y; }# @, ]
{
8 v+ p% A+ j% C0 p; j1 ` I
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 L4 w8 P( g3 u$ D
(EDMA3_RM_EventQueue)0,
2 p: S5 h; l9 g5 C
&edma3_isr, NULL);
5 v" F# R: i X; K
}
- t. M! L" k6 p+ l
, K5 i$ d8 v& d& N, y
if(result == EDMA3_DRV_SOK)
9 ~3 c; J, q( H/ g
{
8 s4 |( S1 F2 |
paramSet.srcBIdx = 0;
* s% c: X5 t, f2 x$ G' o
paramSet.destBIdx = 1;
. G! Q3 N1 C5 |5 s7 d/ F
paramSet.srcCIdx = 0;
) y6 ~: r2 f1 D" }% l& K
paramSet.destCIdx = 0;
9 Q A2 T) N4 _# o3 W7 ?
paramSet.aCnt = PING_PONG_ACNT;
- {" b, s% {# z8 P
paramSet.bCnt = PING_PONG_BCNT;
1 k' G7 }2 N" U4 S
paramSet.cCnt = PING_PONG_CCNT;
6 d: ~% G1 v* E6 I( o
# h/ x* \, P, }' K) g% w; T
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 Y7 {/ X6 c6 X8 l5 s3 F( A7 P( C
paramSet.bCntReload = PING_PONG_BCNT;
" f! R" ] `5 C+ W6 V
% k, D1 T! L. u/ p: o. n" a$ a
/* Src in constant mode Dest in INCR modes */
' A/ L0 ~7 V3 y' V
paramSet.opt &= 0xFFFFFFFDu;
" {; V* t A) h& a3 o& j
//paramSet.opt &= 0xFFFFFFFCu;
( J- G* f2 o' p# Y2 b. P
; T. H1 R, m8 r8 C. W
/* Program the TCC */
7 o0 Q; P- m" B' B A- T; O
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" R6 A: ~" ^$ g$ t5 \, i7 x! F
! z9 A. v [% R- V$ P" {0 i
/* Enable Intermediate & Final transfer completion interrupt */
' t8 ] |# d* j9 ]# z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( S* h+ H2 X" ~& t
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 q- Y' A# X, x, \$ ^5 u+ j$ _+ _
! ]* B, |# D9 H2 Y4 X9 `
/* AB Sync Transfer Mode */
" o+ Z" P' j i9 P+ n
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ |/ t9 V; C( w) u R' |
5 S4 [# V( F. D6 l9 m
/* Program the source and dest addresses for master DMA channel */
& K# X! F, l, \( N$ w9 j! F+ s
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 \2 }. \/ P( l& i1 Z2 c* O; h% z5 p0 z
paramSet.destAddr = (uint32_t)(ping_buffer);
* n' a% Y; @& r" v+ M& G4 {# g
, a6 f8 X% W* }! W
/* Write to the master DMA channel first. */
; L8 p9 Z* T8 @$ a4 C
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 s/ Q% f) \+ G, k, W0 H2 v% e1 Y% s
}
3 q4 U* z9 v3 R. V- z
1 T/ z. Z6 N9 n: \9 K$ ~
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 A. N# g+ |& G2 R8 L1 z, L9 L; Z9 t. W
I+ S5 O0 |9 f- a) S$ z- f' N
if(result == EDMA3_DRV_SOK)
T3 S o: w* W1 Q
{
6 L/ p6 D* n7 J& q! I
print2arm("edma3 driver init success.",0);
! B r) o( [1 S+ F: E7 I
}
5 Q% g- M, d% e% [
}
" k2 A% Q) y9 O9 J6 F9 G
0 `4 r# m, s8 }4 {4 m1 f: [. e- A' ?
9 c/ }7 {) H. T) a. s6 \
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) `& \+ j2 a- p7 ~: l+ u
+ \1 n: u% N% {9 ?; ?' I: i. c
$ q, n! r# ]! q8 T8 r' y$ \; O4 _
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ U$ `2 a. _7 |
每次DMA传输完成后都要再次使能传输
5 R. ~" [/ M m& K6 n2 s
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4