嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
# p. T  y& f/ l# \0 b#define  PING_PONG_ACNT          1
/ A0 M! e8 X+ N5 a4 C1 a#define  PING_PONG_BCNT          8*32*40 3 |3 Z1 t  N8 n/ c' `0 ?' {
//#define  PING_PONG_BCNT       1
3 Z) m7 v0 N( e#define  PING_PONG_CCNT          1
  `  ?. B9 m* |# h#define  MCASP_BASEADDR          0x01D00000
0 ^+ a$ O% W' M$ g6 E$ H% {#define  Mcasp_RXEVENTQUE        (0u)
/ y( ^. h1 B- m: [% Y8 N! q
% h5 w' ?8 ]- |$ B/* OPT Field specific defines */+ P% J6 G2 |  D7 j" P
#define OPT_SYNCDIM_SHIFT                   (0x00000002u). i' _8 e5 R) y4 L3 x- t0 R7 k
#define OPT_TCC_MASK                        (0x0003F000u)
5 _, G1 B) ~9 z4 U8 v#define OPT_TCC_SHIFT                       (0x0000000Cu)0 W: U( l9 a) c/ G  D7 O8 a. w
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)! }( I" s' z& p7 m1 }
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
2 v: V2 L7 `& s
# Y! N( f- o6 f* d  ~char ping_buffer[PING_PONG_BCNT];
% m& u( U, n# e9 E3 zchar pong_buffer[PING_PONG_BCNT];
  Y6 ^+ \' s2 Z8 f( f7 m
& A; |; T' O  }; u+ k( O9 p3 d; `9 E) Q! e, U* v

: l  ~+ x, W. m. b( j8 f& X
5 p3 u2 ]4 o  b1 d) ~. O, Istatic void ys_edma3_init()9 W; {0 [# b9 A/ _  }
{
/ c' M- J: j$ K* g. q( l% j        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# Z6 V* n' F. S9 x( g        EDMA3_DRV_Result result = EDMA3_DRV_SOK;& R/ T3 g. M0 i& X
        EDMA3_DRV_Handle hEdma;
" o. l' W% W) n    uint32_t chId   = 0;2 c% B& t3 [- ~5 m. ~0 n
    uint32_t tcc    = 0;  q: P6 Z2 r/ A7 X8 w

9 K# R6 t( D6 p. v; W    print2arm("edma3 driver init...",0);
: D+ A1 g) p! s2 n0 r" o' r( s8 S0 u% v* c
        hEdma = edma3init(0,&result);/ y' f6 i+ s# D1 I, k# `  x
        if(hEdma)6 }/ L9 X' Q( T! `$ q' }
        {8 [) `$ V5 s2 d* h9 t
                print2arm("edma3init() Passed.",0);1 ~. ^% W, F3 a3 f& w" ~0 V! D
        }
4 D! U) o8 @$ d0 V( X8 v0 w        else" n1 l9 H! L5 t( b5 d- H! G
        {
: M" T- \) \+ c  U( |                print2arm("edma3init() Failed.",0);
7 c: e- c! s/ u9 }. }" b- B0 l. _0 G+ u        }
$ r# b9 B9 j% b          B  s( U' @5 A  {; G/ e: v% k+ Z% l7 N
        if (result == EDMA3_DRV_SOK)
* d+ w( v5 d- E: o: B2 s: X$ ^    {
9 N7 x, r; ^" N0 k* e) n* s1 z% P                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ m+ _- F2 w7 J3 v# g+ N& l8 w
                                                       (EDMA3_RM_EventQueue)0,
. y$ V& z& F# L                                                            &edma3_isr, NULL);+ C! O$ _7 R+ T, }  t9 n3 c
    }' \+ C& d5 ~1 u6 |* c* T
       
/ Y3 [/ a: e. y- y! m" D3 t        if(result == EDMA3_DRV_SOK)
. D3 g  j# J1 V3 ~. L0 i5 w        {
- F( _  N6 A; z( i& I7 B1 w$ c                paramSet.srcBIdx    = 0;& N' a# A! h  X7 V, g0 |
                paramSet.destBIdx   = 1;
$ n- z! [4 |9 \                paramSet.srcCIdx    = 0;
, @) N) {, X8 v                paramSet.destCIdx   = 0;2 V& n* x+ n  O- @$ x
                paramSet.aCnt       = PING_PONG_ACNT;1 T# M9 b4 v6 L6 }- L3 J! N6 m
                paramSet.bCnt       = PING_PONG_BCNT;
; g  n4 {9 c5 S1 p5 l2 I/ b# Z4 B                paramSet.cCnt       = PING_PONG_CCNT;* O  P+ J, A$ e( P" W4 z1 z
                6 G; D/ C0 F3 H+ ?1 F2 o2 o
                /* For AB-synchronized transfers, BCNTRLD is not used. */& ^8 p) N+ k) ~
                paramSet.bCntReload = PING_PONG_BCNT;: C5 K  ]5 v2 F& U& N& V- r. L! t- u
+ r. l' C" l2 W: b/ ~* o
                /* Src in constant mode Dest in INCR modes */
/ b& S8 {( ]4 f                paramSet.opt &= 0xFFFFFFFDu;! t8 M3 {' U6 F& z; Z
                //paramSet.opt &= 0xFFFFFFFCu;! h) e* p3 }2 p& y; P4 Z: z
                ' Y. F, C% q: Q  a$ n! m
                /* Program the TCC */
: ]5 w/ m  _5 e7 c6 Z' ~' E/ i                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ p  t2 m7 V2 K
5 |" K2 V/ r' A4 W                /* Enable Intermediate & Final transfer completion interrupt */
7 Y4 W4 I: ^3 m- C% J" I" K" e                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: }4 @9 `! q4 h5 k3 k; Y                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. K1 V3 |- Z" o4 x, h! P
/ t( E/ Q9 P4 N6 Z1 Y6 S                /* AB Sync Transfer Mode */4 w1 {5 o4 d- I5 H" w* }  L; I
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* n  G2 \5 j9 g
               
% k. W& v$ T$ W& f$ K                /* Program the source and dest addresses for master DMA channel */0 m1 K3 ~7 y: d) C
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
* G+ K- a* Z' r5 d6 K4 U) a+ F9 x                paramSet.destAddr   = (uint32_t)(ping_buffer);6 [. o, |4 f9 A; v8 x

* u* e4 h/ q- S, L# _5 W: P                /* Write to the master DMA channel first. */
/ P6 b2 q8 A+ V+ U5 j                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 Y( V) @' D, U. F+ l# F9 U    }      
) G) r3 C3 b+ a( i
4 x& {5 o: V9 X0 d. a        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 x* O$ g& ~7 n8 b        # ?1 b4 v5 y) p/ d% T
    if(result == EDMA3_DRV_SOK) 2 z  R. n/ h6 O' S
    {. h  d3 w& r: `8 b) X
            print2arm("edma3 driver init success.",0);1 Q( @8 e9 ?0 q4 w% F0 r
    }
& Q$ i, M9 v5 |( }; `4 A}. C0 n, t* P5 G) ^$ I
( S3 m' _1 X- A  F
( r, G( k9 J) s, ^3 V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# G8 H# @. t# ^. y& x: }# ^3 @
8 N9 l% M9 \& A; t" D

4 C9 P' ?) R& s
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 ~; \) E8 T* w1 V. r8 ^+ H- R
每次DMA传输完成后都要再次使能传输
! Q* Q0 k* `( W, h; O' V
原来是这样,我明天去试试,谢谢了!




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