嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' D1 _' r" O; Q
#define PING_PONG_ACNT 1
5 G4 M. a( v: ^/ \2 y
#define PING_PONG_BCNT 8*32*40
6 u( @" B9 S4 ]' ]
//#define PING_PONG_BCNT 1
4 Y: M9 p' d8 z. ^: J
#define PING_PONG_CCNT 1
/ c: ^0 Y3 _0 k/ e5 d
#define MCASP_BASEADDR 0x01D00000
; i* G9 H7 F/ ]" x; @5 \# C
#define Mcasp_RXEVENTQUE (0u)
$ n8 o+ A% x% F' }8 F" Y
+ U. I* D0 g9 ]: c) c
/* OPT Field specific defines */
7 l: \/ ?0 |) r( n* u
#define OPT_SYNCDIM_SHIFT (0x00000002u)
% u5 U3 |3 _! i) U6 g
#define OPT_TCC_MASK (0x0003F000u)
: L- p0 P2 i1 m1 S7 @
#define OPT_TCC_SHIFT (0x0000000Cu)
! z) W: I" k" |3 L3 {2 a
#define OPT_ITCINTEN_SHIFT (0x00000015u)
* t+ P ~, t9 m8 [" j, k4 `
#define OPT_TCINTEN_SHIFT (0x00000014u)
; F3 {2 e" w$ ~. W( m
$ Q1 m) r8 z1 b$ v$ V6 E6 x7 g, e b
char ping_buffer[PING_PONG_BCNT];
% K" T* G1 m# b$ p
char pong_buffer[PING_PONG_BCNT];
8 z+ o- c" @+ Q$ f8 X! r, Z7 R2 C1 g
8 F$ a6 c- g! K; M! v/ s9 C
. m1 V G6 L+ N! W! }3 b
& N- a5 p; z+ L+ c1 l7 @
+ X5 \2 C: K0 U2 c
static void ys_edma3_init()
8 g- A$ U( f0 @3 M1 ?! d
{
/ g1 m5 g+ u: M# C2 e. n# f
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 b* r# m- ^1 u# R) |
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; e: G& J) W& m, a! P
EDMA3_DRV_Handle hEdma;
" m; f$ {8 b) I$ q2 x) S
uint32_t chId = 0;
9 @7 w' H7 \7 G5 O- T7 ~3 \
uint32_t tcc = 0;
" O. b% i! g; F+ t5 r
0 W, m( T) L" T
print2arm("edma3 driver init...",0);
0 i) k* M) L) x8 B$ y: c8 `3 L; R* y/ P3 y
: @" k( T( u# I. @; V
hEdma = edma3init(0,&result);
( r; S) \- M# e A! i2 {
if(hEdma)
: X6 N& e' Q( o
{
: R6 j s. v* F
print2arm("edma3init() Passed.",0);
0 F9 C$ Q/ K& E4 `4 ]7 k. Q
}
0 @0 O/ K; h. Y' L/ b
else
/ O/ K: j& B: }- ]4 z I
{
" N1 V1 b; T$ Q: r
print2arm("edma3init() Failed.",0);
% I3 k# \( \2 O% e1 e
}
* y1 @5 f( ]. Y" g0 x" i1 D) B* r
* d" \6 l0 ]: Q+ o' u9 Q
if (result == EDMA3_DRV_SOK)
, n2 D4 W- j s# p7 ^' o, Y& V
{
- d8 E7 m$ o" K& w
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
e1 ?' `0 n, ~/ \* m
(EDMA3_RM_EventQueue)0,
/ I% ?$ D8 j4 ?( I4 X5 D
&edma3_isr, NULL);
8 |# T1 Z6 X6 \
}
2 `2 x! y0 s# i7 ?3 Y' b3 T
6 y; g7 \/ F- D% B- j
if(result == EDMA3_DRV_SOK)
" l2 b3 S+ c1 o" b% b
{
' N' Y% T, r# z: R' z8 i6 n" Q
paramSet.srcBIdx = 0;
) G# N3 X, ]5 e
paramSet.destBIdx = 1;
1 b( Q& V) w" w; x0 h2 Z1 X3 M
paramSet.srcCIdx = 0;
4 @: r) G" i6 v: |. Z+ O
paramSet.destCIdx = 0;
( d) i D( `+ i9 c0 }6 U7 O
paramSet.aCnt = PING_PONG_ACNT;
8 j( B* q! _) P
paramSet.bCnt = PING_PONG_BCNT;
% L1 R* ^' P4 H6 |) ^0 y
paramSet.cCnt = PING_PONG_CCNT;
. t8 V) ]. b. B; e \
1 ^' |7 C2 N. b6 c9 j
/* For AB-synchronized transfers, BCNTRLD is not used. */
2 R( w2 `: e6 M( Q8 H. q
paramSet.bCntReload = PING_PONG_BCNT;
4 W, m. k. [0 T: U* V9 x( u8 o! M
0 }; j" v# P v' ^
/* Src in constant mode Dest in INCR modes */
2 p, c3 g* `: `
paramSet.opt &= 0xFFFFFFFDu;
; f# m/ K4 J% H: c4 {- M9 a
//paramSet.opt &= 0xFFFFFFFCu;
% W1 m5 D5 \& ?5 w2 K* X) O
( Q6 h" ~! Y" R+ ]- h: S
/* Program the TCC */
. w/ S3 R' s {$ l5 U* s
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, K' D. f$ i, J+ U& k; o
5 B, m" K7 [ [
/* Enable Intermediate & Final transfer completion interrupt */
4 S8 ?* X9 r& _5 L8 `5 x
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
1 [. A4 u' c9 W# P1 s! q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' X* F# `7 }+ x" C2 Z
8 }. i6 _! t2 J6 V8 j8 N0 S" m
/* AB Sync Transfer Mode */
Y+ I% U+ e" q; j( E0 b
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 N% \5 \ V$ y% d4 {" Y
+ {, G5 [" c) F8 \- Y, A! ^
/* Program the source and dest addresses for master DMA channel */
7 p9 ]# H8 r9 E4 R
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
, [8 K7 R8 u3 N8 R8 { o( P
paramSet.destAddr = (uint32_t)(ping_buffer);
( S. @+ I; C1 X8 @4 R- S% h
; t) ]* O8 ^6 W
/* Write to the master DMA channel first. */
; b6 R( k7 p2 m% _
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
7 X6 _2 ^, Q: H* f5 F, |
}
3 A) E& X* t$ V0 u+ [! o; Q
4 E2 z( W# d* o, j7 ]( k
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 c2 F7 C8 Y% i5 g8 s
a; `' C2 Z, V! `
if(result == EDMA3_DRV_SOK)
; ?' m1 L, M' |2 v
{
; b/ m& q ~1 S% p
print2arm("edma3 driver init success.",0);
, {7 M% J( D* ~' ]
}
V* c0 ^% ~5 d7 `' x9 @
}
& c W! u/ V. i& V6 g
$ v; D1 Q' y$ G- b
6 _7 H, p# g3 u9 u' Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% R5 O4 N$ k$ t6 _ J; u
4 l. G9 P& F, D8 |- ~- w9 T
) x, c( k. u( M7 h
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 `6 B/ ]5 D& U) H6 h% {% v
每次DMA传输完成后都要再次使能传输
q, e- _$ O& o& v+ v
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4