嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 E2 c' [; w* Q+ {$ C# V1 J+ Y8 `4 q' X
#define PING_PONG_ACNT 1
7 m( G; c! J }4 A' @8 | F
#define PING_PONG_BCNT 8*32*40
/ B* p. ^9 v) [, d4 P
//#define PING_PONG_BCNT 1
) N! p" |: k9 B) V3 \( z
#define PING_PONG_CCNT 1
" ~5 k; b+ f! S
#define MCASP_BASEADDR 0x01D00000
9 y/ D6 r( P$ p
#define Mcasp_RXEVENTQUE (0u)
, h u; q% A! w7 _2 z
* Y. ]5 t4 q- m$ U
/* OPT Field specific defines */
; Y& O( u. p( i* l( z
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! T k" i9 M/ i+ S& a
#define OPT_TCC_MASK (0x0003F000u)
7 Y- u) x6 o; Q% N
#define OPT_TCC_SHIFT (0x0000000Cu)
) |# m9 G/ f3 u3 R2 o X7 n- b, E3 T$ f
#define OPT_ITCINTEN_SHIFT (0x00000015u)
& q ~& F0 N& i6 ]& s
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 N9 U0 Q, r0 E8 \% h0 S2 b
5 e% p4 k1 X G3 `' n
char ping_buffer[PING_PONG_BCNT];
. }3 @' W( p5 c# g3 k# W. @6 L4 M
char pong_buffer[PING_PONG_BCNT];
+ D. k: ~5 E; C; M; ^ o
# F9 T' ]% J# j9 f; k( {
4 B4 @+ D7 ^: L$ t
; ^- X! M6 f6 G' @: }4 |1 ^; W
) ~/ J0 |3 t1 F- k5 k- }. [% W
static void ys_edma3_init()
) D* v3 @4 H, q; W( U
{
7 x! O) ^" e$ \
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% F, `! G, v1 s
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 f, J9 J% H; y6 A( x6 V b
EDMA3_DRV_Handle hEdma;
5 X4 h9 o3 c c$ b/ q( D- b
uint32_t chId = 0;
O! Y4 m/ f. S% R
uint32_t tcc = 0;
3 i* c T! R& z/ T) O) {- i. h3 a. H
. `: q& J8 @/ v
print2arm("edma3 driver init...",0);
2 o- b" M" g9 y: J, @, R
3 }- H, i6 x; `6 i
hEdma = edma3init(0,&result);
3 ^) s* e+ j- M) d# s) w& ]% R8 R3 D
if(hEdma)
/ ~1 H/ c# d5 M" d8 f
{
' B) O" M; D _
print2arm("edma3init() Passed.",0);
+ U1 ~$ k4 n, H k1 n8 K5 m+ z' |
}
& W+ o t" T/ {2 A- L: z4 d
else
: b1 B/ T h! \9 g4 w
{
& F3 s4 I4 ]5 I% b
print2arm("edma3init() Failed.",0);
+ i+ j, ]9 @% d$ }; ?5 B4 U; p
}
8 S$ s% ~6 w( ^* U1 K9 Q/ b0 O8 {
; W5 H; Q/ S$ h- [! a. b
if (result == EDMA3_DRV_SOK)
( Z/ F% u" e, B% b8 P
{
3 ^, e3 Y7 h ^2 T- w; }$ j
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 m& S* T( @ Y# g
(EDMA3_RM_EventQueue)0,
) |: R) l6 z! g
&edma3_isr, NULL);
( X9 E7 S7 ^# ?* [
}
! i8 L; r' j9 M: f0 l
8 j j7 ~( j6 `, e; P, k
if(result == EDMA3_DRV_SOK)
5 A# W# u" ~* Q# a
{
% P2 l( K" |9 p6 b& ]
paramSet.srcBIdx = 0;
5 @# T: P+ V& `
paramSet.destBIdx = 1;
1 L9 U2 q3 ^; ~( _, l
paramSet.srcCIdx = 0;
3 H3 O5 x' m W: f3 d9 d
paramSet.destCIdx = 0;
. m: H4 J0 L2 y3 S
paramSet.aCnt = PING_PONG_ACNT;
$ W4 ~! Q: d4 @! E
paramSet.bCnt = PING_PONG_BCNT;
# f0 w$ L# K7 y
paramSet.cCnt = PING_PONG_CCNT;
k6 x5 Z% r8 \' F
* n' S: `- \& g+ R' I
/* For AB-synchronized transfers, BCNTRLD is not used. */
# M% b0 r; J* u
paramSet.bCntReload = PING_PONG_BCNT;
! C1 a+ e8 ]6 }1 V! l, k$ q* H
7 ~9 e2 M' c6 t9 h
/* Src in constant mode Dest in INCR modes */
. ^0 y! Y. w/ z1 X
paramSet.opt &= 0xFFFFFFFDu;
! @% c+ H z _+ j
//paramSet.opt &= 0xFFFFFFFCu;
( M9 {2 A2 n$ U, u9 |
5 x/ f4 Y5 x8 f/ S3 X
/* Program the TCC */
# r |# q% Z, k
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 B4 _/ K0 S/ b
^1 T n. F3 l6 m& F
/* Enable Intermediate & Final transfer completion interrupt */
( \1 b2 n# o$ Z6 P7 s: G+ }
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& g: j& l' X b. L Y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) q( F2 q7 a& D8 s! @" n
# c+ q9 f/ m9 K
/* AB Sync Transfer Mode */
* E; p0 b/ ]& z" P. Y/ `5 {2 F
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 F1 N. |: U- N7 {0 E/ ~- J
- l# z9 o9 T3 N$ B( u; Y; P
/* Program the source and dest addresses for master DMA channel */
6 Q9 v7 L* W% r$ N& j# w
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# O& }8 o5 t: Q! _
paramSet.destAddr = (uint32_t)(ping_buffer);
: f2 A3 i8 ]) Z8 P
' \5 a7 x: I) t
/* Write to the master DMA channel first. */
! @8 C/ n( b F1 d! Z* ~/ R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
. M$ z5 p: O! u" a1 c
}
# N- [. y- ]( g
4 Y6 Q$ _( s' ?6 d9 M
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, E! j- S2 b- `( J/ W
4 U0 z- S7 \4 l
if(result == EDMA3_DRV_SOK)
. z |% i; q' a; P1 j J% x
{
9 R! h0 A! @# {- d8 x
print2arm("edma3 driver init success.",0);
8 o5 g5 `. B3 b6 b: `( }
}
* @( h# o. v: E
}
; T2 F9 a# }8 ?$ V
$ r% c2 ~' G! x* y; u0 w5 B3 m
! t$ g5 s( x/ ]& c/ G7 w7 [
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ a" X0 R5 _4 m/ \2 t
* M5 e# n( N. j* r _" b. u% e1 C1 \
6 I5 S0 @: c- g ~! q
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 s" _8 k! O7 L! S! f0 _
每次DMA传输完成后都要再次使能传输
7 N9 f3 u( U! J& m. \
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4