嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 c+ f: `" _0 j0 E) i#define  PING_PONG_ACNT          1
8 t/ c0 d2 M, O( m/ C  K7 X* Q/ d/ i#define  PING_PONG_BCNT          8*32*40
6 w% X' @% o! r//#define  PING_PONG_BCNT       1 " l4 q2 i+ Y5 ]2 P/ f6 ]6 s0 z/ ]
#define  PING_PONG_CCNT          15 @2 ^0 a: F, x# U4 X+ @7 x8 H
#define  MCASP_BASEADDR          0x01D00000
5 U% K" k1 }$ ]#define  Mcasp_RXEVENTQUE        (0u)
+ J# v3 t9 ?$ n; n' T2 s+ _0 n$ U9 N& g, P% Y* D
/* OPT Field specific defines */
  U' |2 Z7 C/ A6 v: V- @) h1 W#define OPT_SYNCDIM_SHIFT                   (0x00000002u)  I. J( C- H0 J& \
#define OPT_TCC_MASK                        (0x0003F000u)
2 O& P: d1 O$ t' e#define OPT_TCC_SHIFT                       (0x0000000Cu)7 I' F3 w& T$ e" T& U
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)" _$ f3 d' x' X0 ^! u- P0 M( D
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
: C' ~- g2 ]' ^
0 V3 d3 \! W; n6 O9 F5 schar ping_buffer[PING_PONG_BCNT];
( |. G# U2 B0 m4 h$ O* achar pong_buffer[PING_PONG_BCNT];( {4 t, M+ F/ T. Q, g0 A

, i8 a# W# ~3 \/ I- Y6 I+ Q$ z) P( W. T' O0 u: S: {
4 T3 ^0 v( x4 N

0 l2 G. y. V5 M1 D9 Astatic void ys_edma3_init()/ q% k& Z, Z5 Z* n' {& t$ |
{2 J# h1 _$ {* h% ^
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 ^& L" a. {5 ]8 C        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
  G" y+ ]9 a  Q+ W/ R' h        EDMA3_DRV_Handle hEdma;( D* S; _0 o3 `1 [- e! l
    uint32_t chId   = 0;
6 v# r+ d4 l9 p& t$ x$ q6 B    uint32_t tcc    = 0;
$ }2 v# v- v/ K! z
, y7 Q2 o* W$ z5 @& {' I    print2arm("edma3 driver init...",0);" f4 J/ V$ f) E1 @  z4 g

' H0 `0 R5 @6 z$ J4 g" v$ h. [' s        hEdma = edma3init(0,&result);
! C( J% C/ N9 N        if(hEdma)
  i1 p0 ]" e4 h, N1 Q$ n9 ?5 K/ W/ C        {- x4 `7 P! N4 |. [5 }
                print2arm("edma3init() Passed.",0);2 P) u& t6 \; D
        }$ |3 S7 D( L$ t$ [5 s' f
        else* d" l' k% ]2 [  S
        {
, U( F" T  d7 j9 \% P0 J! R( n8 N. y                print2arm("edma3init() Failed.",0);, j, P. u) I8 ]6 N# n# Q2 i
        }% u& J. h0 `" |* H, {- ^! N
        ) H$ U! L& s( w0 l* z) G
        if (result == EDMA3_DRV_SOK)8 B6 Y8 `! S2 D' o: [
    {; O# A, _7 I! `( M' B
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' g8 o, Y+ Q; L% C5 z                                                       (EDMA3_RM_EventQueue)0,% S7 R4 A/ E4 D( z  i/ {* V+ q
                                                            &edma3_isr, NULL);
3 E, a4 S3 m7 J4 ]2 p- C5 _    }
) k& [& i( n5 M0 S3 H0 I        / }: f7 U0 C2 }. h' U/ l& w
        if(result == EDMA3_DRV_SOK): E& P7 K. ?6 c4 _7 R
        {  u4 p) u) h' g+ g7 S  q: w
                paramSet.srcBIdx    = 0;, G4 K3 z2 \' l
                paramSet.destBIdx   = 1;
  O% R& d- v) _" j4 D. n                paramSet.srcCIdx    = 0;
% e( f; N1 B7 u$ L                paramSet.destCIdx   = 0;( w: `% ]/ v1 G- P! k) j
                paramSet.aCnt       = PING_PONG_ACNT;, @7 k, s5 x# k3 O( Z# _9 R: Y
                paramSet.bCnt       = PING_PONG_BCNT;9 W/ o: E& I/ Y2 b, ]4 v
                paramSet.cCnt       = PING_PONG_CCNT;
; }9 t' H5 J6 D               
& ^# q$ O4 ^+ A2 ]                /* For AB-synchronized transfers, BCNTRLD is not used. */
: I$ ?6 l) T1 |6 @8 r                paramSet.bCntReload = PING_PONG_BCNT;; D: m6 a4 R( [) v8 _" }( d

8 L5 k" x9 {; ]! ?4 x( y                /* Src in constant mode Dest in INCR modes */
8 C: l4 o5 H9 j- U4 Y" G$ e. R                paramSet.opt &= 0xFFFFFFFDu;
  Z$ W0 X8 X/ ~4 x7 p$ P                //paramSet.opt &= 0xFFFFFFFCu;8 ?& w( x+ P7 i) f* O
               
, l: l- q* k  G+ z                /* Program the TCC */4 f; E2 f- q* D9 l2 F" `5 s8 y
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) p- y; V' K8 @2 b5 b& i  ^* U" G4 ]/ c0 y; ]) E+ @6 R" Y
                /* Enable Intermediate & Final transfer completion interrupt */# L$ x+ z1 |5 S! ]. {" d9 D5 B
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);  i8 w/ L7 }; W* K  v, y! t7 q0 I
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 K6 |: c% Q! i$ L9 n" V9 a: Y3 w7 v7 _( W
8 m% N& f$ t( }$ I& S                /* AB Sync Transfer Mode */
' `$ o6 r( A8 O9 H2 l) p; w                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);! _' A3 G( [/ W0 s- ~. J
                ( }6 O& M6 D5 @7 o+ C0 D
                /* Program the source and dest addresses for master DMA channel */4 ]; ^& }: n6 W" o. _
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% v9 `8 `/ {. ?
                paramSet.destAddr   = (uint32_t)(ping_buffer);& f) t! t0 b0 b1 r6 K

/ S' \, E/ F& i2 Q                /* Write to the master DMA channel first. */0 w1 I3 Z/ {& K7 D, ?9 o& `! n4 L  L! i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);1 l7 C& r: K9 o, y, h3 X
    }      
9 u9 x: O9 i. X) y1 l) M. u+ U- |1 A
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. y. I; v7 {& b4 a9 g        ; Y: @+ e+ s1 A2 [0 r6 l6 ~
    if(result == EDMA3_DRV_SOK)
2 _1 ?3 L0 N! [+ Z    {4 f8 l# i( }3 a# D% |  Q
            print2arm("edma3 driver init success.",0);
. q6 |; Q9 x( Z2 C9 U1 f. ~6 S" L8 v    }
: I( v" L0 L& \6 e}
+ ]% i  M& u! v" Y6 J2 f2 R+ i
- N* y( z' s9 d# }) N% ?
& v- a5 V' c5 H5 @EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; [) e. C" d3 i8 n
( P' H7 Q# z% Q3 v6 L
' T$ N) M1 `$ z. _
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47) K5 u' z  ]3 `. B
每次DMA传输完成后都要再次使能传输

! f1 B% b- J: w2 s7 w: j原来是这样,我明天去试试,谢谢了!




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