嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, W. ^% P! l. B' M5 D9 n#define  PING_PONG_ACNT          1
6 [7 @/ }: H- Y; d#define  PING_PONG_BCNT          8*32*40
0 G1 ~7 `) \2 c//#define  PING_PONG_BCNT       1
  P$ Y) Y  k1 u; ?# }0 D#define  PING_PONG_CCNT          11 r- w5 L1 f% ]. z; T
#define  MCASP_BASEADDR          0x01D00000% }8 ^4 l0 @- K
#define  Mcasp_RXEVENTQUE        (0u)
" S: L8 x7 l4 e
. f- W9 w+ G3 V/* OPT Field specific defines */
0 t8 T! j$ r5 k. Y! t$ y  P$ L#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
4 o& G( z2 I  S! O#define OPT_TCC_MASK                        (0x0003F000u)1 z5 Z3 H$ R, f/ @/ ~+ H
#define OPT_TCC_SHIFT                       (0x0000000Cu)# I8 |8 u1 q1 x) Z
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
6 O- d- T! z% _2 ~2 O+ F#define OPT_TCINTEN_SHIFT                   (0x00000014u)0 V& r5 z* @: A7 J1 q' e0 ^) s$ z9 ^

7 R: l- L2 {: H) t+ D4 fchar ping_buffer[PING_PONG_BCNT];
" p; K8 b/ z& D# |" `* ]; g2 |" X( x7 Rchar pong_buffer[PING_PONG_BCNT];
: S0 e7 D4 c$ T" p/ X2 G( I  l0 F3 x" {
) r7 \  C/ ?  N- {( g9 U" Z. c7 y% A

1 v+ G1 q' `- `" b, s7 t- w4 f! }7 s0 ~: C
static void ys_edma3_init()+ r# D4 d: c) \; y, k  k
{
* W' V) r; Z1 C5 D, l' c        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- v% _$ E, n  o+ {
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( ?8 g3 ~$ n. q% K: ~+ M        EDMA3_DRV_Handle hEdma;
1 j: [! X4 I9 h. h+ B% ?    uint32_t chId   = 0;
+ U9 D' S; E' b0 k% w2 T    uint32_t tcc    = 0;
5 `3 Z# x: g3 X4 U% F# V9 u6 `7 X! R- h( K) @; G! L
    print2arm("edma3 driver init...",0);
! ~+ C3 G( d/ O1 k! S$ |8 T9 A9 z& `% ~; l
        hEdma = edma3init(0,&result);7 I1 D" E  w1 `
        if(hEdma)0 @1 r2 S; I3 H( Z* i
        {
, ~6 `* A4 n' b- {' F! r" I$ w                print2arm("edma3init() Passed.",0);
, X6 C$ {& j& B# K        }( U+ ~" K2 F& v: q" }
        else5 H1 Z$ n/ _) r+ D) Y# Z
        {1 I' k1 I1 e9 ?5 `+ H& B% P
                print2arm("edma3init() Failed.",0);
6 G. u( \# A4 l, j        }( i4 H1 M$ n& w, P+ I& [
        9 V: B% P% e  G% K% x) @4 z
        if (result == EDMA3_DRV_SOK); @) R7 L0 \, K$ \5 h
    {
8 ^8 i7 d( X) U                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. P! F! y- e( w: X; C6 v                                                       (EDMA3_RM_EventQueue)0,4 T* v$ Y& {2 L" c4 f, n# s0 v
                                                            &edma3_isr, NULL);! B0 n& D+ d* i7 p3 X, |- B
    }& M7 n" e/ e, \3 u/ e
        4 t8 b) j2 o5 I) T
        if(result == EDMA3_DRV_SOK)3 M) Q' {8 C+ N2 v
        {
5 }) [5 G0 ]2 W3 c( u1 |                paramSet.srcBIdx    = 0;
' }( t: M5 o) ]6 [                paramSet.destBIdx   = 1;; x+ j* j2 N8 y  k8 @
                paramSet.srcCIdx    = 0;( Q) J/ {* g( G2 W
                paramSet.destCIdx   = 0;! B: t; B! x7 W4 h) ^
                paramSet.aCnt       = PING_PONG_ACNT;* s# S' N; j& [6 I
                paramSet.bCnt       = PING_PONG_BCNT;
3 L3 b3 I# c/ }* @$ I; x% X                paramSet.cCnt       = PING_PONG_CCNT;
% I. L" ]% z; @* w               
( v) x" ^+ o* ]3 o- m                /* For AB-synchronized transfers, BCNTRLD is not used. */+ Q7 N# C/ ^5 s) f. ^9 t1 [, t
                paramSet.bCntReload = PING_PONG_BCNT;
3 c/ e! l3 U1 R7 k) N8 c! t
9 l5 _* J8 `7 v6 ^" Q$ Y                /* Src in constant mode Dest in INCR modes */: z- ~/ u$ Z) \: l8 n  W
                paramSet.opt &= 0xFFFFFFFDu;
! ?3 D/ K( F  n8 V: U# L5 w                //paramSet.opt &= 0xFFFFFFFCu;  T1 f) o& d7 S. w5 U# o/ A5 q
                0 {. A9 r! ?+ Y5 D
                /* Program the TCC *// W' r7 {$ r. X: r) g, F6 W# P
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; j4 V( c, R0 K( ~. r& {* |2 s2 m

4 N- o! p; A$ n* j                /* Enable Intermediate & Final transfer completion interrupt */
8 f- q( f$ c# e5 Z                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ E# y* v9 M- @' [) \                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' j' A4 C  `* ], G  e; O1 i$ s! D+ x
                /* AB Sync Transfer Mode */9 p8 L3 d, P, E0 \- k" @6 ~# t/ B+ ]
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 ?, F7 e# `7 l! t4 k8 j4 s# O8 {                : z2 e+ K+ v1 b  ~, u
                /* Program the source and dest addresses for master DMA channel */9 g5 |" L8 Y! |
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);+ N2 B6 B! O1 T: u6 ^- H+ _
                paramSet.destAddr   = (uint32_t)(ping_buffer);2 A3 R! M/ M9 r& h0 B& e$ x; a

, q* e; K  T' f. _- E                /* Write to the master DMA channel first. */6 f$ }1 h5 z& F, }
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
: _$ a5 P4 {8 e: E* L9 @    }       / m; Q& ^* A5 V, `, [! ^/ x
0 @2 n4 J( w3 _8 N. \
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) V- z) Z, j% a7 W) `+ M        : K5 Y% ^& |3 f( f3 g1 f& O
    if(result == EDMA3_DRV_SOK)
# ?. C! \" l$ ~2 l5 C7 a    {; m7 r! e( G& M8 Y* I
            print2arm("edma3 driver init success.",0);( ~: A4 H: G; n. ?* z( I2 k! j
    } 6 w: {( n+ f5 b" W0 P
}
; X. t: G9 \. X  B$ W2 b; w7 Y9 o* }: g: P3 ^& h, y& J

+ v9 ]0 O6 e) w  b7 [EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。6 H7 F! S" R9 p7 Y

( P( ^1 o  a4 Y, k) X3 _) Z+ S2 m* j9 C# W

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& @# O1 W- v3 @- S% Z每次DMA传输完成后都要再次使能传输

! n3 m, |* T8 O* f# I$ U, _原来是这样,我明天去试试,谢谢了!




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