嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' _" { e4 I3 b! O
#define PING_PONG_ACNT 1
0 N+ b$ E( r0 E+ s; \1 X! ~
#define PING_PONG_BCNT 8*32*40
- s5 D) E1 ?4 z
//#define PING_PONG_BCNT 1
3 W# t/ S# \$ j5 v) [
#define PING_PONG_CCNT 1
# u1 l7 P7 K& X& N6 w/ z( c
#define MCASP_BASEADDR 0x01D00000
2 U: Q0 t; f7 Z. T7 x
#define Mcasp_RXEVENTQUE (0u)
% E- X% b) E: Q3 a! {7 ~5 L: c
0 z k" D- ^+ D
/* OPT Field specific defines */
+ z2 v0 M% X. K% l) f. R
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 ]5 k% D" G6 i8 ~& ]
#define OPT_TCC_MASK (0x0003F000u)
# O+ I- e# g2 P) n5 {- u7 t
#define OPT_TCC_SHIFT (0x0000000Cu)
! F! c+ D$ N2 E! A$ ]: K7 i Y5 |
#define OPT_ITCINTEN_SHIFT (0x00000015u)
2 K) p; n4 m) ^1 a9 A
#define OPT_TCINTEN_SHIFT (0x00000014u)
: i- @# r j$ q: V! N
* Y; ~- H, h# Q
char ping_buffer[PING_PONG_BCNT];
" x5 j, r( k+ S: V
char pong_buffer[PING_PONG_BCNT];
8 A# L& i- l" b9 M: B* b3 y
/ K1 o% j5 m, T! k' E5 _
0 S' U5 U) S( w8 L
/ t& @, d* G+ u
0 Z' y0 I9 u4 S, ^4 j8 L7 q( n
static void ys_edma3_init()
' i' E0 Z7 L; W$ A( ?! V' J% c' _
{
5 L7 W8 |9 [/ u7 `# E5 a
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 S) ?9 Z1 ]5 E6 ^ Z( T" S
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; f2 o& P; Q6 u% L, n: M
EDMA3_DRV_Handle hEdma;
6 P7 F) ^' l+ f/ Z
uint32_t chId = 0;
: t6 D: R5 {7 p) S. Q7 D6 t1 D. y
uint32_t tcc = 0;
3 y4 G) T$ S4 Z8 f* c* v
0 \# y: c3 p( G4 {6 i' Y2 ^
print2arm("edma3 driver init...",0);
- A, L) F6 p1 o
_& P { {8 {* j; C$ T- A
hEdma = edma3init(0,&result);
# O7 }2 s1 }6 }1 f0 f1 o8 W
if(hEdma)
: p) m- h; M5 P8 m! h
{
8 j2 j4 u- j! t K; f
print2arm("edma3init() Passed.",0);
6 O) H# z5 y& P) e" b) }
}
$ A; |: w+ W6 g8 a5 W' f9 r8 E" E
else
' }% m$ L0 F/ i
{
& i" @1 E3 n( s* h
print2arm("edma3init() Failed.",0);
8 u7 F2 q/ r' `" ]7 T) g4 @
}
( U- B3 T' E9 `6 G+ J/ }( ]
9 k& i4 X9 ~' E
if (result == EDMA3_DRV_SOK)
1 T; D* {2 L- t
{
% `, Y' b" {. b
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ T7 K5 ]* [/ G. U
(EDMA3_RM_EventQueue)0,
7 n* i; w/ ~+ X* ?
&edma3_isr, NULL);
/ x1 ?9 u1 t0 Q$ M1 k5 b) g7 T
}
$ b1 }6 R8 d4 L3 _8 [: C% l
3 Y) j* \4 ~5 r8 ?0 n8 F3 {! t w
if(result == EDMA3_DRV_SOK)
4 J2 l0 u S- I2 N1 e: V. T
{
: k8 h3 p7 `/ o7 b; t
paramSet.srcBIdx = 0;
4 s7 F# [( X7 U2 D
paramSet.destBIdx = 1;
& ]7 Z6 |9 o; B* G5 Y
paramSet.srcCIdx = 0;
0 V8 r/ z3 p( {" H3 b! Z8 Y0 Y. w, ]
paramSet.destCIdx = 0;
6 g: z3 |# `2 f; y* M$ A1 v% {
paramSet.aCnt = PING_PONG_ACNT;
) b# i, s3 d4 |# [' q; y
paramSet.bCnt = PING_PONG_BCNT;
1 D Y8 m& V5 ?8 N5 ]$ N
paramSet.cCnt = PING_PONG_CCNT;
+ }4 Q% i$ ]. s t( m* D) Q) r& @0 ~
Q: d5 v* N9 a% c5 i$ X
/* For AB-synchronized transfers, BCNTRLD is not used. */
, y" Q9 }( p0 V: X1 C; k! t
paramSet.bCntReload = PING_PONG_BCNT;
# Y( \" U; o4 r( I
R) v6 O' j; V p( |
/* Src in constant mode Dest in INCR modes */
9 f% J( M5 h5 E' W# E7 d% O
paramSet.opt &= 0xFFFFFFFDu;
0 y/ |+ n6 e. w! ~2 |% }
//paramSet.opt &= 0xFFFFFFFCu;
, {5 W/ T, X! e% |; s% }+ q9 B
}; m/ \# [3 D2 I7 m
/* Program the TCC */
. g* `, C) n+ b& o! u& e* }
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! q6 [3 j3 o& G! n8 g' [' m
9 F! {, Q# g. }
/* Enable Intermediate & Final transfer completion interrupt */
, {( [ o1 N; s/ N `
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ t) [8 k6 x$ F( |3 r/ X
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- n( B8 h9 N. f5 s' w5 z
) L7 S K, A4 N4 y- t
/* AB Sync Transfer Mode */
/ e/ a! S% F' i( H9 i. ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( m+ Y# k. b# E% D' [! }
1 u w- ~3 L5 p, J6 w( D8 w4 |. B( @
/* Program the source and dest addresses for master DMA channel */
4 K( V3 \9 @+ }/ Z9 n1 s2 f: l
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
: k9 @: u, w, u* }; ?2 g
paramSet.destAddr = (uint32_t)(ping_buffer);
. i1 K* Q; x2 |" j( ^7 O! z0 x7 X8 ^
4 J6 c3 K0 r4 v. T) C8 o+ V" D# S) ~
/* Write to the master DMA channel first. */
: ~& _' A1 N" |* f3 l. M$ b5 F- h
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% G5 N( S3 v# L8 g) T# g
}
" `* m& S* p" u2 f6 `
$ z1 [* B- |" ]9 s
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 F6 D/ l% C2 ^1 g- T
; N* j) k2 N% u [7 ]3 P m
if(result == EDMA3_DRV_SOK)
" t/ a! H2 T. Z. H; d* L
{
- S l$ \3 n+ X/ R, @$ a4 y
print2arm("edma3 driver init success.",0);
( K+ s& f7 d# ]( h* e/ f
}
6 Q4 k$ y9 Y o6 C+ P# H
}
! v$ J$ H6 x! l3 F7 D2 t
1 B5 a; b" ~' C& n; T, g1 t
' ~' ]! w7 \; C, g: }+ D' v! l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# q$ b2 g: N4 p) N+ |- x
5 Z" I) T, ~6 Q# p+ g; {) w
6 q9 K& g7 ]$ [+ |$ Y
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ U3 e4 R; i y3 }3 Y% X
每次DMA传输完成后都要再次使能传输
Q% w$ `. @9 g" b6 }; I+ z
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4