嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 |5 r+ A% S$ }; r' R2 t
#define PING_PONG_ACNT 1
9 E( U# j8 E; U, v2 J" ^. a5 l/ v
#define PING_PONG_BCNT 8*32*40
8 W& @' `1 F- @7 f3 q M2 @
//#define PING_PONG_BCNT 1
7 L- T" L/ p. c0 A8 z" u
#define PING_PONG_CCNT 1
% O6 \4 U! W9 H6 q) A
#define MCASP_BASEADDR 0x01D00000
/ S8 b) a5 L, ?8 q& f
#define Mcasp_RXEVENTQUE (0u)
9 O$ c5 F% b9 k
4 t9 K9 `& D+ O+ E" {1 v
/* OPT Field specific defines */
3 Y/ B8 w& r0 h [, U
#define OPT_SYNCDIM_SHIFT (0x00000002u)
$ R4 W. u. r4 |/ D7 n+ ?: D, H
#define OPT_TCC_MASK (0x0003F000u)
. F, N$ g. H8 A9 X2 }+ B
#define OPT_TCC_SHIFT (0x0000000Cu)
@" B- I' n" K( A; ^1 H# I o
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, A" E( N' e& L
#define OPT_TCINTEN_SHIFT (0x00000014u)
! x9 }) l+ F7 M+ {
4 k7 d. V. c; Z# Q* O! S5 S
char ping_buffer[PING_PONG_BCNT];
* e, r+ d6 {# s7 C3 s3 D
char pong_buffer[PING_PONG_BCNT];
+ h( U1 L' U) j! Z. W
: S+ p9 k4 x! F! b0 s/ f9 ^/ ]
0 u0 q( O. X0 G
& g! C+ t2 W5 W1 Y# \
" D L( W6 m7 B+ ]2 H
static void ys_edma3_init()
- h8 }' n3 H4 E3 {, e0 X
{
0 z _0 Y4 ~) W7 D+ M
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; g7 y& ?' d1 Q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 Q% t2 S' [: k# z7 b
EDMA3_DRV_Handle hEdma;
/ n; L9 j. N3 F7 m! d4 }
uint32_t chId = 0;
& N; O, s" d* ~$ v; W) c
uint32_t tcc = 0;
- ?7 B) l! E/ Y4 {5 @2 v
' g i9 `4 _8 |: K+ I
print2arm("edma3 driver init...",0);
5 C9 I+ o4 s) B/ v
% L+ K' O" f/ ^1 ?
hEdma = edma3init(0,&result);
0 q$ y4 }- u& |5 J" }, R
if(hEdma)
! p& `, K0 q$ ~0 c5 Z( ]: `
{
7 _+ j) a7 X ~) C
print2arm("edma3init() Passed.",0);
- g1 d: k0 k. b+ ^) Y3 @5 k! M
}
9 l9 I' t' e& Q& f
else
0 u0 [& L6 G' Z+ \/ r9 ~* V6 g
{
9 t# s- F$ T' J6 q" Y. }
print2arm("edma3init() Failed.",0);
! K `1 j9 P! G: f/ l% j
}
]! m! h9 p" c( f' `
3 `0 O! Z- w7 s% j) `
if (result == EDMA3_DRV_SOK)
) l. C4 q9 |4 |' A4 n. K
{
0 V, `9 ?1 U6 W
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, Q& w5 P5 Q7 r
(EDMA3_RM_EventQueue)0,
! ]4 p7 _1 F; g. W* n2 y
&edma3_isr, NULL);
' T7 d+ ] Q. O+ h3 h# H5 n
}
' R$ B7 ^/ _8 Q0 L# n6 y
# m$ C! F' O& C- A0 R* E
if(result == EDMA3_DRV_SOK)
0 A2 @& f/ a+ {! g6 S1 [
{
# D' z" B+ E; N# Q/ J3 u
paramSet.srcBIdx = 0;
/ y: Q( J- ]- Z# O0 E$ P& `
paramSet.destBIdx = 1;
7 E2 E* d+ X4 {
paramSet.srcCIdx = 0;
T# v _+ j' w: ]5 c
paramSet.destCIdx = 0;
+ s+ H7 _4 x* S1 p: p
paramSet.aCnt = PING_PONG_ACNT;
8 ]' G7 ]3 W3 ~5 B3 b/ k4 a; u2 O
paramSet.bCnt = PING_PONG_BCNT;
) ]( ?# M# e q; p& h: s6 T
paramSet.cCnt = PING_PONG_CCNT;
5 S, u2 ~8 E6 \
: e0 t' C o, w- H2 z
/* For AB-synchronized transfers, BCNTRLD is not used. */
0 I# P8 i( Y1 O K+ B
paramSet.bCntReload = PING_PONG_BCNT;
8 N' S1 l+ m2 \* B: [5 g& n
" A4 g; u' `/ v: b4 B" D
/* Src in constant mode Dest in INCR modes */
" y' v; K& s4 h+ S; r9 `; K
paramSet.opt &= 0xFFFFFFFDu;
. f/ V6 n# o0 Y, L
//paramSet.opt &= 0xFFFFFFFCu;
1 K: q' ^# n& D/ G* h3 h
/ M" x! z0 Z1 D
/* Program the TCC */
. z$ V$ T' m6 i+ j
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" F n5 s5 W$ z
) Y$ A6 V# l, @' k/ m
/* Enable Intermediate & Final transfer completion interrupt */
Z, u# E q" ]6 O7 z1 n
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( j/ j" w- P$ B" S5 f
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! E& }' [1 t1 n/ t
7 P, I/ I3 _+ ^( |3 S$ U
/* AB Sync Transfer Mode */
- m+ V0 G0 a! {2 p5 ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 C* q p+ x4 c1 ?0 z0 h& S, @
. [6 @- W# ~% \$ D& N
/* Program the source and dest addresses for master DMA channel */
I, M6 p5 q/ N! e1 l# t* p
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! u! e0 ? t* P( V2 q5 \2 \
paramSet.destAddr = (uint32_t)(ping_buffer);
2 g. p0 B" v, w9 g; ? Y
2 t4 _- {1 T4 f2 G: }
/* Write to the master DMA channel first. */
4 ^; C+ ^" G% C5 v# W* o$ H6 x
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
+ U/ l2 l; N/ B; W% r- E) f% U9 p. S( M
}
( p' {( x- m, a9 T1 n% v( S
/ `+ ?" h" ^0 k2 t
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: M% r8 z. a8 Y- m# M) J8 S
/ t3 ^) N/ |. d
if(result == EDMA3_DRV_SOK)
+ q- n) D( W( [; ^9 m) P
{
h7 l" h, `! ?; c
print2arm("edma3 driver init success.",0);
8 l$ p# s8 v6 e# V. X$ U# ]
}
' Z: J2 i3 f5 {& @/ g; d1 A
}
) D! D/ N% b2 B% v& ]7 \
3 Q3 M6 |$ \/ Z/ u
: c. m4 w' J0 F+ Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 X6 Z$ q& N: r0 ]% p5 S9 }2 C
. V8 V7 k0 R( @
2 i& C9 v% I: g2 P' q; s/ t
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& v6 m$ I4 s/ f0 a6 a- Z% Q2 l
每次DMA传输完成后都要再次使能传输
3 G5 b- b, y% |: p* Q
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4