嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 j; O5 f& Q% |. W, t* M0 K$ V
#define  PING_PONG_ACNT          1( O% K1 m& w$ Z, _) S
#define  PING_PONG_BCNT          8*32*40   c, d3 V' L7 z" h1 R2 w$ G' m
//#define  PING_PONG_BCNT       1
/ J! n$ v) @: u4 ]2 n6 U#define  PING_PONG_CCNT          14 z' ^1 l, i! i
#define  MCASP_BASEADDR          0x01D00000
+ e8 x0 i: Y) p* G( O8 z: }+ z; j#define  Mcasp_RXEVENTQUE        (0u)+ C  K1 ^5 [6 M4 L" a1 a# t# f

0 z, A% v* \) q/* OPT Field specific defines */, U+ l( }$ _1 V' f( }
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
# j% |- L  D' \6 R$ o2 Q#define OPT_TCC_MASK                        (0x0003F000u)
$ m- [" X% q2 r% }3 u/ m#define OPT_TCC_SHIFT                       (0x0000000Cu)
2 H+ \2 ?1 N* K2 P7 u$ N" J& N#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# t' b2 ^# S* h2 ^: w#define OPT_TCINTEN_SHIFT                   (0x00000014u)
5 X: E5 L& n# }3 c9 j
. t2 l/ Y( r* i1 i  h1 Cchar ping_buffer[PING_PONG_BCNT];
( v  p1 \# R5 S( m! s; wchar pong_buffer[PING_PONG_BCNT];4 p" s5 z: x% F. B% q% t

+ k* S# K. d  V+ z" {2 \$ c- E# B
; n  a6 O9 M% O, E4 `/ |' m6 G& B1 J; G2 }! g2 f2 B
1 u- @+ b2 f* `
static void ys_edma3_init(); u* \6 u( a" U5 N" O2 w
{! ]7 f. j! x$ Q
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' c  ~/ G% F6 ^        EDMA3_DRV_Result result = EDMA3_DRV_SOK;& O0 w! o# \  R
        EDMA3_DRV_Handle hEdma;9 }( Q9 m8 w$ H+ Q5 W5 u) i- h
    uint32_t chId   = 0;2 L& [# ?5 L1 Z' t* }
    uint32_t tcc    = 0;$ e( S" W  F, k: i2 \9 B
; p( Z0 E# P* S2 N
    print2arm("edma3 driver init...",0);$ q* n# E5 a- c% ^7 [9 l5 E5 J
' P5 [* f) Q' R
        hEdma = edma3init(0,&result);8 S# |% w, q" v  {3 i
        if(hEdma)
) N8 v6 _, V9 _1 {0 i; q+ j9 C; `        {
# ?  ?' K. v0 H9 \  I3 v! ]                print2arm("edma3init() Passed.",0);
* }! A! u+ d; a6 e, r+ V8 R9 @        }6 \2 `" K% J1 K
        else6 M" E$ \' i5 W. @2 N* P7 n3 v
        {
9 f$ |3 Q; R; V7 y                print2arm("edma3init() Failed.",0);
0 q, C7 `5 t' L; j& h! t        }
' i' `7 d2 f0 o5 N8 v& w# J       
' P$ w: E  e* P5 N        if (result == EDMA3_DRV_SOK)& y( o* ^( H& g! X( Y$ s
    {
, }& {( R8 }; O* n                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 M1 `8 P6 [4 d& a+ h% [# l                                                       (EDMA3_RM_EventQueue)0,9 I' `$ A0 l9 |* B0 V
                                                            &edma3_isr, NULL);# V; O; t1 M. n/ t
    }
3 h! O  N( ]( j  I        ( C& P2 [4 }, \/ S1 f0 V, A
        if(result == EDMA3_DRV_SOK). t6 N# w8 y% y+ A
        {+ k& s# o# k& \2 I  G! V6 C
                paramSet.srcBIdx    = 0;
8 ], w/ z5 i% |5 R7 _' f$ e: w                paramSet.destBIdx   = 1;
8 `& P" h5 u3 c  Z" {  ^- Q                paramSet.srcCIdx    = 0;
# f. y9 c* c* ?4 X                paramSet.destCIdx   = 0;3 j) [3 X& Z2 `* V; t  ~! k
                paramSet.aCnt       = PING_PONG_ACNT;8 `0 q  q6 n& p. Z
                paramSet.bCnt       = PING_PONG_BCNT;
7 z  b, f" T! U) o                paramSet.cCnt       = PING_PONG_CCNT;% ^3 O/ g1 u4 j0 d
               
: u+ q* l5 m+ h$ H0 \! H                /* For AB-synchronized transfers, BCNTRLD is not used. */7 ~/ z$ S& M( ]5 x+ m/ |- V8 @# Q" P
                paramSet.bCntReload = PING_PONG_BCNT;
: L# j( c. C, k; s' t7 L
" i( A) I) J+ `& U4 n8 o                /* Src in constant mode Dest in INCR modes */7 h1 H: S( w) g. R: o) z; E# C% R! p# z
                paramSet.opt &= 0xFFFFFFFDu;, T) Q5 @- u6 c
                //paramSet.opt &= 0xFFFFFFFCu;
/ a* X0 `0 o  x: k9 d- s; R4 l% x               
$ A5 c- z' K* ?  [                /* Program the TCC */% q, D4 u) s) a3 Z4 a" t7 N# w: `
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);* u' D5 X" D6 [7 |* z3 Y
! H  z, [0 f8 N6 a5 z, X( }
                /* Enable Intermediate & Final transfer completion interrupt */
5 n, E) [1 J' J                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! ?# M8 K7 c0 i  d8 K
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 E: p0 `$ g9 c+ O1 S1 N! W; }
                /* AB Sync Transfer Mode */
, g- Q2 j+ K! @: Z9 V' g( d                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ x) N) i2 s4 P3 J  j+ q               
. l1 c% k; p6 d; f/ G6 F9 j                /* Program the source and dest addresses for master DMA channel */$ R( y+ P0 b1 u
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! ^& y. j' U3 b0 L" w; w
                paramSet.destAddr   = (uint32_t)(ping_buffer);
: u& W% f$ B* d! C& a
/ I) {0 u: n9 d2 A. X0 `1 |) s: R7 N                /* Write to the master DMA channel first. */; y: M$ @9 l( o, W
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( @+ W0 X5 L! \) W8 E; X; D! W
    }      
! o! J+ x) g3 A
# M5 e6 `' d9 K5 i1 u        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);6 K- a9 j2 X5 }7 G) X8 C
        . u! a" ~5 a/ [
    if(result == EDMA3_DRV_SOK) ' w8 r! T, \- v0 q" q
    {
8 w) I& Z+ g4 C: m8 P+ b7 Y% m+ f            print2arm("edma3 driver init success.",0);
/ D+ c) X0 ~' y( X1 w$ X/ z    }
3 ~* s- I9 `+ W. \+ p# S) I' u6 l}% N: T4 h, v! w' d  C2 R4 Z
5 n" x" H' L0 F
+ o) C- S$ k/ J- e4 `7 v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' p% T2 Q/ G% s& Y3 @, ^$ Q& v9 }9 N

! X* L6 \2 n  r5 t: j
) Y+ M' s& g$ O
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47% v2 r  ^& L/ f- l0 l3 ?$ G
每次DMA传输完成后都要再次使能传输
) \* K& z% S9 @- L
原来是这样,我明天去试试,谢谢了!




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