嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ ^8 o# v4 d7 G8 H
#define PING_PONG_ACNT 1
: J: ~5 ^# I2 ?
#define PING_PONG_BCNT 8*32*40
) I' Z0 ^ }8 S% G' t1 Q
//#define PING_PONG_BCNT 1
3 R% k* h h% [3 F
#define PING_PONG_CCNT 1
3 u4 V/ S$ g7 o1 O# i# f
#define MCASP_BASEADDR 0x01D00000
+ h. ]7 H8 ?* G" i1 i4 y
#define Mcasp_RXEVENTQUE (0u)
* C* r" c# S4 a
% R* V; a! c% b# q" v
/* OPT Field specific defines */
% k) }) M+ Q1 k2 i9 P
#define OPT_SYNCDIM_SHIFT (0x00000002u)
+ N0 B- i+ M, M% |* f" n
#define OPT_TCC_MASK (0x0003F000u)
5 d% \- ]! d6 J$ G
#define OPT_TCC_SHIFT (0x0000000Cu)
5 |1 t4 e( {0 D+ V3 b. i. z9 \
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 w) `- r* v4 B/ H* F
#define OPT_TCINTEN_SHIFT (0x00000014u)
, q3 R0 j2 [7 U8 @1 q' R8 ~2 z+ w6 p6 X- |
8 u0 Z, J* e8 B$ Z
char ping_buffer[PING_PONG_BCNT];
" E2 g1 ~' a1 H, x r3 O. A" A
char pong_buffer[PING_PONG_BCNT];
+ R i- E" n; ?, i$ ]$ i/ G
; y( H# O! W6 i( A5 H a; K
, C' w& y( i. h/ W* I& X- W; G
" z3 r0 |- B. t& b
) h6 N: c0 r" W W
static void ys_edma3_init()
5 ~) S% b; j, X* \9 Q1 t. K: o+ N
{
& ^' g q; g. j/ [0 l
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 R" u4 g6 P/ f: `* P
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 l O, L- r6 j; N4 H& a: z
EDMA3_DRV_Handle hEdma;
3 F% ~+ A1 N+ b
uint32_t chId = 0;
7 ?" x2 ?$ |* x
uint32_t tcc = 0;
; }+ e' `' M" o: ^, {. A$ p
6 E- k. f" o$ ]4 U
print2arm("edma3 driver init...",0);
. p& H1 w4 b( `
3 H0 g t4 v. J! h
hEdma = edma3init(0,&result);
6 W- J* H" r3 h0 ^5 E
if(hEdma)
. ^% Y! K( l. \6 J
{
` W" C8 i/ |
print2arm("edma3init() Passed.",0);
( q5 k m" G" e, F( f6 b
}
0 o; P& k+ X, C0 I3 ~
else
: b$ F5 [" x- l7 V; E. ?3 p
{
8 w! U/ B1 h* F: D' t8 A
print2arm("edma3init() Failed.",0);
" e4 C0 U6 ?& ^. E; D
}
: o5 [! _8 s! C( x: V/ f
1 X* n( K2 c5 ?" {- |
if (result == EDMA3_DRV_SOK)
; s( M$ l. u- I L- `' c2 ^7 G/ b
{
3 `: v7 R! c4 B
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 I, o0 C0 F# ~& E
(EDMA3_RM_EventQueue)0,
' }( h9 ^- ^; d8 N& s2 y5 @
&edma3_isr, NULL);
" j Y( }, |# z5 S9 p1 w
}
3 h f3 Q |4 f/ {
" W a; d0 D3 L3 x; x
if(result == EDMA3_DRV_SOK)
. l- Q2 f5 k* T% o4 ^3 v
{
) _, t0 p8 ]8 X4 ^. n5 i4 u* j
paramSet.srcBIdx = 0;
' H' _7 Q N3 v* U
paramSet.destBIdx = 1;
0 `0 a7 H$ i0 \' U
paramSet.srcCIdx = 0;
: L$ u8 ]* k/ Q" G8 F2 f' C
paramSet.destCIdx = 0;
' O. e) G& b8 L4 W/ R& q
paramSet.aCnt = PING_PONG_ACNT;
: }3 N1 T7 d& b( R
paramSet.bCnt = PING_PONG_BCNT;
, {9 j- X* d* n$ K
paramSet.cCnt = PING_PONG_CCNT;
$ W# d& r3 D" k) h0 G, H, o1 A) ~
! G2 c) [' J/ J
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ \8 J+ }; B( f, l- \
paramSet.bCntReload = PING_PONG_BCNT;
c- c( e1 `5 O* |8 t
6 _: c' u' j; C( m S) S
/* Src in constant mode Dest in INCR modes */
9 ^* w0 y8 o p
paramSet.opt &= 0xFFFFFFFDu;
& e4 F( S! D1 T" r5 r, \1 y
//paramSet.opt &= 0xFFFFFFFCu;
/ p# U* R: R: p; ^" u
+ p: W$ A {+ t+ C# s. e6 e/ N) K+ e L
/* Program the TCC */
) X) q' _3 w( \8 i2 Y/ U8 v
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 B4 D% B t9 a. i; p U
# B- |5 {0 B, r/ O) D
/* Enable Intermediate & Final transfer completion interrupt */
6 w7 ]* W7 U+ a6 U' u) h/ U" u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 W0 F7 b' e8 X
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 C7 Z" m1 b& W1 e) E
2 o+ W0 ^3 U$ G, t' z9 m0 d0 z) `- t
/* AB Sync Transfer Mode */
3 b" i* j2 u* {, f8 U
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" G% A7 Y+ y9 T1 f" y
, u9 x" Z5 m0 w
/* Program the source and dest addresses for master DMA channel */
' m/ k9 b- d% ?) P9 p5 D
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 \! e( m* m1 Y4 F( R
paramSet.destAddr = (uint32_t)(ping_buffer);
2 R" D. k/ z0 N1 _' {3 ]5 [
! O- O4 P. O6 R9 z
/* Write to the master DMA channel first. */
3 z q3 C* E( q3 H7 g0 O, G6 V
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
; q; ^: W8 I7 Y# G$ v# M8 F
}
& w, M+ a9 p; [
" m3 p ]$ b: B
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! q6 H/ x- V/ V% q' s
0 z. N' ~) @, S
if(result == EDMA3_DRV_SOK)
3 s' A6 e* h. R. W9 U" Q
{
" M u% |* |. ?$ @) A. h: J' z
print2arm("edma3 driver init success.",0);
. c6 `3 n8 z% U0 L+ \7 J Q
}
* H8 b3 J6 [ C, H& ~
}
4 {9 C% g$ _0 d% \3 V$ g
# z+ ^$ l, w0 T; v! W/ u
8 D: Z- s0 n& J# x7 c) U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 e) S, }% X( T
+ j! m0 i$ V2 I
8 {9 s1 Y9 @9 ]$ W2 C/ u+ K
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! Y1 g+ x1 g& o# A6 y+ Y0 ?+ r
每次DMA传输完成后都要再次使能传输
3 \* K; V$ A& { ]* l3 w# ~
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4