嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& j3 Q+ h8 C, E+ r. C
#define PING_PONG_ACNT 1
# ?/ Y3 ? ~( S
#define PING_PONG_BCNT 8*32*40
6 g: m) d% b8 ]5 l) j; `3 w, A% O
//#define PING_PONG_BCNT 1
; m9 j3 F& S8 P& T9 Q% L9 ?
#define PING_PONG_CCNT 1
% z& p0 c( a: f* c" O$ F
#define MCASP_BASEADDR 0x01D00000
2 Y( C- p/ q, i( R, y8 X9 J
#define Mcasp_RXEVENTQUE (0u)
9 d/ j! T- t& _- {/ T
. ~" {2 _5 P4 u; F, s/ A" k
/* OPT Field specific defines */
0 |& X% G7 R8 B( l, B# Q, X
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" K' F6 j# T; M' ?6 o
#define OPT_TCC_MASK (0x0003F000u)
) C3 b$ B+ T# o# N
#define OPT_TCC_SHIFT (0x0000000Cu)
1 B0 A) N. n2 Z9 I/ C' `1 c
#define OPT_ITCINTEN_SHIFT (0x00000015u)
1 S- W" U8 s* v! Z
#define OPT_TCINTEN_SHIFT (0x00000014u)
/ N- ^. c. j0 ~1 w! l
4 ~' }/ C, {/ Y4 `; w. p0 s4 g- M) F
char ping_buffer[PING_PONG_BCNT];
6 e: r% u" { p/ o8 _$ F" H3 D
char pong_buffer[PING_PONG_BCNT];
' V8 {% C* b. G: `4 c. W* L1 n( W
4 I: B6 d! E# X3 s$ J1 V+ H7 L0 R
3 ^' ~0 z; }4 Y u
) H$ x$ M- v) c* {7 M5 E+ a M( @
$ p/ t; Z7 D7 u& Y& J# Q$ O) P
static void ys_edma3_init()
# o9 p$ g$ i% I" U9 U+ w/ s7 [
{
8 U5 t4 ~2 g6 t3 |% K
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& ^; }5 }, J5 ]" T2 E' `
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' c! n* E/ W! M4 [$ s/ k
EDMA3_DRV_Handle hEdma;
( `% m0 M& U& c: U/ R/ i: c x
uint32_t chId = 0;
1 W: _- U0 f- W# Q1 A
uint32_t tcc = 0;
' J( J/ s) S. `( B3 x' K2 g
1 T1 z) C0 r" `" z! @
print2arm("edma3 driver init...",0);
$ i' i8 u9 e. f2 K3 F
% N3 ~+ Y+ c$ L$ @0 x/ _
hEdma = edma3init(0,&result);
: W& @5 W9 g6 ?0 h) f+ b0 P
if(hEdma)
' F: l; x2 \5 s( F. A
{
. F; D K- a1 m
print2arm("edma3init() Passed.",0);
/ t' g$ S% o/ }& N. I1 X7 {# x C6 z
}
& Q5 m U3 Y' n o% w
else
; N# _: K1 f* X6 ]
{
0 f T( f$ k0 [% \
print2arm("edma3init() Failed.",0);
! A" n& W- ^1 @: {0 ^
}
; h7 Y* x( z* l$ L' o
/ n8 y$ T3 {) q( k6 i: t. q
if (result == EDMA3_DRV_SOK)
6 Z2 |, {: l" f# Z' c5 b+ z
{
5 v- B. m0 ~" {( Q, ?
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! I8 B5 h2 ^ L1 |" Y8 t8 P( ~4 l5 X
(EDMA3_RM_EventQueue)0,
! V5 a; ~2 W- i& W1 i- l* X1 ^1 K
&edma3_isr, NULL);
: X4 t2 O& R$ n) X4 ] J# [2 ?
}
! z: h0 `" w4 U6 F! q# o
. l9 x/ m: w4 L8 E' Y
if(result == EDMA3_DRV_SOK)
1 X; |8 H8 V9 A' c$ c/ V n
{
* H5 P1 L4 W1 Z u% _3 W
paramSet.srcBIdx = 0;
8 l# b/ w3 b$ `6 j. o! N
paramSet.destBIdx = 1;
% M# Z, Y( z% o3 F/ U, l1 }1 u1 ]
paramSet.srcCIdx = 0;
' @" Y" c6 J3 ^+ v( p" O
paramSet.destCIdx = 0;
# d* i- e% u: A) j* i
paramSet.aCnt = PING_PONG_ACNT;
2 m Y0 d% H3 u
paramSet.bCnt = PING_PONG_BCNT;
. X) D' t0 o: N( b* Z. i0 k
paramSet.cCnt = PING_PONG_CCNT;
# r9 K+ u4 z8 F$ z
' |$ y* W6 k1 I8 ^( \. y4 b" `; A
/* For AB-synchronized transfers, BCNTRLD is not used. */
- v' L L5 j8 C, c" i2 H
paramSet.bCntReload = PING_PONG_BCNT;
% j! b E/ ]5 P$ K* o& F* q
; ]7 ]8 V' K* ?# o) [9 f5 ?
/* Src in constant mode Dest in INCR modes */
9 Y( Z& P1 _! L% |" R' s- b3 G
paramSet.opt &= 0xFFFFFFFDu;
) C5 L8 o& `9 r7 N( x
//paramSet.opt &= 0xFFFFFFFCu;
( z4 A( `. P) s R( s
; B6 D6 T) g- c
/* Program the TCC */
, i8 c; j5 {7 {* n
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 E; r% a9 h& Z. ]5 N8 T7 Y5 o& N
0 K5 S3 @( _+ v# _
/* Enable Intermediate & Final transfer completion interrupt */
" J1 A" l# o- ^5 k+ y% v/ L8 \$ l
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
t2 `' c! R }3 {* ]
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! G6 \* q2 }: ~( U2 r+ I: P
: q" B9 J3 L7 B2 ~( i+ z" P
/* AB Sync Transfer Mode */
: O1 S& v- Y8 W1 }
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 |2 a2 l9 S" M1 @
6 `) A5 W1 e1 [# r, W& q
/* Program the source and dest addresses for master DMA channel */
2 T3 O* a' u0 V4 o
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! K, u D5 m# ^5 L7 D2 q
paramSet.destAddr = (uint32_t)(ping_buffer);
5 T# F7 T( F# P/ W7 s
" k: @. C6 Q2 S [& ]
/* Write to the master DMA channel first. */
2 |+ R4 k4 c" w5 Z1 E2 H6 i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
' u0 R {% E& |( a: e. [' C* e
}
2 V6 y" E1 B# |, p7 E4 [; M: P9 f! l
" C3 T' [3 D+ E: N
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- f; m1 H% ?: q4 B4 E1 a5 X
- R& O$ }2 A4 O8 @
if(result == EDMA3_DRV_SOK)
4 f1 J. t0 h5 C8 r
{
& ^0 R( N% ^8 }4 s! H
print2arm("edma3 driver init success.",0);
9 E, s0 Q, X( G x+ }4 n+ \
}
; ~7 ]3 w+ K9 S: I
}
8 m7 V; H2 k1 }; u$ J% a! I
# f; W' p$ E1 r) ^0 {" B3 U% Q1 R
& ]* \0 S. ]8 h3 b/ a8 v) t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 y, a$ I3 o3 D4 n, S
: o- Y8 y! }( ~; }( X) ^% [' _
6 ]7 |* {+ p: w$ S
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% P/ D9 x- ^4 s0 L; Y0 I
每次DMA传输完成后都要再次使能传输
$ O: ?; s S) ^+ ]0 Z
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4