嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& K- T3 F8 |1 P2 A! u#define  PING_PONG_ACNT          15 e" n2 d$ t3 z. F! p4 n5 ^2 h  u! p9 _
#define  PING_PONG_BCNT          8*32*40 . f2 i1 T! s) y4 h
//#define  PING_PONG_BCNT       1
1 R4 L9 i  l- \#define  PING_PONG_CCNT          1
( \9 i/ h& I+ _3 j' k+ B# P. I; Y#define  MCASP_BASEADDR          0x01D00000! A  n' T4 D7 u' s
#define  Mcasp_RXEVENTQUE        (0u)/ l9 W0 t4 Z' q5 l
. n/ C" }$ h8 v
/* OPT Field specific defines */
- X2 z7 j1 K, \2 Q' I  l9 `8 P" E#define OPT_SYNCDIM_SHIFT                   (0x00000002u)3 u6 w( @( S/ e4 e9 h+ Z
#define OPT_TCC_MASK                        (0x0003F000u)
+ J9 w$ g9 W2 U/ D/ q# c" f#define OPT_TCC_SHIFT                       (0x0000000Cu)& y+ \9 Y& D8 c9 C2 P/ y
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ c! n9 }7 G8 {. a' P
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
- N5 Y' e# j' p/ h2 I# X, I2 [: k/ D/ }- }* ~7 T9 y
char ping_buffer[PING_PONG_BCNT];
5 w2 x5 |4 j# n% \, schar pong_buffer[PING_PONG_BCNT];, G* J: {5 J0 M1 ^: y5 k
! o% v, u) K2 N6 n7 s  X1 R+ T* r
% M" [* W# W3 ~) s' u
- z# a! C7 o; @
5 G" I  K/ h0 J- V7 _
static void ys_edma3_init()  E- H" s# D3 c- [3 ^
{
4 X, W2 b# A& O  A0 i: @5 K        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* E* {& R9 Q4 p; j1 ?        EDMA3_DRV_Result result = EDMA3_DRV_SOK;! a, g+ P. ]) K
        EDMA3_DRV_Handle hEdma;
$ r! \* ]$ W1 y5 A    uint32_t chId   = 0;8 a$ k; I8 P" I5 Z2 ^8 f2 R
    uint32_t tcc    = 0;
! w+ L& p$ f) V  G8 N* t& I
) p( w# U* y& ]    print2arm("edma3 driver init...",0);, n0 r* Y, f9 b" V2 p% y
, i! x3 n3 O, I8 N- w4 ?/ H
        hEdma = edma3init(0,&result);
$ R2 y8 a% S% w9 i        if(hEdma); D/ k% l: G( j* B
        {0 P- C% B# r+ k
                print2arm("edma3init() Passed.",0);
1 b( }' W  Y' l% x% j        }. l) f5 C( Y8 X- C7 ^: B
        else3 }/ }! h9 b  C( E( x" I: ]
        {
  z) ~( P. b, t4 z( r5 L                print2arm("edma3init() Failed.",0);/ p( X: I" e* B1 l
        }
' y5 Z! E. J& k4 j2 f$ q# g       
/ s) o& N# Y0 r# p+ h" c        if (result == EDMA3_DRV_SOK)- W- j% o8 i) z! u" k; G5 K, |
    {: _9 I+ z. W+ O& E) G6 R" S; \; d
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 I5 P' B! q* u) P+ L1 b                                                       (EDMA3_RM_EventQueue)0,
$ V0 e' N3 H4 T8 v; K( `                                                            &edma3_isr, NULL);( z3 y% d/ L; B  q" T3 L
    }
& }  g2 x( q" i8 E8 m0 t: S' L        8 N* ?& H- D+ F3 W! h' x
        if(result == EDMA3_DRV_SOK)
) \2 ?% d- i: u* {1 m        {
- P# K4 A. N9 |3 P" A9 C, E                paramSet.srcBIdx    = 0;
1 Q$ l" {( T9 {                paramSet.destBIdx   = 1;5 J4 v1 }' G9 l5 Q6 b
                paramSet.srcCIdx    = 0;
' N$ n- ^1 E: r                paramSet.destCIdx   = 0;
! d7 b: y' P" Q8 i% q                paramSet.aCnt       = PING_PONG_ACNT;3 y. w2 g# G! d
                paramSet.bCnt       = PING_PONG_BCNT;
+ [, `; P4 F) m                paramSet.cCnt       = PING_PONG_CCNT;/ ^- L) ~7 K! }% k2 X
                , z- O* z( Y! X+ M' x
                /* For AB-synchronized transfers, BCNTRLD is not used. */. Y5 _8 l) h/ h4 _, @1 A
                paramSet.bCntReload = PING_PONG_BCNT;
; E7 S4 x6 f5 r4 U* m' f* d( T/ n0 ]9 j
                /* Src in constant mode Dest in INCR modes */
* x8 D( e% P: K$ ]$ E3 @                paramSet.opt &= 0xFFFFFFFDu;( }% y- w" u: o% \+ q# n  r
                //paramSet.opt &= 0xFFFFFFFCu;5 h9 m! w7 s. Q' C; A- R
                / Q9 A& l$ C- n. h5 W: e2 T
                /* Program the TCC */
& A# V' y4 R5 y                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 m- `' l! S( [( P& i4 P, k6 ~
  Z3 v6 n3 e2 Q3 d8 {0 I
                /* Enable Intermediate & Final transfer completion interrupt */0 Y- ^1 g7 w( g/ ^: Y
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( R+ d' p0 J1 b( F0 r4 f/ E; t                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);5 T# P5 F% {* x/ D. ~; a' C- W

  P  E7 W) e0 `2 k                /* AB Sync Transfer Mode */
* a  p8 L, @& j: p4 J                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 G" u0 i. |2 s7 ^7 _
                . f; H! J( Y  X( g( ^, @, I
                /* Program the source and dest addresses for master DMA channel */. v5 z9 Q& U: y4 c$ x! @" ~( O
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);/ _3 c" E, c1 N- k
                paramSet.destAddr   = (uint32_t)(ping_buffer);0 r# o7 c1 }& W) L3 d
9 b0 T. s$ Q7 i4 I, B
                /* Write to the master DMA channel first. */
3 _; k6 Q7 G! T! q# \/ c                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" ~5 B4 R/ y- x: J2 R) u2 g
    }       1 S7 B: \+ w6 K- r  ]( k5 [( h

1 _6 }$ S/ [- V/ r+ D8 a- a        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 \9 }4 f" x- Y
       
' `- U# a) w. j" K6 @8 e    if(result == EDMA3_DRV_SOK) 0 [( s0 h  j( B% R9 c4 Q" Z
    {
! t' B' u# G" u0 a& A) ^8 w; M            print2arm("edma3 driver init success.",0);9 }- \' x* x- _9 S: Y
    }
0 U  r) l/ R3 n# ^+ f" v. v}8 t# d. {) |( h

1 ~% Y! r& S5 v! z, x0 }1 H6 K8 V- z
" v8 V& g) h2 b% P: T" [% z  LEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" N$ N- G0 y0 {
' a8 l0 m; H- U. S; v( F- J
, v' q7 l: Y% @  q1 @

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 ]. z3 j; g. G0 v" ?. T+ R+ ^- ~
每次DMA传输完成后都要再次使能传输

" U1 i( B  b. ~原来是这样,我明天去试试,谢谢了!




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