嵌入式开发者社区

标题: edma3中断只能进去一次 [打印本页]

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" t" ?) g+ _, n#define  PING_PONG_ACNT          1
+ a8 z8 E, E4 x#define  PING_PONG_BCNT          8*32*40 / m2 V0 a+ o: k  h
//#define  PING_PONG_BCNT       1 ) {6 {# w% P5 y, w
#define  PING_PONG_CCNT          1
1 N3 C' a8 [4 m- H- J. ?, Q4 ]#define  MCASP_BASEADDR          0x01D00000
) j3 h8 m. p& o  z" f#define  Mcasp_RXEVENTQUE        (0u)
6 L# d' E, R  ]3 X0 |- E$ t" e
& P) S, D5 o) L/* OPT Field specific defines */8 H; L: Q& A7 n) i7 c) S6 O- ?! m
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)- }- V1 `7 U$ p
#define OPT_TCC_MASK                        (0x0003F000u)
7 b; t- P9 X3 Q$ ]1 S" D#define OPT_TCC_SHIFT                       (0x0000000Cu)0 v+ z7 d7 z7 R) D" C, Y. i' w
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# M% m' g/ j5 V0 Q/ `! x3 A#define OPT_TCINTEN_SHIFT                   (0x00000014u)
% {) u9 {" P5 `$ U* ~7 M9 J: g9 @7 R* |( R2 w4 b0 ?
char ping_buffer[PING_PONG_BCNT];9 [1 T% z5 ]4 `1 i* y
char pong_buffer[PING_PONG_BCNT];
! P* x( ~% R! g* s, R0 l% i5 P0 s4 G+ r$ p) t9 }

) K) v; {0 A* L, X& j
  c7 R+ ^; N: _  i( {% Y. k9 T( t1 e) b/ O) k, R+ V# X
static void ys_edma3_init()' O6 h: D! o$ k$ X
{: ~. P- N! q1 b  u/ S& j, A/ t; A" V
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 x; _2 }/ u  s
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;' J& i' Z, Z, K' N
        EDMA3_DRV_Handle hEdma;& m3 T3 D! s" W  x! j( n. |1 s
    uint32_t chId   = 0;
% u! l7 @1 `+ A- ~5 f) V9 _    uint32_t tcc    = 0;4 J9 `9 u" ]$ \( O+ x- x; T) ~  _

, _& {5 B! H: ~! T. v    print2arm("edma3 driver init...",0);2 x2 g4 r7 O( \: G

6 ~9 X1 C- a; e% m% m8 l% m  J        hEdma = edma3init(0,&result);
2 `# y9 _0 }+ B% F! H, c        if(hEdma)
! ~2 ?. b7 u- \) e, [6 J6 m        {* g) F' L& X0 V# F; ?1 w
                print2arm("edma3init() Passed.",0);
! O* y/ E" ?6 J        }
5 ?8 A( F  P  Q5 I        else
/ P+ D4 f2 \5 f% J' F        {
: ~" j% o& C4 P$ c                print2arm("edma3init() Failed.",0);
4 p5 D: R3 Z  W        }
7 u$ n3 I0 R: d# g       
5 [: a0 t. n% J) F, i; }* P1 i        if (result == EDMA3_DRV_SOK)' {% w1 q- D* a  S5 D
    {+ q+ m' R+ d; b  l% ]
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. W2 r: Q( _" @) a( D3 T  r1 Z
                                                       (EDMA3_RM_EventQueue)0,4 C" p5 J  t+ P  ~2 A- h: y
                                                            &edma3_isr, NULL);
% {5 q6 B. \$ f7 j2 H$ K6 g    }
4 n( c! Q+ m9 n6 }. L5 h4 w+ m       
% p7 E0 S* [1 n4 [0 d+ l        if(result == EDMA3_DRV_SOK)
3 N/ ^. b% |0 L' N5 X) `  m        {
) G! s: R* N) V                paramSet.srcBIdx    = 0;
9 g  \" c+ K, E' F9 p                paramSet.destBIdx   = 1;
6 x) l* E4 W) C, N! I                paramSet.srcCIdx    = 0;
  i/ X4 H1 i" Y5 L3 T                paramSet.destCIdx   = 0;3 d& ?5 s+ N* @5 O
                paramSet.aCnt       = PING_PONG_ACNT;
" b% n; Y) C$ d( i; p/ }5 l! Y7 J                paramSet.bCnt       = PING_PONG_BCNT;7 d* \1 _8 i. Y8 |* U
                paramSet.cCnt       = PING_PONG_CCNT;( X5 y) V1 M8 f, s% G/ v
               
. M' q, H/ m# H" b% W                /* For AB-synchronized transfers, BCNTRLD is not used. */7 g/ b$ T. s) A0 T3 }# R% a; w2 P- v9 h" }
                paramSet.bCntReload = PING_PONG_BCNT;2 y. {8 R1 ~; w- J) l* d- |) }

3 @6 U% E. J8 j2 O# X2 r                /* Src in constant mode Dest in INCR modes */
7 J, }/ T  |! x+ O' V                paramSet.opt &= 0xFFFFFFFDu;, S* `  b; ]# M3 B
                //paramSet.opt &= 0xFFFFFFFCu;( h5 q& U' V0 ~7 b2 `2 o8 x
               
+ u  d4 [, d0 I8 S                /* Program the TCC */6 T7 c% y+ X+ a7 p0 c
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 d1 r$ X5 o  ?
4 X) ^7 e! G( y5 \" H* V                /* Enable Intermediate & Final transfer completion interrupt */) d) |0 M& x! _( R/ D5 g, E- O4 Z) Q
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: D/ z9 q! u8 e3 }. q, z                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; O0 G/ A' x# q9 \! n! X2 q  `, T0 {( G, [% ^, I' Y
                /* AB Sync Transfer Mode */3 P$ s* ]; J$ z
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& a0 ?) C4 g$ W- `3 J
                5 r" c7 ]1 g/ V$ I
                /* Program the source and dest addresses for master DMA channel */0 Q/ {1 ^% [+ S5 Z
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
( {# v# C* [& C1 m  M, n7 F                paramSet.destAddr   = (uint32_t)(ping_buffer);1 B, ~2 z) m" l$ Z) W/ V
$ k8 U0 ?$ ?) G5 r& z
                /* Write to the master DMA channel first. */+ a0 Q" M1 d. e; l6 X; P
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- G7 E: ^8 W. f8 p- `$ d* j
    }      
! I. d, |' f% g( {* |, ^% S% L; }! ~# n
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: t  w: X9 u% `/ r6 `& b( `        % c! l1 l2 p* {- p5 E2 p
    if(result == EDMA3_DRV_SOK)   R8 K5 `* |& G# }
    {' h0 ]5 l! E$ b7 c
            print2arm("edma3 driver init success.",0);0 f. [9 {" T6 c1 C* m7 b) F: U0 _
    } ( N  e& y4 k! _# }& ?1 M4 ?9 K% _
}
7 n7 C7 `& ]1 z/ m3 F$ @7 k
) B) _- Q) M9 x2 F- [1 t( [
) ^) T. b8 \% {' ]* s7 n- `EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 h# e1 r# |8 S0 l$ {! x
+ h5 V% j: Z% w" d2 G. V) H+ C1 ]( X$ j8 n8 d0 H

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47" E% A5 ?/ v+ k0 H/ g& W- y5 J
每次DMA传输完成后都要再次使能传输

: F0 l* Q5 l8 w原来是这样,我明天去试试,谢谢了!




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4