嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- O- n4 I( t, n
#define PING_PONG_ACNT 1
3 O5 e( x9 l. z8 y# p5 h& |
#define PING_PONG_BCNT 8*32*40
5 I! g1 e% v7 a3 q% ~
//#define PING_PONG_BCNT 1
" V. B0 ^. i* O1 A
#define PING_PONG_CCNT 1
( I, r; Y# [2 d2 `( x
#define MCASP_BASEADDR 0x01D00000
4 K+ b3 T3 q* i6 V( b7 q) j
#define Mcasp_RXEVENTQUE (0u)
( W+ r( w% T2 v" ]: V5 w
( Y3 z; s" T. v. M6 H
/* OPT Field specific defines */
" Y* L3 N1 Z9 T. C) h
#define OPT_SYNCDIM_SHIFT (0x00000002u)
6 f" A3 n# g9 L
#define OPT_TCC_MASK (0x0003F000u)
. z% y+ F! p# k% I& H
#define OPT_TCC_SHIFT (0x0000000Cu)
% d" D/ a8 \& S7 ?( y' u3 q1 G
#define OPT_ITCINTEN_SHIFT (0x00000015u)
/ T j$ N. u% k4 T
#define OPT_TCINTEN_SHIFT (0x00000014u)
+ ?& X q( A2 e9 b+ _# ]
; R& F6 k u0 m$ x% {
char ping_buffer[PING_PONG_BCNT];
7 n7 P/ R7 \# H$ }
char pong_buffer[PING_PONG_BCNT];
; b8 k* u6 h( ?# c
- J" c* g; ?6 E7 ^$ L
3 ^) z2 B3 w. H) V' y' O2 V* }( v
! y( b _) Q3 U
& [( J# H7 |; y J, U4 o- c4 O+ [
static void ys_edma3_init()
1 s. d% U9 `& P, a. {5 T
{
1 G' `% ^1 v p+ m
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 H/ y# n7 C! [* f$ \6 v* [; Z. P
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 q, [: N- C2 ~/ t: u/ _
EDMA3_DRV_Handle hEdma;
- ^% o5 P+ W, {" |
uint32_t chId = 0;
4 x. f1 m- Y: C" I& ~7 A
uint32_t tcc = 0;
8 D8 R `7 G/ l/ V$ B: H& Y. }
- B% e) I3 X9 A2 D; c
print2arm("edma3 driver init...",0);
: D* q n& y1 z
7 z' k7 S0 ] j5 A/ v* M9 H
hEdma = edma3init(0,&result);
7 y7 w& |& T/ f3 M
if(hEdma)
+ ]: O( L9 n2 i" B1 R1 _$ i: N
{
" W* p& _9 o/ h, T
print2arm("edma3init() Passed.",0);
y' ~9 v) k. I3 Y: `% z
}
' ~6 M4 v5 Q% G1 N5 `) ~; E6 k
else
: h O. R* \* b* Q* [$ h8 ?
{
+ J8 Q3 h# A4 e, f: C
print2arm("edma3init() Failed.",0);
; N; e! Y9 R1 K, M' y
}
' b6 [+ Z9 \" o0 g3 q) d! {% \
1 k6 ]* S1 }3 a2 V* P
if (result == EDMA3_DRV_SOK)
' g! v; L. [* c; E
{
6 [) \ `9 ]* ^" @- x+ F2 }6 p; }
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
[) |1 Z' z7 X3 E& Q. J
(EDMA3_RM_EventQueue)0,
2 @0 D7 j, R' F- s
&edma3_isr, NULL);
8 F/ i3 s3 Q& V' q7 R9 i
}
/ e3 i4 U/ F& ?& e/ }" m9 q
/ L" A v) n6 h1 m. H6 D7 E' H& @
if(result == EDMA3_DRV_SOK)
& ~% _% a3 r3 J9 R, O
{
/ o* {: u$ F7 f* u. H. C2 U# ~
paramSet.srcBIdx = 0;
1 A+ [" I) p2 S: h) `
paramSet.destBIdx = 1;
2 H4 `0 j6 `; W) `* [
paramSet.srcCIdx = 0;
( R. ~+ _, c1 k8 h
paramSet.destCIdx = 0;
, M- P* U' Y4 S/ c
paramSet.aCnt = PING_PONG_ACNT;
8 c/ m, q$ n- @! f8 O
paramSet.bCnt = PING_PONG_BCNT;
p- [% Q9 d1 G4 n
paramSet.cCnt = PING_PONG_CCNT;
$ h8 p2 Q( X( a* ]- o" [: m) N" E/ e/ {
; H$ Z6 W" `! a. i8 T: ~- O
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 Z9 D2 f9 j& F
paramSet.bCntReload = PING_PONG_BCNT;
^0 X H. K' X4 {
; t( |/ J/ t1 \0 G+ U
/* Src in constant mode Dest in INCR modes */
]. `& K3 D( h
paramSet.opt &= 0xFFFFFFFDu;
/ _4 a( B& X7 N- V; `- H; Y$ g
//paramSet.opt &= 0xFFFFFFFCu;
( d% k! }5 M. _2 W
0 u' a( H& Y- E& t$ K
/* Program the TCC */
, {. D# O- F; i$ N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& b& j1 g8 G& M3 j: t
+ D6 `+ t; b8 Q# B; a
/* Enable Intermediate & Final transfer completion interrupt */
( i" z" Q( E+ L3 H& s: H
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& {6 S" R( x" l' B/ [1 `
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
# U! f+ m: ]; Z+ P' O
% G( J" U7 u2 B; X+ V) j( @
/* AB Sync Transfer Mode */
4 ?( k1 P, j4 ~. D
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* F( \* |1 {; A. I$ a8 c
. G6 }* m. ?- P# j& }
/* Program the source and dest addresses for master DMA channel */
' S h# P5 }! s; Z8 J! u" J
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, m; O% O6 I4 n2 ], i0 c! p
paramSet.destAddr = (uint32_t)(ping_buffer);
* m! s$ G( @( F
* D# W$ I8 n( h- A
/* Write to the master DMA channel first. */
7 p! _6 }; b3 X" v
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 P9 G# `" s) @/ T N) S+ u8 D9 {
}
5 V. M) K. [$ m5 r% C) B! C: b! \
+ a- x+ ~ ?' m; u& A- _* A
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- n- a# W. X. Q% D S; k1 M' F3 j
# u% d; R! ]9 i" A& H% M
if(result == EDMA3_DRV_SOK)
# |. E3 ^, x# ~; i$ x8 H
{
, l# K- d+ i6 E$ Y8 E o
print2arm("edma3 driver init success.",0);
( Y" q% y$ b' P- I! l* \! k
}
0 f. `& n% _+ \& M6 ]
}
' Y; a$ f8 \) V( `0 C
9 }8 l. l2 B6 V S2 X# \
( q+ I( Z; [$ b8 C1 d2 r G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 d: v, f, }& b. f0 ]7 K, k! Y
. P5 c. G) X K& g( D
- U) K' V0 R, e, D, d
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 B% p! R T9 {! |& e9 ]% V5 @
每次DMA传输完成后都要再次使能传输
$ I* z& { q. p7 v
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4