嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, F+ l% @; u& h
#define PING_PONG_ACNT 1
# @7 B% z v+ S
#define PING_PONG_BCNT 8*32*40
0 E% T- K$ o) l4 X5 D% U! Z
//#define PING_PONG_BCNT 1
2 N' g6 S& \/ L g
#define PING_PONG_CCNT 1
* x% _, a, I5 E5 s- v1 D
#define MCASP_BASEADDR 0x01D00000
0 }) M: L4 P$ t; w$ e7 n
#define Mcasp_RXEVENTQUE (0u)
+ Y0 e" K' X4 |
" }/ i. l9 s* @4 Z* a
/* OPT Field specific defines */
, _$ w4 Q7 b5 {" K4 n% j
#define OPT_SYNCDIM_SHIFT (0x00000002u)
( [: S0 R3 x; n; }/ \
#define OPT_TCC_MASK (0x0003F000u)
4 b1 J9 L% `( X k% M
#define OPT_TCC_SHIFT (0x0000000Cu)
' F+ G8 C1 F; i! e* J7 o& a1 }$ ?% N
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, S& F. t, B8 s
#define OPT_TCINTEN_SHIFT (0x00000014u)
; H+ H. Z( [/ b4 |! G7 m- s
( X2 E: e$ C. N$ V9 f# i2 c
char ping_buffer[PING_PONG_BCNT];
! E& Z1 n1 @; U6 ? \ s
char pong_buffer[PING_PONG_BCNT];
" Z7 J# D' x/ g
# i P# q; g4 X2 x* ^
" t6 \ x% I0 S: g1 W( X2 `; o
7 k" E8 B# O* Q5 p6 M- K
6 P6 `6 T$ [4 t' z2 f
static void ys_edma3_init()
5 Y" N, _/ y8 M! o+ {% U9 x$ |0 r
{
0 z" O8 y: ]( o1 A- f0 A8 M; ?
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 }8 z" R3 Z7 J2 B
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ e' P4 m7 u, h4 r0 D* h2 F. g0 H6 b
EDMA3_DRV_Handle hEdma;
) b' u. ?: c( P6 N7 c) [) _
uint32_t chId = 0;
& X0 t+ ~2 x3 o4 O" ]
uint32_t tcc = 0;
; ^. d5 O! b3 F$ P' ~6 Y3 u* X, B$ h
" e' T0 j4 c# W, J2 F
print2arm("edma3 driver init...",0);
5 m2 x0 o1 ~8 U
" y: z4 q) l+ y6 Z+ {0 [2 S
hEdma = edma3init(0,&result);
/ r. d0 D) H/ I3 m% _0 c+ x
if(hEdma)
* Y2 y1 u, q9 @4 i5 p2 Z r
{
; X" g ~" X$ W7 ] d( U
print2arm("edma3init() Passed.",0);
0 A* T: s% V# L& c
}
5 S! b: U8 K' l* S( ?# e0 j1 k
else
' V( p; s* U% f, e( J% g( ^
{
, |" \! K5 d4 N2 _4 S- C" y
print2arm("edma3init() Failed.",0);
1 U3 j3 z+ v0 {5 q
}
* ?* \1 S1 F0 ]
, K W. f: i+ e) t/ e$ P; V
if (result == EDMA3_DRV_SOK)
3 J( `! _) u2 f% s% x8 |
{
& s, W' h' H% U7 @
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 M9 F: \ V5 x
(EDMA3_RM_EventQueue)0,
; I* }8 I+ P# {; L2 `
&edma3_isr, NULL);
1 ~0 g" R Q. J2 e) d
}
5 C' \0 m" y7 a9 w0 t- x8 s+ F- q( z0 }
h- A0 n3 j. W" ^7 S
if(result == EDMA3_DRV_SOK)
9 A8 H6 @) o. R; }
{
7 ?9 n4 O$ k- n. B" u! V
paramSet.srcBIdx = 0;
0 A3 T6 M3 H& S
paramSet.destBIdx = 1;
2 I% G4 N" y$ H) E
paramSet.srcCIdx = 0;
$ B2 f8 e5 Y) {: ^" F d
paramSet.destCIdx = 0;
* B& I/ B3 e6 e4 _+ X( R, l
paramSet.aCnt = PING_PONG_ACNT;
0 O8 w3 f3 _1 W8 p% k0 Y
paramSet.bCnt = PING_PONG_BCNT;
3 x4 }% C- w4 o+ Y* C
paramSet.cCnt = PING_PONG_CCNT;
7 Y' `) b6 v1 W. ~" `# {; U5 N
5 \ D# R* W0 c9 T! p2 [4 z. I
/* For AB-synchronized transfers, BCNTRLD is not used. */
- f! K2 Y. C& }- q
paramSet.bCntReload = PING_PONG_BCNT;
/ k; }* _2 ]+ \& `
. l c$ j, c0 e. ^
/* Src in constant mode Dest in INCR modes */
6 |6 H* n+ `2 u) I7 l2 W2 I3 L
paramSet.opt &= 0xFFFFFFFDu;
5 T4 n$ h9 b, d8 f: B
//paramSet.opt &= 0xFFFFFFFCu;
8 P9 P0 R; H' E& h7 G
" \! V7 d, ]3 E( U6 A
/* Program the TCC */
' z% p3 b0 q* M' w; L( g, M. U% k
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ k. `7 ^ {" B2 |* N# Q" n
+ f8 C# d: E) r
/* Enable Intermediate & Final transfer completion interrupt */
; _$ p& c# m- l) K0 d/ j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& I7 N$ O7 {. P- s4 U, O
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 F5 ]3 f; x8 z7 q$ e7 Q. Y R$ W
l, Q) G5 h* {% V/ b- W8 ~
/* AB Sync Transfer Mode */
' U: E+ r# T/ P$ _; g& `5 T
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 L+ o/ o1 x" ~, S3 v
2 S$ x1 K0 b) O* R/ M* z6 O
/* Program the source and dest addresses for master DMA channel */
: x: }, J8 @$ T) T( W0 L) T
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
) W! l* F& U, t+ n" @% x
paramSet.destAddr = (uint32_t)(ping_buffer);
& ?( k0 K* e+ l$ M* k
6 l( r" [& I/ f& C3 K$ c' Y! ~
/* Write to the master DMA channel first. */
' ]5 i% R% u$ e/ y! M R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- m5 ~* c" _8 `' N* R
}
9 i# J8 h }* N k$ O \' V" Z
' ] B( K0 a$ E9 {3 e- p
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' z( }9 U6 Y- @& `# ]
( ]# H9 S) a* L, }
if(result == EDMA3_DRV_SOK)
" p3 L; Y4 d1 N3 M
{
( q$ n4 c7 ]( F6 g- b0 L" M
print2arm("edma3 driver init success.",0);
! k) `, o6 E- S
}
7 _3 S+ E* x! B5 i" @# k% q2 X
}
4 `7 k9 k2 x7 f. _
: H5 H7 ?% f/ N% o r1 Q) J9 z' x: p
5 w! c X8 A" C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: p Z$ m9 |/ f7 D6 A4 i
- x2 W: g+ [" _: R
( J$ i# f; A5 h* O
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 S8 e0 R1 E2 z' ^4 J( P* r& Z
每次DMA传输完成后都要再次使能传输
" [* Z6 H' o. y
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4