嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! P1 b' {0 V+ F# R% E' c#define  PING_PONG_ACNT          1! x% M! i, `2 {4 B2 u8 |( t; R
#define  PING_PONG_BCNT          8*32*40
- x) ~3 l' j9 X' z//#define  PING_PONG_BCNT       1
  I+ P  |1 Y9 O$ M5 f#define  PING_PONG_CCNT          1
$ W3 V& A6 N7 y4 d#define  MCASP_BASEADDR          0x01D00000  n% J+ X9 T  [; J: G$ ~
#define  Mcasp_RXEVENTQUE        (0u)
- S9 p0 t+ a+ ^9 R5 ^# i; l0 m! ?" [! i/ l9 ^, q+ v7 J& A  ^
/* OPT Field specific defines */' K: n  [5 g! R0 S1 [& e, L9 _6 A
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)7 u# T- c: j; T9 N+ m, Y1 e) n
#define OPT_TCC_MASK                        (0x0003F000u)) _4 I4 t  W% u* N1 o
#define OPT_TCC_SHIFT                       (0x0000000Cu)5 _$ W% U4 e5 Z& H
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
: r. y6 C$ u# o0 u#define OPT_TCINTEN_SHIFT                   (0x00000014u)0 \0 N3 h' |+ ^% U9 x$ u

7 |4 H# G2 D# B9 B/ y6 P! ?char ping_buffer[PING_PONG_BCNT];
  _8 @! w$ m9 s# L. tchar pong_buffer[PING_PONG_BCNT];
& |/ T0 A% r" Q1 g5 X0 p5 f
" W8 y: _5 g+ C7 e+ t" B' s! Z) l5 J6 e3 c  \# [6 S4 P; u; F: t

. ~8 `3 [+ C9 \, l9 F9 [( A; w, H
$ @) h7 u. G* Z0 @6 M; Istatic void ys_edma3_init()5 B- e5 Z: n' z, \. u/ A1 u/ e
{# `9 t- ?8 L7 u/ \: R
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 o! T- C8 M% _! V* H7 \' L7 x        EDMA3_DRV_Result result = EDMA3_DRV_SOK;* O' e! j; x9 Y6 Y- y
        EDMA3_DRV_Handle hEdma;# U- R3 K$ |2 u
    uint32_t chId   = 0;
, e3 n/ d( @) I. {; t; T6 S. d    uint32_t tcc    = 0;
" [7 c% n. X# c3 s) X$ @1 u3 H* f! S
    print2arm("edma3 driver init...",0);
* Z; d/ g  O/ w1 k+ K
+ a9 ]' F$ X+ S* p( _# R        hEdma = edma3init(0,&result);$ J9 E( M$ F# E7 b7 ^; b. Z; e
        if(hEdma)
+ [2 p9 r7 f4 C4 V/ y        {8 c0 {6 ?, R! V4 M+ u
                print2arm("edma3init() Passed.",0);
7 C# V! \( \) P$ P- n; s  m3 J        }
& j9 V3 E4 D1 F: i4 v2 a        else
) g/ w/ t. I# c% q3 A        {6 s4 d' H' Y& r9 `9 h2 O7 y
                print2arm("edma3init() Failed.",0);8 G  o$ ?! B: A1 I2 U
        }
) h- F7 w, B: y8 d       
& |0 R; V5 @$ g        if (result == EDMA3_DRV_SOK)' H) I9 J# c2 @% E9 W
    {
& ]: Y$ |, @, o7 E: y% C) c  f) s                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 W% W" H* S9 g6 L9 I7 V: M1 W                                                       (EDMA3_RM_EventQueue)0,
* D- }: I) A8 j7 M& i                                                            &edma3_isr, NULL);  Z) A* N# c  L- A
    }/ N, X$ F9 M& }3 I& J8 I9 N! q
       
% n; @: S( p6 m. i0 U        if(result == EDMA3_DRV_SOK)
" O, `9 ^' @6 h' q3 c        {
( h" w# o; m9 P2 ^" b6 Y                paramSet.srcBIdx    = 0;9 S* D. u3 e1 [$ Y
                paramSet.destBIdx   = 1;
$ g# a" S4 `# z! V' `+ N                paramSet.srcCIdx    = 0;
! b! m  q7 b7 J- |' y                paramSet.destCIdx   = 0;$ i8 Q0 C3 x* z7 _
                paramSet.aCnt       = PING_PONG_ACNT;
& f) @, T# ?% f6 ~3 ]9 S" k                paramSet.bCnt       = PING_PONG_BCNT;
! _( g' x! V1 t% I% q; E; I9 X7 j( V                paramSet.cCnt       = PING_PONG_CCNT;
* ]; C/ N5 g9 k/ p% q' {, j                2 ~" @: @# b: o1 b
                /* For AB-synchronized transfers, BCNTRLD is not used. */8 M/ E1 J. s% p5 V- K9 ?" V
                paramSet.bCntReload = PING_PONG_BCNT;
  N4 o$ h& y9 C8 [4 f
9 S. O; Q+ ^/ J; v4 ~! V                /* Src in constant mode Dest in INCR modes */
, c! ]/ i( C" k3 f  s3 z                paramSet.opt &= 0xFFFFFFFDu;  c' ?$ l* J" }: D& f6 K  k+ S+ @
                //paramSet.opt &= 0xFFFFFFFCu;
8 j  i6 L% p- L                - W- z- u: Y: C, l$ z
                /* Program the TCC */
/ t1 n& S" q9 O' o8 P9 w  ^* N                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# f+ c( h6 ?# u
& |: k! X6 Q6 E& Q/ q3 n3 S. F3 |                /* Enable Intermediate & Final transfer completion interrupt */! s6 l# g8 w5 u
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# ?: O; T3 j/ q" q" {. }5 I
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 d4 A: R# I. u, I0 T$ G! B7 N" c  ?

; o4 L5 S/ q0 ?1 ~2 N  h; J                /* AB Sync Transfer Mode */6 u% X- U" ^6 W: o! l9 A  b0 c
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 b* h! A  s# C* J               
& f" |# \5 S" c( v                /* Program the source and dest addresses for master DMA channel */
' ~4 m! Z6 A' Z. I1 e7 E                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
9 K1 ?4 i0 F! Y% T6 M+ v+ P* n1 L5 \                paramSet.destAddr   = (uint32_t)(ping_buffer);9 h+ G; ]9 p! n/ r. \
+ t, {" v5 e3 p1 }  g4 x4 S
                /* Write to the master DMA channel first. */6 S9 i# X+ N7 s( Q3 a
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);8 Y1 O5 ]4 h. [* v, e) q( J
    }       ) m: P. e5 O% U% b1 k( n

+ l2 x; M. c1 K2 z/ O: j  d3 L        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& k  w7 s8 _: N; ]. Q; L( r- M5 J
        4 O* w7 ?/ `/ [. n$ k6 g# g3 k
    if(result == EDMA3_DRV_SOK)
1 ]% g) Z5 B9 t    {
* h/ U" F- t$ A0 s9 `- z) [            print2arm("edma3 driver init success.",0);
2 ~4 \- n7 t, u4 K/ u/ Y    } 4 I7 S# R3 i1 {7 n5 Z. h% ^7 H- }
}
, B4 n3 y/ Z% c! A9 \. T6 M$ a
+ M0 \8 ?3 H+ L% G0 q! `5 A) O8 N2 \
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& s, m3 {' X4 Q% [  {  M  r
1 g/ w  Q. m3 J4 J. R1 `0 h
0 _+ _0 M; h5 G# e
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47( p- ^4 Z2 I1 _
每次DMA传输完成后都要再次使能传输

  @1 x- A$ o/ s+ l+ q6 P$ I) R原来是这样,我明天去试试,谢谢了!




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