嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:) Z! x- a* {, A$ {
#define  PING_PONG_ACNT          1
: u/ M, V- }" X- m' j4 Q/ r#define  PING_PONG_BCNT          8*32*40 1 R. {$ f+ W1 O1 v2 I3 k3 r
//#define  PING_PONG_BCNT       1 ) K; @( j5 X: U+ t
#define  PING_PONG_CCNT          18 A0 {+ Z, {" [% H( |. t
#define  MCASP_BASEADDR          0x01D00000  f% r; J- W+ \/ o0 P  E
#define  Mcasp_RXEVENTQUE        (0u)
7 T* E+ x& L, h8 x" E$ N7 h0 J% }' h" _' H7 {- x: v
/* OPT Field specific defines */
; r  Q4 q* r% b' s" u* t#define OPT_SYNCDIM_SHIFT                   (0x00000002u)2 c; a1 X0 R# p8 _: K- f
#define OPT_TCC_MASK                        (0x0003F000u)
* d7 Z+ h" d/ A2 J% Y! H+ `#define OPT_TCC_SHIFT                       (0x0000000Cu)
8 _" n+ }6 t, t  V& u: j& I, `#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ V1 a4 ], U" d: K3 v
#define OPT_TCINTEN_SHIFT                   (0x00000014u)) M3 E2 Q$ @8 n4 q2 y* I
9 F6 a/ R# O; o& o4 Z
char ping_buffer[PING_PONG_BCNT];
" [, P$ |6 d& v+ f' \% ]' bchar pong_buffer[PING_PONG_BCNT];4 f( }: K) V4 y  F! n

6 }+ D& F% s4 x0 A0 l! W4 y
/ l. ~/ K* M, T4 d" S& w7 @: j+ ^7 _) D  u: P; T
4 k- W$ o) t) F  ~9 h+ q
static void ys_edma3_init()
8 |* ?' V7 i8 m8 W{
2 d5 _4 r2 [2 D2 X        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# [* P: \/ ~6 v1 V9 d        EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 X3 l" h# x' ]4 o7 P
        EDMA3_DRV_Handle hEdma;, P5 t" Y( V0 s3 |
    uint32_t chId   = 0;
# k1 M: ~9 \. [4 K; y    uint32_t tcc    = 0;2 C% z4 M% n7 j) B& [

9 `4 m2 O+ f) f1 D- }    print2arm("edma3 driver init...",0);7 L+ m" K' W6 o7 k* o
! S6 y8 D& K1 u8 l5 I
        hEdma = edma3init(0,&result);, {; _) g4 t: L5 |" C3 q- J* ~
        if(hEdma)/ _7 J" a1 s4 k7 b; U
        {
' t+ H# v% R. T/ e' R/ n                print2arm("edma3init() Passed.",0);, N5 N0 a" c8 \' f" V
        }* r- I0 }3 V8 s2 @& K
        else: d& W% n8 M" q
        {5 y6 p  W0 s' D$ z' b
                print2arm("edma3init() Failed.",0);/ t+ f2 Y9 k# P$ \. e
        }
$ H# m8 h, K: e8 T5 g9 L       
. M0 L& \4 \8 o, i2 R        if (result == EDMA3_DRV_SOK)
# w/ r1 U; S0 ~/ B1 Q4 T5 R    {9 I$ Z4 h% r3 F8 X! G: b
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 b* J+ G+ \8 H2 o& P+ H                                                       (EDMA3_RM_EventQueue)0,
- d  w8 H3 e! }7 z6 M- B1 \! K                                                            &edma3_isr, NULL);5 k. z4 z! e& q% K# [$ i: O" }& G
    }/ U! f3 M1 J; w4 W" p0 A
          x/ l) t8 \9 m0 L' ?  }
        if(result == EDMA3_DRV_SOK)/ H+ y( p' x9 m  B2 R" ]" J4 Q
        {
6 p. B/ k. u" O: L                paramSet.srcBIdx    = 0;6 j7 i6 ~- \& h4 V
                paramSet.destBIdx   = 1;) e. V5 z; K: r& o* J2 s! t5 j
                paramSet.srcCIdx    = 0;
* u9 `6 P5 G! i. c4 V) a                paramSet.destCIdx   = 0;% w0 g; f* T  m) H0 _: e5 Q2 M
                paramSet.aCnt       = PING_PONG_ACNT;
- }8 G7 ?7 J' ]* h( o                paramSet.bCnt       = PING_PONG_BCNT;8 f1 j0 i  o0 H$ S1 w; O
                paramSet.cCnt       = PING_PONG_CCNT;
( ]: b% E6 O0 H5 n3 `               
+ L5 m8 M; j1 ^$ M                /* For AB-synchronized transfers, BCNTRLD is not used. */  @  H9 X% u" @0 I$ P* b) }* G3 c8 q
                paramSet.bCntReload = PING_PONG_BCNT;  m& e4 ?0 [% B+ ^1 ^  T

; L: y* \5 o- ^2 p8 v5 v$ M* Z                /* Src in constant mode Dest in INCR modes */) l: P. ?8 h; o, c( y
                paramSet.opt &= 0xFFFFFFFDu;- p* X6 g7 E8 I; H
                //paramSet.opt &= 0xFFFFFFFCu;, L" G) _1 C; f; z, T
               
& E$ K) v, Q/ V/ J5 K                /* Program the TCC */
! M! p3 f. W9 q1 v4 {0 Q" D/ b% N                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( {. E' J* A) t0 h
. \* \/ [+ M/ H! e                /* Enable Intermediate & Final transfer completion interrupt */
( u( }) ?+ D- z6 Q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 F2 r+ t2 p9 g1 z% l& z                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* H4 Z5 d+ p/ w$ v2 G& m0 O- V/ W& X+ Z6 b6 _
                /* AB Sync Transfer Mode */5 i, Q, V) ^& U, p2 v
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);: k; J& r& z6 Z, q
               
) b" P/ I4 Q  B4 F  M$ e3 |                /* Program the source and dest addresses for master DMA channel */5 C: @+ {( R. \6 C) L1 O
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# o3 p3 H$ z' M/ p$ d5 u) J. c
                paramSet.destAddr   = (uint32_t)(ping_buffer);# c; H1 Z! e" \4 z' _; ]* ^) e
+ b% H7 A6 l- I, Z; J+ B3 [: ~7 O+ f1 t
                /* Write to the master DMA channel first. */$ N4 |/ c- _- b
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ ]# Y' P$ l% [% h    }       * X& e; `- b; M' _  h% j, l/ F- d+ e
: K8 ]0 W% M. `# v
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% g& t7 Q( s; `  ^, h% D7 t' `& [       
) D) w1 ~. }5 P2 I3 t" @( z    if(result == EDMA3_DRV_SOK) 4 l- Q; j) R3 k: I* C% m' a  X
    {
9 T0 p3 a' f3 z* D9 \5 g            print2arm("edma3 driver init success.",0);
; q9 h" |7 P6 \& v    }
9 x0 u& J6 O* J  j}
% A* A2 g& t" S( X
: x& c9 h2 Y( G
" w% _+ w! c; B! K% K, {EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 V; Y4 ?! {' P+ N$ i* w) s
7 o0 z, w# v- E3 s( X  c9 k& H% u0 b4 S

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; Q8 i7 j! s: z5 x- X, M6 a% z每次DMA传输完成后都要再次使能传输

5 `9 a8 O+ D4 J7 q原来是这样,我明天去试试,谢谢了!




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