嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* C; v( o) }7 t3 K+ s. h
#define PING_PONG_ACNT 1
; K, K$ a1 `' A8 K2 ^
#define PING_PONG_BCNT 8*32*40
+ ?- G, G- w, k
//#define PING_PONG_BCNT 1
, F j3 J2 X% w+ C2 Y
#define PING_PONG_CCNT 1
1 N# T8 G! }8 w8 w2 ~( J8 h' b7 w
#define MCASP_BASEADDR 0x01D00000
8 ? s7 J a; U! ?! }% S8 W
#define Mcasp_RXEVENTQUE (0u)
. r+ s% H' C8 |# \8 k2 {+ O/ D
2 ^) @6 V) b2 `$ v5 f
/* OPT Field specific defines */
1 }7 @: Z8 ]% u
#define OPT_SYNCDIM_SHIFT (0x00000002u)
( Z6 h( F- G6 {6 J1 k" `/ I6 n
#define OPT_TCC_MASK (0x0003F000u)
7 Z- o' p' a5 Y/ B/ h$ `" ~) I& V
#define OPT_TCC_SHIFT (0x0000000Cu)
( a, z9 @5 N( Q( R! W
#define OPT_ITCINTEN_SHIFT (0x00000015u)
2 R6 x- Q% d+ G% L R
#define OPT_TCINTEN_SHIFT (0x00000014u)
, B C) _6 b8 v
; g3 n4 X7 ^4 W
char ping_buffer[PING_PONG_BCNT];
& n, q1 y L9 ^
char pong_buffer[PING_PONG_BCNT];
/ M# R7 S. u/ P z
5 p* r3 Q3 V5 b3 ?4 K
6 _* W- Q& b* {2 W
7 B7 u# @, y9 |4 L, O( d% y+ ?
: B4 C6 T5 |: S
static void ys_edma3_init()
5 y( z7 i5 y1 u! M% x: v* q
{
6 S, ~# r4 N& `9 j& f0 z! s. u
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 S$ D5 t3 T9 O/ ]) @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 A; t% ~4 ~- v$ u; }& k8 s
EDMA3_DRV_Handle hEdma;
! M; a6 R) b3 o$ k
uint32_t chId = 0;
# t% P- Z3 H. X+ D6 y9 w
uint32_t tcc = 0;
6 t7 B% ?0 M3 o& K! U, w# b* {' d
( o5 }3 A3 A/ Y* B# _/ ?6 R) W
print2arm("edma3 driver init...",0);
& M' x0 V' Y1 C- l: h' B
+ Z; B; R2 U9 d. l7 J* \0 q
hEdma = edma3init(0,&result);
( P* Y; o2 `& O
if(hEdma)
) m0 M( y/ z1 X, q8 l- ]! Y3 b6 s' F
{
/ N8 E0 `7 L) C3 f$ J5 v4 N
print2arm("edma3init() Passed.",0);
4 r# f0 w& o4 V1 J, C% v: [
}
4 T! D9 P+ W7 A9 T2 V* D* B6 v+ j
else
( n0 f( n L4 H8 ?* e e" o
{
# i! B* E! Z. D1 m ?, E; N
print2arm("edma3init() Failed.",0);
! [( G) |4 |$ |6 m
}
& V) L( {: C! ]
* _7 \3 k3 f8 }8 t/ X
if (result == EDMA3_DRV_SOK)
# Y* z. |7 d+ N9 x$ }4 e
{
0 p! x% E# G4 |& K- R4 y" `! r
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 r* [) {$ Y4 q! y3 o
(EDMA3_RM_EventQueue)0,
2 C" R5 b# K1 |/ D- ]- v( r3 A
&edma3_isr, NULL);
5 ?! T/ q* }; O" g+ N
}
- D/ I& Q' a: f# P
' \4 i$ `! ]+ d- {! a5 H6 G" Q) m1 [
if(result == EDMA3_DRV_SOK)
" O0 x! |) r, R
{
v& I$ M" Z2 q( L
paramSet.srcBIdx = 0;
% m& A, V% X8 c
paramSet.destBIdx = 1;
J) w# B5 { }' w4 s& ~
paramSet.srcCIdx = 0;
/ Q* u/ d7 K, L9 _
paramSet.destCIdx = 0;
0 z3 y) F) c8 l8 E' N0 Z6 Y
paramSet.aCnt = PING_PONG_ACNT;
5 c/ ^6 X' Z: n- o
paramSet.bCnt = PING_PONG_BCNT;
& x# H; w5 N G9 @ L
paramSet.cCnt = PING_PONG_CCNT;
. q2 X- }, B7 p, I3 B
; f" V! {$ Z2 ?+ o/ K3 F
/* For AB-synchronized transfers, BCNTRLD is not used. */
' U+ ^+ Y/ K6 A; K" r6 \" F
paramSet.bCntReload = PING_PONG_BCNT;
* P: @( i, I5 A1 G' K% f
& H D/ B* s! ]3 X
/* Src in constant mode Dest in INCR modes */
/ w+ K3 r" H" j& d3 z- r2 D7 E
paramSet.opt &= 0xFFFFFFFDu;
9 J$ ^; C$ U" w/ ^0 |1 n; _8 w
//paramSet.opt &= 0xFFFFFFFCu;
1 M1 B9 S+ q5 I+ c( ?$ \
. o9 k" f1 @0 L! l
/* Program the TCC */
1 `% I& y. r$ [* K7 I
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! C" z f) E; M0 D* J
1 c* U, w9 D4 Z
/* Enable Intermediate & Final transfer completion interrupt */
( v( U5 x, A/ R# @* x) Z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! Z' j7 y: m1 d2 {, u9 e
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
u' p$ \1 w! {* k! U
! g/ Q/ y( d% J) v
/* AB Sync Transfer Mode */
" w2 p# y0 x* x& ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ @/ }) g" o' n! {) E$ C
2 D' F* F$ {9 D q7 q. n
/* Program the source and dest addresses for master DMA channel */
" F, ^: _, P/ g8 L' Y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 ?& M* L$ l$ O8 Z5 S
paramSet.destAddr = (uint32_t)(ping_buffer);
4 d# ^# b! t/ b. i$ Z0 T* @
1 e$ N: w8 p$ ^' }
/* Write to the master DMA channel first. */
9 w- q( @$ X- \& ^" F
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 g( P% D9 [6 C2 g
}
) G2 l0 j3 L( L7 J! @" v$ D1 [
- N' @2 E/ i& t p
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 }$ o; K8 W+ a
: ?3 e9 L; ]* C3 a* R0 b! d
if(result == EDMA3_DRV_SOK)
$ m' t1 y/ X& m t) {0 g* v
{
6 j6 W# O: u+ z% r% J. b5 f; R
print2arm("edma3 driver init success.",0);
* Y# u: x7 C- R" [" ^5 f8 }
}
9 n3 Y7 E: A2 T0 ~7 m
}
# y8 M9 i' J0 ~( W/ N; T9 F7 ~
7 U; J3 Z9 R% W# J) o8 V
( A/ ]6 m! O4 {0 T d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 {7 q% i& K2 s6 A1 D
- ^% h0 d4 ?, ?* v2 B' b
% t: v# ^. Q$ S: K
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. }( b/ A( X# E' A; s8 K
每次DMA传输完成后都要再次使能传输
8 @5 I, ~7 c' n( r. }
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4