嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ y% e% U; Z$ S$ W/ `4 ?
#define PING_PONG_ACNT 1
- W2 G+ N! S1 p7 |7 x. }
#define PING_PONG_BCNT 8*32*40
/ z& B$ c/ w! H$ j* {3 O" U: ?
//#define PING_PONG_BCNT 1
3 L, X& C, j! c" n( F$ @
#define PING_PONG_CCNT 1
B! O1 ~7 u9 B0 ]3 ?" {
#define MCASP_BASEADDR 0x01D00000
+ P. T' r2 r# ], ~! n" p9 E+ F
#define Mcasp_RXEVENTQUE (0u)
) A# j5 ^. W! Z6 Z
3 [( ^6 M% R' @4 }* \/ c
/* OPT Field specific defines */
$ E- s- T' {# t$ S `" K% r: O6 e
#define OPT_SYNCDIM_SHIFT (0x00000002u)
9 q5 u" E# k8 R ?! O
#define OPT_TCC_MASK (0x0003F000u)
7 S- g( W$ f! C( ]) K7 `, M
#define OPT_TCC_SHIFT (0x0000000Cu)
3 I! j/ [$ v& g1 O" h# Z% L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
; q/ ?: r& Y& y2 k
#define OPT_TCINTEN_SHIFT (0x00000014u)
" x6 h' p0 j. l! V4 X t
7 Y* @ ]) ~( X0 i
char ping_buffer[PING_PONG_BCNT];
5 g( E2 y, S4 I( d
char pong_buffer[PING_PONG_BCNT];
2 r" _/ n$ u' O+ L H4 r# F
" d- @5 R. v) S$ r3 ]
5 Z& l. M* X2 i3 O
" t% l7 [2 m2 K. K8 r+ h& p( F' _ ~
- y# N* e# h2 }; ~; z0 J; e! z
static void ys_edma3_init()
( q* t, i+ H v
{
' N5 F; }" O5 ]
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
9 m+ L1 B0 b+ V# w3 r
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. H( L( V- W% l0 n& V9 O6 n4 ?% b+ z
EDMA3_DRV_Handle hEdma;
9 `; K& h, p9 E
uint32_t chId = 0;
9 e* w( o/ r+ I2 j* u
uint32_t tcc = 0;
" N* f3 \# K! B* \7 ^0 T
2 w2 h* k: N, P3 n- T4 G5 N
print2arm("edma3 driver init...",0);
* l9 m& s7 k/ b3 N3 _; e
E- y( P) Y8 K6 k+ s4 T
hEdma = edma3init(0,&result);
) h6 U& K$ b6 y( ^/ W& Q; t
if(hEdma)
$ k- c9 H+ m4 i/ t2 x
{
( w0 @0 t: {( f$ G: O
print2arm("edma3init() Passed.",0);
/ i% t! a% L% t% H3 i2 }
}
& K3 j. |1 ]! D4 Y/ x* y
else
$ X0 P: C% c1 g8 @; o6 I" J% N
{
; ]( d2 i* _) R8 h
print2arm("edma3init() Failed.",0);
+ ^% R! x, n0 N8 Y& x: y* n9 [( I
}
* v* D4 j4 l% m
9 K- E6 W3 W3 r& w. }7 K3 p
if (result == EDMA3_DRV_SOK)
+ t3 m( P8 A1 P" @( K: Z& X# @3 V
{
) W4 o+ j1 B$ `, ?1 c" Q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" ~" v7 R1 `( c3 V8 N9 u: u
(EDMA3_RM_EventQueue)0,
8 |0 C& x. H6 o7 ]% y( o
&edma3_isr, NULL);
4 S9 Z! `7 N5 v' _
}
( R1 U' f% D# ?: |& K4 q
9 d1 J. w. S$ ?1 ]
if(result == EDMA3_DRV_SOK)
4 b/ z; E, Y2 v; Z+ X
{
4 n. }; |2 ~3 g" Q( B0 B
paramSet.srcBIdx = 0;
6 e4 B9 J) h# j& W
paramSet.destBIdx = 1;
$ l/ d: H# C" K% [( S+ N) Y* y
paramSet.srcCIdx = 0;
$ r, n& _- X0 s- v( H) A
paramSet.destCIdx = 0;
. s7 f" u8 u7 I* S) \. y" L
paramSet.aCnt = PING_PONG_ACNT;
5 {- d# k0 z: F$ D S/ M
paramSet.bCnt = PING_PONG_BCNT;
* d; z Y% U8 A- [
paramSet.cCnt = PING_PONG_CCNT;
# e; _6 C9 u! U- l/ M
4 V# B" B4 q5 b/ U) H8 B ~
/* For AB-synchronized transfers, BCNTRLD is not used. */
: j% f, V+ Y4 c# e% }8 u, p
paramSet.bCntReload = PING_PONG_BCNT;
" j; p5 h1 L2 C4 }& N1 ]# J
; }2 ~. P% E" h* X6 c2 _/ N1 x
/* Src in constant mode Dest in INCR modes */
0 Q1 f: \) K3 O2 ]4 I
paramSet.opt &= 0xFFFFFFFDu;
+ ?% _' t, D1 f u# X
//paramSet.opt &= 0xFFFFFFFCu;
+ t3 J' r" U& ~6 ]
8 U8 @: M: _0 P/ z; }& F
/* Program the TCC */
{/ f- F# v6 \
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% J& ? x6 M" p1 @# p0 @( N" B& u% B
\% u5 Q% Q1 s
/* Enable Intermediate & Final transfer completion interrupt */
& q0 j2 ~0 x( S. J4 r
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. f* W& r$ T0 P4 \
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 Y. W3 ^( |/ x! g+ D/ L8 |
' Z G q5 q$ K B
/* AB Sync Transfer Mode */
$ v& Z5 ~* K5 t5 d6 C+ m) k
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) W; F% [) W! E" L( d
- }. R( T% [ H* U
/* Program the source and dest addresses for master DMA channel */
2 B1 V& T% M& |: t" e" A+ j4 Z
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 [) F. g0 D( R$ k, r- K. B' b
paramSet.destAddr = (uint32_t)(ping_buffer);
/ T! j( o# \# R
& c0 C+ J4 B" L3 k6 w3 Y
/* Write to the master DMA channel first. */
+ g1 f1 L8 j, k! Q6 L* z- |
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 S7 a( v% `/ D
}
2 B5 s- Y/ h: G7 {
; R% d& T, o0 M- ?" l8 x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 I: Y" Q; X, ]+ p. m
5 i. z" J$ R' w/ _2 ?. i; o
if(result == EDMA3_DRV_SOK)
1 e; ^5 J' O6 G
{
2 b9 n& K/ U1 b1 c0 p) [/ \
print2arm("edma3 driver init success.",0);
0 X2 }2 O4 r! y0 r) C
}
: C$ L" B" T1 \; E3 V9 D
}
* F: G+ \+ g6 Q
, b# q3 V1 e, l, o. o0 ^. H8 e$ W
! F- J5 \" V% ^# v" F; p0 A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 \) I0 }! I* P( Q/ h
% m- V4 Q# e6 F" d* m& x
2 [: `0 V0 v( F! Q: c9 K! r" d
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% t' e. u1 K6 c f- o5 z
每次DMA传输完成后都要再次使能传输
: G2 f) Z" e+ J$ R2 J1 p8 F
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4