嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! n3 P$ F" b3 ?9 m6 M4 ^$ @
#define PING_PONG_ACNT 1
" s$ A( a- U T2 I% \: z8 [
#define PING_PONG_BCNT 8*32*40
0 ]5 J- m* ]5 n9 a, e. V; q) ^
//#define PING_PONG_BCNT 1
' }% G" `0 U! a. e- U
#define PING_PONG_CCNT 1
) S, q1 K8 l7 ^1 j5 i7 M1 @5 p
#define MCASP_BASEADDR 0x01D00000
4 A4 j7 D5 `' |8 p
#define Mcasp_RXEVENTQUE (0u)
) u# y( c9 z" t6 R2 h7 M
8 Y9 B( E6 ^( \- E
/* OPT Field specific defines */
; A% \) J4 U f! p% U9 Y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 i& [6 x& w/ i- E8 e
#define OPT_TCC_MASK (0x0003F000u)
$ \1 I( [0 N- [ U' ?) { }# @
#define OPT_TCC_SHIFT (0x0000000Cu)
8 G4 a( y0 Q0 m* f
#define OPT_ITCINTEN_SHIFT (0x00000015u)
' N6 I3 Y; B4 \
#define OPT_TCINTEN_SHIFT (0x00000014u)
- @" v* O( X4 i) p! f
" t: u4 b3 m) y8 ?7 Z
char ping_buffer[PING_PONG_BCNT];
4 |# j3 C" a) f" y, }
char pong_buffer[PING_PONG_BCNT];
8 P3 W* W6 T1 i8 U
, R# v9 N5 f% \+ d
6 b, G V& J; B% r; R. d
- x8 u4 |3 D# e2 T4 ~2 P2 v) g
0 m$ ~, b$ M, h) q% G# A& {% H% Q) A
static void ys_edma3_init()
; @. g) ~6 I+ l2 A
{
! E& D4 S( `# y0 B( b
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ e; P( K0 e, E' x: J ~5 M
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) ^% Q+ M& g% A5 I& y. A) s
EDMA3_DRV_Handle hEdma;
; I* A5 Y. \, N8 W8 i, j5 k; ]$ p) A
uint32_t chId = 0;
6 v- H6 E F- y& X$ ]* u; t
uint32_t tcc = 0;
* E+ B( U" n2 R/ s Q, d
% v- Y& z5 u/ y; p" T3 i) b* _! W0 q. f" n+ d
print2arm("edma3 driver init...",0);
! a0 Q( P" h9 l' ?5 B8 ]
; s% \9 X& y, v4 n' r, Y7 w; {
hEdma = edma3init(0,&result);
7 O: t/ _# {6 k" v3 m6 s
if(hEdma)
- ^" I" d4 t o# a6 V" c
{
; v* T0 U1 u( H, a
print2arm("edma3init() Passed.",0);
* e) q6 M' c9 P) Z
}
% }& n8 I$ E7 u* o
else
! v6 Q1 x0 [8 O( a) X9 }
{
8 }, u8 b: ]8 T. V: ~( r
print2arm("edma3init() Failed.",0);
( V: C+ v! ^) N! u: l
}
; F% b: v/ Q* q- V
* e5 F0 U+ n4 d9 T6 q. [& f4 R
if (result == EDMA3_DRV_SOK)
, c5 y, s3 I3 P9 D' @% z; V9 X# z
{
" }; p7 `' n* }% o9 e
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 h. H- y% ?4 \7 W, O
(EDMA3_RM_EventQueue)0,
; E+ u: y" a; x
&edma3_isr, NULL);
( T8 ~" a" m) k7 h [9 E( p
}
. {! y) _/ D2 e% }5 J- r: q. W- m
! b Q! C& }4 ?
if(result == EDMA3_DRV_SOK)
. ^% m) }1 I: k& _# [
{
: ~$ [: }$ H+ ?) D& A0 ?
paramSet.srcBIdx = 0;
. }, q6 v! _/ I
paramSet.destBIdx = 1;
- g7 I i. ?7 l
paramSet.srcCIdx = 0;
9 j/ N4 t0 V1 {
paramSet.destCIdx = 0;
: N; m/ A0 O( s$ ~
paramSet.aCnt = PING_PONG_ACNT;
5 Z4 a7 o; T: _8 _6 ` ?' \6 S% t
paramSet.bCnt = PING_PONG_BCNT;
9 b# L& X ?1 r- H: I7 U [( R
paramSet.cCnt = PING_PONG_CCNT;
0 ]4 v& f2 I, j* G
. r4 A/ v$ \" P5 F
/* For AB-synchronized transfers, BCNTRLD is not used. */
. z# `, I7 j. ~5 r' Y9 f
paramSet.bCntReload = PING_PONG_BCNT;
6 o' @6 z. `. U K1 U: S
3 Y ]) N$ l5 ~3 Q
/* Src in constant mode Dest in INCR modes */
9 o: A) T* g9 m$ r
paramSet.opt &= 0xFFFFFFFDu;
6 `& C3 j( l/ w' I( N/ s# ?. B
//paramSet.opt &= 0xFFFFFFFCu;
; w& |) r8 \+ t, K
; J9 V P& x5 T& D
/* Program the TCC */
/ m+ [- A' ~; Z
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* t, G7 g7 z$ |1 V9 v* v
; c: Q6 y: y5 |1 b' U" k; u. k
/* Enable Intermediate & Final transfer completion interrupt */
0 M3 `% v2 e. Z! j! A
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& G8 Z/ k9 r. Q# }
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 Q" z1 B2 D, g- A; z
% L1 n* \" o1 x* k( C3 ^
/* AB Sync Transfer Mode */
8 _2 R! K J/ [/ s; U: P
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
b; @% h1 p ^5 B9 |
8 w% {0 }% I4 c5 o8 P: w
/* Program the source and dest addresses for master DMA channel */
/ c4 G2 F4 \* O3 C1 Q1 K
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
1 c( d7 }5 r. V/ T
paramSet.destAddr = (uint32_t)(ping_buffer);
4 v. M) S1 _& R7 o) N
. ^$ h9 D- y9 h
/* Write to the master DMA channel first. */
; `0 X/ z* N5 ?& ?5 `3 H* C! n+ z3 B
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
- g# B7 Y& a$ |6 y
}
6 Y) \( ]4 f8 i1 N! s/ n. e
! p# t6 y8 P. U5 A! T
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- G" u( a! L0 U1 L, H$ Z* O
- W3 E( r6 \ J" X' `
if(result == EDMA3_DRV_SOK)
4 E7 r% u9 [' K/ ]
{
+ y7 ?0 }1 l5 r9 u6 N# m6 @
print2arm("edma3 driver init success.",0);
+ G1 S! R# v( T2 q7 q y! S, q o
}
* _! p$ j- ?+ c% Q+ `0 y
}
; ?' S9 l1 }0 P
9 u8 g* D( H1 J
4 L8 }% |( c0 c' t7 x) J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 {+ P0 I3 l, D. R+ d0 |
* G! }9 [7 N9 M, P* ~# z
4 d' B3 W# Y8 H5 H
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 a; a! S2 Z k0 {! T
每次DMA传输完成后都要再次使能传输
- B- I4 T! @6 P: S3 m
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4