嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; _9 x& e$ _7 N& m5 \4 f#define  PING_PONG_ACNT          1
9 I) i1 Q7 q$ V1 a: i#define  PING_PONG_BCNT          8*32*40 * v% E" b+ A( a4 e1 ^1 \
//#define  PING_PONG_BCNT       1 6 `8 D: }" c4 y$ _% b
#define  PING_PONG_CCNT          17 x/ S% j. `" [0 W6 X
#define  MCASP_BASEADDR          0x01D000003 m3 x7 m: ^2 L% [
#define  Mcasp_RXEVENTQUE        (0u)
3 \) m& G. P1 e6 |1 T$ h6 H. j
4 \& I8 Q5 J3 K% `7 C3 M1 E/* OPT Field specific defines */
2 j  n3 N+ O3 G' |/ q. r#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" e$ z- s. K5 }#define OPT_TCC_MASK                        (0x0003F000u)
/ ?7 x. z5 g& M/ [0 M& W/ f#define OPT_TCC_SHIFT                       (0x0000000Cu)
1 o: F% s+ q4 ?5 @6 q  F#define OPT_ITCINTEN_SHIFT                  (0x00000015u)8 G, N+ O8 W1 @+ {# A' S4 O
#define OPT_TCINTEN_SHIFT                   (0x00000014u): g) j6 Z& z0 l) s( u

+ r+ N9 {2 j9 a4 w- I7 ?char ping_buffer[PING_PONG_BCNT];$ `9 }3 }8 ], i1 B/ b1 b! T
char pong_buffer[PING_PONG_BCNT];& A6 Z( c/ i/ ?9 B4 u

, \2 Y7 c( A6 ?- S: h$ L+ a
. L, z( n0 \6 d* v0 {1 q) g5 h( {" x& X/ K6 p+ f, G4 X7 q2 H3 K

  x# M5 z2 b3 w2 L$ d  astatic void ys_edma3_init()
- w5 }4 {( h  a, ^; }& q* U{" Q  |6 m& j4 [7 y+ k! H
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};7 d$ f8 r! u% o: l' [& G
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;, |* Z5 H2 r) A! @1 a) P
        EDMA3_DRV_Handle hEdma;
: G' U* l: D! f; W    uint32_t chId   = 0;7 \: r2 o- S" J  R6 u6 Z8 J
    uint32_t tcc    = 0;
4 G* D0 r2 t4 E" @! V. A
" q: F8 T" p& a/ z    print2arm("edma3 driver init...",0);3 J# D3 {  d$ A
- p( K* ]* }4 b% n
        hEdma = edma3init(0,&result);6 [% s6 M) Z0 X
        if(hEdma)
4 |6 B0 Q/ j5 g: z% b  x! s        {) Q% V. O3 C' n7 p- f
                print2arm("edma3init() Passed.",0);
3 h! L8 M6 y0 g) d# G        }/ T& \9 V9 A, `6 a9 S" o; a
        else6 Z& G) c% j# a1 r+ g0 F9 U5 [
        {1 l) E* j- Z- b+ Z8 J1 a
                print2arm("edma3init() Failed.",0);
  _  ]( t  s: K9 m5 ]7 z        }/ ]+ d# I: a7 o( b2 m- l
       
  J# ?2 u; Q6 [/ y% i) v9 n        if (result == EDMA3_DRV_SOK)
9 G! d9 I, Z% K    {7 z7 \8 }% g# _! ~3 q
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,  U+ U! u7 g8 Y# `: g$ Z) J& P
                                                       (EDMA3_RM_EventQueue)0,. K5 J" G: ~+ x$ y+ r8 k
                                                            &edma3_isr, NULL);0 V3 t& [  F' \
    }( _8 m# [7 g8 s/ u( _! x2 E
        ! x: Q/ B  o% t; l9 y( _( R
        if(result == EDMA3_DRV_SOK)
4 n$ {# w1 n( Z9 h        {3 Z6 Y2 N+ d* B" L$ O; z! x0 P  r
                paramSet.srcBIdx    = 0;
' k0 A* J- ~" K3 @                paramSet.destBIdx   = 1;2 _) K9 K6 P1 {$ a' q! b  W
                paramSet.srcCIdx    = 0;
* k: v5 z% ]8 B4 k3 t! s  E                paramSet.destCIdx   = 0;- o& ?: }1 M& \; ^: t: x. S  [; g
                paramSet.aCnt       = PING_PONG_ACNT;4 q7 @5 r# r  Z' x9 U2 c2 O
                paramSet.bCnt       = PING_PONG_BCNT;( w, ]8 k8 E2 U0 [
                paramSet.cCnt       = PING_PONG_CCNT;0 b( A* g) H) y7 q1 N7 b
               
& h6 Z& P: L9 f                /* For AB-synchronized transfers, BCNTRLD is not used. */
1 D$ U3 X  M& J                paramSet.bCntReload = PING_PONG_BCNT;
  l' U6 w% h9 k/ ~- ?1 H# R5 P* i  E
                /* Src in constant mode Dest in INCR modes */4 F) {$ \" b$ F5 F. X
                paramSet.opt &= 0xFFFFFFFDu;
6 f, I5 Z8 @# h" u: }1 n: D7 n                //paramSet.opt &= 0xFFFFFFFCu;6 O3 d4 M/ L9 C' u& ?
               
& {; U( m/ ]3 z7 ^6 L                /* Program the TCC */2 t- s: p) t0 W( i2 H
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ [5 p7 `' q( W2 M6 C6 v8 R% a8 S7 e0 M) {' N2 L
                /* Enable Intermediate & Final transfer completion interrupt */5 X0 q6 `( Q) z) Z
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 }; ?  M7 O2 @/ A                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! }" o/ q) I& U, Y+ z- z. h
% o  w" w- l+ i% E" U; h                /* AB Sync Transfer Mode */
$ |2 E) e5 x+ h' g( r. t                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  Q  c& q( Y# F' T                ! ~6 m! J1 P/ Y
                /* Program the source and dest addresses for master DMA channel */( y+ A# w$ ^" h0 c1 C; ^+ g- n8 b
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 W6 E0 S1 z, P6 b                paramSet.destAddr   = (uint32_t)(ping_buffer);
6 q* B7 R9 E: N3 R
% A5 {3 `, V6 J9 ]6 q6 S+ A                /* Write to the master DMA channel first. */7 S- {* z: b7 P7 Q9 l: Z8 @3 u! y
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);7 |4 P4 Z6 b$ N* M
    }      
5 M+ x) T7 P1 W
1 v2 U$ j) f- B! O% t        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; {) [* J' g4 C        % }  X) E* m8 l$ \" G0 w
    if(result == EDMA3_DRV_SOK) : u9 O& g! I, P" _+ S, O3 L  u6 o
    {5 L% s: a; J& h$ B" G5 P
            print2arm("edma3 driver init success.",0);% }7 N5 K& p- A* D
    }
8 t6 s" {$ c  y( z3 l' e8 s}
: N0 Q1 d9 H9 g1 {8 Z- a; d" ^$ U1 \5 z

- }& H# B! [$ d  ~: p5 U6 mEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% ]0 w& ?( c( e$ L6 W( L. b9 t4 z: B6 d+ O- K: X- N  Q1 O5 n

' O8 V) Z! U' P# h
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ M; d0 }/ A: j每次DMA传输完成后都要再次使能传输
1 k+ F7 @% s  K8 c! M# d
原来是这样,我明天去试试,谢谢了!




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