嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 `. ?9 X! r5 g
#define PING_PONG_ACNT 1
Z8 F3 k7 o4 J8 U" W# J
#define PING_PONG_BCNT 8*32*40
. b: o$ }3 p* E; Z! x, s" [
//#define PING_PONG_BCNT 1
$ g8 c6 E) k3 _3 r
#define PING_PONG_CCNT 1
0 D: n }' p5 k0 ?) r
#define MCASP_BASEADDR 0x01D00000
& L1 P4 Q9 C# f
#define Mcasp_RXEVENTQUE (0u)
5 N4 Q8 i' P5 Q" Z! J
0 M. ~- I9 ^- W7 N
/* OPT Field specific defines */
* A" S7 Q _; z+ q( r8 M+ U
#define OPT_SYNCDIM_SHIFT (0x00000002u)
: }) l( N7 {$ A2 t- J
#define OPT_TCC_MASK (0x0003F000u)
' _/ S6 `3 R! Y( J
#define OPT_TCC_SHIFT (0x0000000Cu)
. K! g- s# G, p. ]
#define OPT_ITCINTEN_SHIFT (0x00000015u)
$ }8 U1 r& z0 o% v0 E. i% k! R
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ k3 H/ j- a' G: i; o) d/ e
) S( c5 j# ~3 |( N9 T) ^' z
char ping_buffer[PING_PONG_BCNT];
: |* S% p0 ^0 T8 y+ s+ ^% S
char pong_buffer[PING_PONG_BCNT];
6 c8 E( I$ S2 r. j* i! ]" n4 N
: ]# p; a& u! n6 N
1 E% e6 G& g! ^ ]1 ~/ E) @
* @' ?# e) Z" e) B( W0 k
* M. m7 _# K. M s
static void ys_edma3_init()
& K6 \' Y& Z- {, }" S7 H6 n
{
5 w. X+ \- R+ t3 {2 X6 `3 v# C: `0 F9 X
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ H1 ~1 i& N0 _9 @0 i0 E
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. O$ X) v6 N& ~0 \5 K
EDMA3_DRV_Handle hEdma;
: G( p) o9 q F0 c) B) Y
uint32_t chId = 0;
" \. }* Z$ B8 |0 _ M1 L
uint32_t tcc = 0;
- o) ^. b: \- i0 p
5 }7 o+ a j8 l) Y* g* `6 H
print2arm("edma3 driver init...",0);
5 t. r5 f' O) E3 X9 M* a
( h5 I8 V% @3 ]7 `9 B' S( E+ U1 Q
hEdma = edma3init(0,&result);
! }5 J( P! C2 ^9 B$ f
if(hEdma)
$ \6 A, g; _$ S! e+ z! `
{
* ~6 p" F$ {& w
print2arm("edma3init() Passed.",0);
2 C1 S' A* X) k, i! w z
}
% v3 A8 A0 C. a+ i: K
else
' \. T$ j4 o& k$ q L5 f6 H! `
{
9 t& Z; t# L5 C
print2arm("edma3init() Failed.",0);
; Y+ \7 p p5 R
}
" K' z( q) q/ d; Z
+ q0 m6 `) a8 E. u K4 P: ~$ D
if (result == EDMA3_DRV_SOK)
/ y" u* j0 e+ Q2 A% F, y% I
{
& L8 }% M4 u2 Z# _3 o, p' h6 U7 z% A
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ t+ Q7 X9 }7 k: C2 \
(EDMA3_RM_EventQueue)0,
' p7 V& o9 {9 W% C
&edma3_isr, NULL);
: P# I1 S) V+ U; L6 W6 i
}
) B y8 X% f7 g1 h3 u3 z* o/ z- Q# `
. ^" r% R! ^" f
if(result == EDMA3_DRV_SOK)
$ D3 a9 P( Q- p5 t/ n0 W7 @
{
9 k4 }- X8 T2 X& X; H. X
paramSet.srcBIdx = 0;
) R U; |; ~- s8 R$ b
paramSet.destBIdx = 1;
# Q$ }& n+ Z! q9 N1 w! s3 M
paramSet.srcCIdx = 0;
5 y( I h8 N' E9 }, u# _) n1 @
paramSet.destCIdx = 0;
$ s+ ?3 x2 [) c6 S
paramSet.aCnt = PING_PONG_ACNT;
% Q: T1 b: o7 ~$ ^) C$ K3 K4 B
paramSet.bCnt = PING_PONG_BCNT;
( w* |! i; b) L C* Q
paramSet.cCnt = PING_PONG_CCNT;
- g/ `. S1 U% Y
" I0 V' G" I1 {( r
/* For AB-synchronized transfers, BCNTRLD is not used. */
7 h5 U2 w) h) ` ?9 W
paramSet.bCntReload = PING_PONG_BCNT;
$ @- G, X' V# `
% N- ]. F8 \- e0 o9 k3 N1 p
/* Src in constant mode Dest in INCR modes */
( z+ z$ {3 w7 K' t* u0 v! g
paramSet.opt &= 0xFFFFFFFDu;
" h) |9 d4 q! W7 H
//paramSet.opt &= 0xFFFFFFFCu;
) D7 C% n2 n8 ^6 G; `1 Y
. [4 x1 V% }3 t% O- P$ z: j
/* Program the TCC */
4 k6 n" f! z% g6 d
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: D; h( W1 o8 u* i, U
6 a% K% K9 c: }
/* Enable Intermediate & Final transfer completion interrupt */
2 G. D7 G' N9 M" ^
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. C8 F D; D! V# \6 N
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 R6 `. c) I% [
- k1 W4 |5 S+ m$ B1 c
/* AB Sync Transfer Mode */
8 h5 ?, f8 [& u" s$ h' D( ^0 j5 L F! N
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 M# `' D( l1 e
2 l! d: G; w) D
/* Program the source and dest addresses for master DMA channel */
0 o8 V5 I: Z' i8 t' e5 F8 B
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 t9 q' X! B6 k1 b" B# z& Z0 }9 O$ S; c( p
paramSet.destAddr = (uint32_t)(ping_buffer);
( p. m- V3 j I8 @0 i
0 W& _' f; U; Y. K6 i
/* Write to the master DMA channel first. */
0 w9 I( ?% M0 L+ a& ~
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
8 K: |9 p9 ]$ F" \
}
5 n+ Q% h. ^1 v! W
: ]3 P7 l% q) g$ d+ [( g
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! @5 g# l3 d' b' w
4 [ X9 p! H" }$ B& S* O
if(result == EDMA3_DRV_SOK)
% M. j! N/ w; C1 ]9 Y
{
; V9 Z& G8 A* y! T: G! }& G
print2arm("edma3 driver init success.",0);
3 k# F2 r4 h4 [, f$ Q( M1 H0 [
}
- Z& d/ k9 e2 w y) n4 Z" o; G
}
# x( D1 ?4 G" f
+ ^% a3 l6 O) G; ~6 D5 A5 T, c4 [
: d* D* K# }' P' I# m1 A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. F# `. R0 f0 J: a) d7 k2 S
$ x" e! R* J, V$ z
J! k7 x! V( \; t, t9 z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 c) `! B7 q" }/ a" U) m$ M3 b$ q
每次DMA传输完成后都要再次使能传输
$ {8 a, L3 i9 v' q T: y
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4