嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# f _$ K5 J/ V* I- ~
#define PING_PONG_ACNT 1
! C. c0 [9 d |6 H+ r1 @3 R+ M3 P* e
#define PING_PONG_BCNT 8*32*40
1 O' ~# A+ O) ]& s2 m
//#define PING_PONG_BCNT 1
+ e& _3 B X! `! _' N, N7 I
#define PING_PONG_CCNT 1
4 ]& F6 n: w" T$ l) A/ ~
#define MCASP_BASEADDR 0x01D00000
) z$ O! a' R) }+ D
#define Mcasp_RXEVENTQUE (0u)
. C8 Z+ \3 F) U+ L
, g, Y6 j/ ], e! _) x) T
/* OPT Field specific defines */
5 ^9 ~: o( M5 X$ }; b8 ~
#define OPT_SYNCDIM_SHIFT (0x00000002u)
, P( g& m/ ?; X4 ~. ] L/ k& ^5 Q
#define OPT_TCC_MASK (0x0003F000u)
+ e+ F0 T* X& Q5 v2 j8 \* h0 Q+ H
#define OPT_TCC_SHIFT (0x0000000Cu)
- j) c, N" _' d0 h' p0 h! F
#define OPT_ITCINTEN_SHIFT (0x00000015u)
c' D) Z- C, Y9 Z# T2 J
#define OPT_TCINTEN_SHIFT (0x00000014u)
; l5 R7 R2 F1 x: w7 b( E
& L1 ~2 {. n" L3 ]
char ping_buffer[PING_PONG_BCNT];
( Z) J, @; s8 O, O
char pong_buffer[PING_PONG_BCNT];
! F# e P- z" a" j$ }( J6 K
0 S/ s' R7 b1 L" h" b9 u
! S) Q! W) J6 s( v g' h" M
J7 H, J( d# \8 c% F* _+ v
1 i, J8 ?- d5 q9 l# t
static void ys_edma3_init()
# z# g% H( E- U2 K- D
{
2 P7 B; q0 Y' F5 a- [' E8 d
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 _/ y1 B0 h7 ~6 W7 ]4 y
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
: i% a2 b( v- i3 B3 i# G
EDMA3_DRV_Handle hEdma;
, W. T3 t8 S$ z3 Q
uint32_t chId = 0;
+ `+ Q5 D2 l8 [9 T
uint32_t tcc = 0;
* \8 s Q5 F: V( {4 m7 Q4 y
8 s$ W& E! L0 u3 |1 W/ z
print2arm("edma3 driver init...",0);
# Y$ E, z. U- ~8 L
4 l0 m: a* `+ q1 Q( Z
hEdma = edma3init(0,&result);
" P( ^: U/ ?/ u' s: p& i
if(hEdma)
) I3 L3 `1 a: K
{
: ]+ V/ p+ `: J+ d5 P v! l! Z
print2arm("edma3init() Passed.",0);
5 r3 q# p' U& `9 W" G
}
# x/ \7 [' i2 v2 e7 M8 [" A6 K" t4 U
else
: c h' i# {+ L5 \- E, j" X0 ]
{
G6 M: x6 u$ ?% X) d/ n4 R/ k
print2arm("edma3init() Failed.",0);
5 ~: j; ~/ ~! l; A g( c
}
. a" D# |; b% x6 ^
+ |, a/ t6 H& g/ U- N* S; X3 G
if (result == EDMA3_DRV_SOK)
; N$ c, w7 Q( j3 t
{
# @% O: O( D+ q" ]: [8 W" g! @
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! c% q4 M2 o8 {( ^% t
(EDMA3_RM_EventQueue)0,
0 e2 Z, U" ~7 R2 T$ i6 H
&edma3_isr, NULL);
3 K6 j3 p9 I# H* X# @/ W
}
6 c) H7 q: U) J' Z" A
, D3 P8 [4 T# |9 D
if(result == EDMA3_DRV_SOK)
& q$ J/ e0 W2 E |" B1 t4 r' `
{
' [1 J& B6 {# L" v1 B
paramSet.srcBIdx = 0;
' B$ ?. P6 }. h/ B* V
paramSet.destBIdx = 1;
$ n5 Q8 Q1 s8 X3 J3 R9 r& c5 n
paramSet.srcCIdx = 0;
: i6 Z9 ?) a7 X( ]
paramSet.destCIdx = 0;
$ n' ?3 E0 h* A# h9 |
paramSet.aCnt = PING_PONG_ACNT;
; N9 O# S9 Q7 W# w( O
paramSet.bCnt = PING_PONG_BCNT;
8 g. k2 F5 c% r
paramSet.cCnt = PING_PONG_CCNT;
4 V7 g7 x+ k1 W, u/ v- R2 h
' p: w; S2 F- D, a$ f7 M
/* For AB-synchronized transfers, BCNTRLD is not used. */
) L+ `& q, |' e' w5 A7 _& ?- |: P+ {
paramSet.bCntReload = PING_PONG_BCNT;
" p4 y& T: z9 T8 n0 P% \
& }9 \; }/ A2 W1 O
/* Src in constant mode Dest in INCR modes */
/ u4 ?' E" P+ S9 S" ?! Z
paramSet.opt &= 0xFFFFFFFDu;
; H, D/ o( v! j( v, a" k
//paramSet.opt &= 0xFFFFFFFCu;
6 l6 _7 @" S9 j& R" [
- L! a7 g3 Q+ y/ B5 m2 t
/* Program the TCC */
, U3 { C$ _ v4 r6 J7 }
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; Z' l9 V" G+ V" ^
; E b, h2 M" I+ S% K4 O- |
/* Enable Intermediate & Final transfer completion interrupt */
8 W' ^5 q! Z7 ]3 `
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' r7 Y# Q5 X; @! G
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 ?: ^( ~' L/ V* W! i( z
0 N& W/ X H( R$ Q
/* AB Sync Transfer Mode */
4 @4 _: p' Y+ V8 }' a! g! N
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( ^7 B! O' M8 \/ h% [! a
$ p4 F8 {' a; w8 X
/* Program the source and dest addresses for master DMA channel */
' z F( j4 f5 `9 s# b/ X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ r$ R( _1 g8 H4 G$ d& j
paramSet.destAddr = (uint32_t)(ping_buffer);
% x/ a: I9 n5 Q. H( e
( \: P& [! w7 m; g5 K% p8 h
/* Write to the master DMA channel first. */
- _# t) W7 N2 ~, r2 m) q& X
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' J( ]5 y' J* Y, ]2 ^" v
}
1 Z6 m& w! m. T i; }' k7 Z
& O! x! ]( |% a
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% C0 q- H" N2 A% @
% n# Z* o6 g; Z4 D) M+ ^2 C* c9 g
if(result == EDMA3_DRV_SOK)
6 m- K" _; R' y7 h
{
: Z* x5 s' b7 F2 v
print2arm("edma3 driver init success.",0);
/ X' t% s6 T) u; p8 D4 s- R
}
$ ^, e9 T [3 Z& @
}
# k/ u/ ~" P0 b2 A/ ]# H$ l" u
" U9 H9 M; _6 C2 _7 @: N1 U
$ [* X) @9 ~& g6 L3 r* p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# j+ s6 F( x: N
! F1 d1 ]/ \1 {5 T/ a( j/ ?! Q M
0 x, r; ~! ]2 _8 h, \
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( N) ] y3 {" H; }& W
每次DMA传输完成后都要再次使能传输
/ q0 W/ |# i7 y3 N' J0 a; J8 o
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4