嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 D. W  [2 [/ y, t9 w, h7 j+ j#define  PING_PONG_ACNT          1
) V3 ~: p, H, C( A0 @$ a0 i#define  PING_PONG_BCNT          8*32*40 1 E6 f/ |" r( H/ `1 o
//#define  PING_PONG_BCNT       1 5 Y, U1 E9 u: @3 e- O1 u) y
#define  PING_PONG_CCNT          1
4 o( W" p/ |1 C) X0 r- D( b2 b" l. s# w#define  MCASP_BASEADDR          0x01D00000$ u+ R2 e* b$ i
#define  Mcasp_RXEVENTQUE        (0u)' \) c( t, f- S; W7 W
& j, B0 K1 n& T' y
/* OPT Field specific defines */9 }. o" i# W- Q, T
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
  k7 a" ]- j- K" O3 d) }4 {" M#define OPT_TCC_MASK                        (0x0003F000u)$ t- o8 L0 B: I* \5 x  t5 }
#define OPT_TCC_SHIFT                       (0x0000000Cu)
8 P. x: R$ Y4 c" o#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
7 E& F8 ^. J% P3 E, b: A6 X#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 ~& d5 c9 R) m" P" q1 g' E; q( A; m2 T" V
char ping_buffer[PING_PONG_BCNT];" r* V% W0 h/ O
char pong_buffer[PING_PONG_BCNT];
* j0 @: u5 ~" ~) q
* @; `' D  M# L
0 {$ w3 a4 D$ O- U, e1 V8 w* E% V
+ ]4 z; [0 z# Z8 |+ `) H2 E' _1 F' F& k( o$ Q
static void ys_edma3_init()
& M. ~. f" x% P" \8 g3 ^, s+ o1 ]{2 r0 U; }4 I9 ^1 N7 i( F
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& _- y/ ?# j# h        EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 ^5 z  N, b. C. {6 j1 x
        EDMA3_DRV_Handle hEdma;$ D$ T* g. u/ V. i. Z1 u% g; b
    uint32_t chId   = 0;3 n; T' \0 L+ F" v( F
    uint32_t tcc    = 0;: m0 B& ?) {$ U( X6 H% Y4 Y. \) m, H

; ~. Q$ w' |1 W    print2arm("edma3 driver init...",0);
' m! u6 W2 N& ^' z0 q( F
( L6 u8 [8 B( X3 Q        hEdma = edma3init(0,&result);
0 Y3 f; ?! g# ?& K        if(hEdma)$ o' E9 X; ]. z8 l1 |9 ^: M* |
        {) y0 C! g- l; K4 R2 i+ b# Z+ [1 K
                print2arm("edma3init() Passed.",0);( E+ i& t. Q' S3 o+ R
        }" l$ H* K' U. v: U& G
        else! F+ j5 v2 j' D% T# W+ t7 [
        {6 m3 T6 z9 V' Z9 R- ~
                print2arm("edma3init() Failed.",0);# N$ M( d5 |9 ^5 L
        }/ z5 h- f3 F; w) Q
       
) k# M8 R6 Y  n1 }' }) q        if (result == EDMA3_DRV_SOK)
. x4 n. Y( s, ]; S, z/ I' X    {
# [* X7 G/ V: @5 Y6 K! J$ T5 W- i                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; q" }9 F- c) R5 J0 |                                                       (EDMA3_RM_EventQueue)0,4 W3 D" Y% O' I4 C8 U* `% L
                                                            &edma3_isr, NULL);
5 H6 @9 V: W, |' K    }
" ]0 X; G3 {% s" C7 `        ! B' s3 V! C3 u4 \6 G9 l
        if(result == EDMA3_DRV_SOK)) C4 _, f( \; ^
        {
" b' Q; M, V3 g4 i! X/ i                paramSet.srcBIdx    = 0;& s3 p4 B. x6 A4 F( j
                paramSet.destBIdx   = 1;2 b# E7 G) R! ?
                paramSet.srcCIdx    = 0;
! a* E+ l" Y  @! X0 {                paramSet.destCIdx   = 0;7 K- Z1 n' ~( k/ K
                paramSet.aCnt       = PING_PONG_ACNT;# H  i  z2 o& A: [
                paramSet.bCnt       = PING_PONG_BCNT;
4 W, h# R& L. m1 Q6 ]3 g" T% t                paramSet.cCnt       = PING_PONG_CCNT;
) y, X0 L& J4 P9 H3 i: J6 ?                & z7 Y+ p$ e3 ~- E/ @- S' ~
                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 c2 l! Y& Z/ p, i" A                paramSet.bCntReload = PING_PONG_BCNT;) W, f9 H2 Z; x7 v5 q: s
2 c/ g" y( Q6 S: j! x" {% S. j
                /* Src in constant mode Dest in INCR modes */
- W$ E% C# a! u1 d                paramSet.opt &= 0xFFFFFFFDu;
% i( B- S) b- S                //paramSet.opt &= 0xFFFFFFFCu;
# i" u; X+ p" y$ _& @. T6 N               
8 s& K0 k3 H4 a4 {9 s4 |7 e                /* Program the TCC */
) d) k8 h7 s6 k4 m- G+ U                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' Q* G; }# l/ @" E
) R  Z; j% V0 m- {4 \' K                /* Enable Intermediate & Final transfer completion interrupt */
9 C* w1 N. t# c7 ?% i                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ q0 v" I' M" k. ?' t. ?                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 B$ f9 q6 T0 `$ ~+ M9 e2 ~

: `& d" b9 d: v7 r; {' a                /* AB Sync Transfer Mode */
% q* v/ S0 |( {7 \6 _6 o$ d                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) R  S( P; L+ |$ o+ _; j* u4 }, p
               
* F: @' X0 v9 W% Y4 y( _# c                /* Program the source and dest addresses for master DMA channel */6 ?( V9 G9 o( t% b+ B/ N- j5 O7 @
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);& a. u& M! a6 I9 h7 n
                paramSet.destAddr   = (uint32_t)(ping_buffer);
) V9 |- R; ^! p5 K# {2 I
9 C; y. u9 P! C; y# Q' Z8 Y8 Y9 x6 J! h                /* Write to the master DMA channel first. */
  P/ h( Q6 K3 s+ G& n# {$ l- a                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 A; r$ T3 s; n, H! @% F1 g1 m
    }       ; ~0 _% `0 s: |& e0 d' T8 H

# w4 m" \- }, ^2 O2 M0 x        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, L7 X9 e) i+ d& Z       
- N% X* w, c# L5 X0 _) G    if(result == EDMA3_DRV_SOK) . K" B  s7 r: @! P1 e
    {7 ^$ U" t9 L# n! z
            print2arm("edma3 driver init success.",0);$ t: R, r. K1 T0 z: |2 v* o
    }   {$ n- |% r" u$ @/ ]
}* s7 Q- ^! [( Z" Q- W

( x" p9 ^# j7 D5 c
8 e1 I* {8 G+ U$ I- W& `' vEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* @1 s  e) b+ M4 P1 ~

; ]0 k# t% ?  d1 M) [" {
; _  r" D" s2 v- t, K$ f3 e0 Q
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 h6 W" Y, i* M) B6 F每次DMA传输完成后都要再次使能传输
3 y* ^: G3 ~8 b# H; V- p
原来是这样,我明天去试试,谢谢了!




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