嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
* N' O5 j. p$ N#define  PING_PONG_ACNT          1
' u- t& A$ l$ n1 y4 b' {1 Z#define  PING_PONG_BCNT          8*32*40
) _0 ~$ n  k6 m7 g" u8 }+ `: N//#define  PING_PONG_BCNT       1
4 l! N' ~. c" j8 ~; x8 u#define  PING_PONG_CCNT          1
1 f; `% J% V+ q% B8 c* ~; T7 S: g#define  MCASP_BASEADDR          0x01D00000
! u  g) g1 K" L" Y; L#define  Mcasp_RXEVENTQUE        (0u); f& p, D8 Z5 L& O( H8 ]

4 U7 x+ r6 d* x$ s6 P9 Q* g  P8 h/* OPT Field specific defines */
! n- \& ]$ |, F5 o- v7 L#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( J. O/ d& M$ {) v+ _2 L#define OPT_TCC_MASK                        (0x0003F000u)
4 p) }1 J7 C* u- q) L5 v: l0 j#define OPT_TCC_SHIFT                       (0x0000000Cu)7 z3 d1 l4 j! \
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)- e/ o. o+ _. f( g- k$ g
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
2 p( q" X3 X0 y9 ^" I
& x2 b, ^3 t, }4 s, Ochar ping_buffer[PING_PONG_BCNT];
# }, u0 [4 Q+ @  b' L- Jchar pong_buffer[PING_PONG_BCNT];7 Y( `& d. K: O8 g- W

% ?( Y) D$ A8 g9 n9 u. j! [+ U$ v
5 q7 n! o. F: s; S( k: }: c/ w( K( f

: x( b9 G+ f) [9 E+ dstatic void ys_edma3_init()
1 e  |  ?4 ]/ Y5 t+ [# _/ V{$ l) W/ J( L5 ~9 }$ z+ b- u. _
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& I8 H- l1 K3 L) E8 o: g  W8 r        EDMA3_DRV_Result result = EDMA3_DRV_SOK;2 w; j3 d' c% P1 _* }$ L( B
        EDMA3_DRV_Handle hEdma;: h4 b% L2 t2 Z3 \. ^5 N) w& A2 {" \
    uint32_t chId   = 0;2 y( {, ^  r. x! J2 g
    uint32_t tcc    = 0;
( b. T% R! H1 g% |9 G* V
2 n9 E3 o  x8 }: T% p( g    print2arm("edma3 driver init...",0);
( T, b% b5 l. z& G9 ~2 x& Q5 [. H1 Z3 j! c4 L' @/ |0 o
        hEdma = edma3init(0,&result);
2 Z$ t* N  l- }! b0 e+ r        if(hEdma)
; ~( S% u. O$ }4 S0 q1 b4 `        {9 u4 a8 e$ I( N7 A( O6 {
                print2arm("edma3init() Passed.",0);
. i, f5 f( S2 s3 O! M        }4 N& w8 U# w+ Y: U# A. R( M! C; E& D
        else6 N. D/ H0 y- ]! y' i  T
        {
8 }1 F* ~  G/ W3 P# h                print2arm("edma3init() Failed.",0);0 }/ I/ h1 P5 m4 I' x# }
        }1 |+ I1 @5 }9 K. h3 D
        ; {, {( F4 H" U- w; f
        if (result == EDMA3_DRV_SOK)3 W* \7 H) L* F: Z
    {
5 M. m5 j% s& e9 Q' o                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! i8 T- T) m4 `# Y" G' ?
                                                       (EDMA3_RM_EventQueue)0,
$ M# h- j! d" v+ d                                                            &edma3_isr, NULL);
! `3 N9 q8 h* k$ r, \2 Z/ x! T    }3 m0 l* K9 f4 ], d, r
       
3 U. d" d" Q: H5 ~; s" y        if(result == EDMA3_DRV_SOK)2 i  V. R1 D7 a( J, ?. _
        {
2 n6 G! d& s# @7 A+ }  J                paramSet.srcBIdx    = 0;
' M- K. f; Z9 z9 R! ~2 d                paramSet.destBIdx   = 1;( d$ |7 T6 P" \4 M+ z/ \! [( Y
                paramSet.srcCIdx    = 0;
( |; l; S$ q2 _! N                paramSet.destCIdx   = 0;
1 r2 O% T5 k% M# T2 G+ W. U+ I% E, X                paramSet.aCnt       = PING_PONG_ACNT;
1 T  |- {+ I7 M                paramSet.bCnt       = PING_PONG_BCNT;* U& b9 H) ^( ^$ G' D! `
                paramSet.cCnt       = PING_PONG_CCNT;; f$ G& S4 k; A
               
. T+ s1 u! [& {/ N% T                /* For AB-synchronized transfers, BCNTRLD is not used. */. ~, V- ^8 h$ \" ]  @. w# j$ Z
                paramSet.bCntReload = PING_PONG_BCNT;* K; ~) Z. P! U, J" ]) b
8 a( N+ @% O0 M" _
                /* Src in constant mode Dest in INCR modes */( ]& O- r3 n0 K# S& f
                paramSet.opt &= 0xFFFFFFFDu;; N8 g7 |2 P9 @5 f0 p* o
                //paramSet.opt &= 0xFFFFFFFCu;* |5 f0 r" r$ x. B* |& i* Z! Q
                ' e% i  ^1 m- s0 o  V6 F; J
                /* Program the TCC */
9 e: d( c8 I: b9 g4 q                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 e* i* x- D; J
) F6 \' G3 b1 ^4 @, h4 o& Z                /* Enable Intermediate & Final transfer completion interrupt */1 x) @) g5 N8 c) M% g2 p
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);  p. S9 L4 \1 g% e4 v
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) s1 A! l3 r; k. H0 e8 E
* L) c) y3 i; D: O  f' k
                /* AB Sync Transfer Mode */5 I' G; _% y2 g* y$ x1 W
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# k# a+ B' u+ c$ S; L0 Y6 J; E               
% |% a1 k0 ?# n* {                /* Program the source and dest addresses for master DMA channel */
; Z; Y/ ^! H6 R' y1 H                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
( c" n$ e9 S9 \" x( k) @' ?: F2 {                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 I8 T; u( O0 u* k8 N( A8 h$ r+ b8 J; h3 K1 n* L8 x
                /* Write to the master DMA channel first. */, }" B0 H$ T7 i& D/ y3 }
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" {4 u' a* y! O6 d1 r
    }       9 d# T2 r8 Y2 }

( L4 g) R8 k, l: }* g        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& |. P* H2 s" j$ ?( E! n        / Y3 ?$ E$ z  E8 }7 P. v$ T0 ]" W. _
    if(result == EDMA3_DRV_SOK)
, j. v4 h4 W  e, T: ?    {8 S4 J( ?2 ~5 L+ |5 i) N
            print2arm("edma3 driver init success.",0);- f+ [" D  B" i8 O7 k/ T
    } # P3 S/ t3 [- i  N. k6 r
}& X& d9 x# L# f* D2 Q# u

: i2 J. F+ S6 \/ t( l3 q; V
5 V+ Q( b: h$ x# y! W2 u" A, m2 ~' vEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 U/ O) w, V0 N' A3 [; L7 h; k4 ]8 `/ Q% E; y( d. D
* S. s: Y3 r1 A% t* Y1 q

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 l6 b5 C' K, q7 V1 E0 H. }& Y# _
每次DMA传输完成后都要再次使能传输

# S, h  O, S  b8 [5 Q原来是这样,我明天去试试,谢谢了!




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