嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, A2 ]& h$ {, O+ C# [3 c% I#define  PING_PONG_ACNT          1
4 ?# O6 f* p& m2 k; B4 Y+ b: G#define  PING_PONG_BCNT          8*32*40 % o- I) F. v+ \2 G+ i+ W
//#define  PING_PONG_BCNT       1
% g( `4 B, H5 p1 \9 _#define  PING_PONG_CCNT          1" G: Q+ z' A+ {7 I; y# ^% l
#define  MCASP_BASEADDR          0x01D000006 E8 L; t6 C$ L; S8 [/ I3 U
#define  Mcasp_RXEVENTQUE        (0u); z; g0 U; o1 d' `1 c. C& G

( }& [' h, T5 G) @& O/* OPT Field specific defines */2 a9 S- ]/ u. [# K
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
/ c# c: i& p; I1 p! m% j' }#define OPT_TCC_MASK                        (0x0003F000u)
1 T7 V7 x3 {( _7 R$ c+ W& b+ H#define OPT_TCC_SHIFT                       (0x0000000Cu)9 U& v1 R" [0 E
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)8 P7 x2 `/ j- X8 a$ x
#define OPT_TCINTEN_SHIFT                   (0x00000014u)/ K- a3 A& ^0 t5 K

0 c. j) D9 E7 b1 d7 S9 M$ W. p3 i; lchar ping_buffer[PING_PONG_BCNT];0 C3 S- z- i" G, p' E# x
char pong_buffer[PING_PONG_BCNT];
, ~: |* Y3 a  f& b
% b0 C% U! i* m- G  S  P2 m7 M. g! w$ `& c' \6 x2 f+ b
9 ?  |- k1 {5 x& g5 [  J; \$ G

' l: f; v' l2 F3 I) |4 C& W% @. pstatic void ys_edma3_init(); j* |/ `' _0 r( d/ v8 Q4 K
{* O# ], Y, d7 X& H2 E) \
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" F3 i+ K4 t2 Q9 u' U        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 w4 ^( o  ?' n2 t7 c( Q        EDMA3_DRV_Handle hEdma;
; Q& J+ ^  A! W; n- s2 ?* q3 s    uint32_t chId   = 0;1 [3 f: _; n/ _8 p
    uint32_t tcc    = 0;1 S2 v; \  T4 C

! g5 z+ o9 ~' L6 D3 I% m5 _; z: o    print2arm("edma3 driver init...",0);6 o+ t! \( u2 [0 {
# E% r2 |: e+ G' Z) K8 Q6 E7 l
        hEdma = edma3init(0,&result);1 {, x8 a& r3 M' j
        if(hEdma)* V+ V3 w$ X6 f' R3 Q/ ?6 k
        {
9 @- R- R/ p* G9 b5 ~8 b                print2arm("edma3init() Passed.",0);
8 b" h/ `2 x) P7 ?, z* b) I        }/ n+ l+ o% ?: }, k
        else
, s) Q3 ~, ^4 C; J; i( e& O0 X        {5 E9 H1 P7 c9 {: l
                print2arm("edma3init() Failed.",0);9 i$ A' D, [: X( ^
        }4 k, E1 C3 Q: N) O3 x! R! a. u
        - x) B- J- k4 \2 y& a
        if (result == EDMA3_DRV_SOK)# M+ v2 G" B4 V5 k" M1 ]( V- ^
    {
) g7 r4 `- s6 [' Z' |0 i' s8 W- M                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ n4 a* w: z3 f1 C3 F0 I% `                                                       (EDMA3_RM_EventQueue)0,) `) C" x/ U* Y1 U
                                                            &edma3_isr, NULL);5 f! R' A& _; V% r4 S6 W
    }
) ]$ ?- k- D" N1 _( T        4 ~8 J8 H/ W6 Z- }. N
        if(result == EDMA3_DRV_SOK)
# A, J& u7 X6 _3 a! Q" Q7 I5 w        {
# A9 ]2 T5 |) L( H8 ^0 i                paramSet.srcBIdx    = 0;
5 ^6 x6 o; D4 S; W" j                paramSet.destBIdx   = 1;
8 a$ r3 @3 N9 x- p% |' i$ E6 [                paramSet.srcCIdx    = 0;0 W, D+ ]. N7 B# N
                paramSet.destCIdx   = 0;: y& @+ I5 y, W. s0 I
                paramSet.aCnt       = PING_PONG_ACNT;/ e2 ~& h$ G* I5 c( O* E' M  G' b
                paramSet.bCnt       = PING_PONG_BCNT;2 s& q# ?$ P7 [
                paramSet.cCnt       = PING_PONG_CCNT;: I% b2 a, T" U) ?& u9 ]/ a
                , P. G& ^* ]+ b( k/ S& ]
                /* For AB-synchronized transfers, BCNTRLD is not used. */
# m- G& T) i' _                paramSet.bCntReload = PING_PONG_BCNT;5 j/ [* R; i. T7 j& Z
; B" O5 r2 Z# z: Y: s5 Q
                /* Src in constant mode Dest in INCR modes */2 {9 i  O- Q9 X1 n8 [& C
                paramSet.opt &= 0xFFFFFFFDu;
, S. K6 i1 B  K  Y+ J3 y& b. z                //paramSet.opt &= 0xFFFFFFFCu;% v6 ?. I8 H& s
               
& a' S% ?4 F- v5 S* `! o                /* Program the TCC */0 I9 c3 `$ u- e2 o$ ^
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 o: Z9 h* r  F* _: r* j; z
1 T% |+ h/ R8 O+ Y7 |
                /* Enable Intermediate & Final transfer completion interrupt */; n* @- C* H# s& w9 A+ x
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' ~" L- ~% e- h- Y3 P  E5 U& ]1 z* P
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 x: Z: x* D4 g: {! w
1 R% N% z7 F! [8 s) E3 c* x& a7 T
                /* AB Sync Transfer Mode */
  L  n% V$ C6 \; P* f                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; k- I2 C! a$ V- }
               
" H+ E6 o4 U1 f) w; {  r                /* Program the source and dest addresses for master DMA channel */
  m2 H6 ?  w( A1 W% K/ ^+ L                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);8 ]  C, R3 }0 j
                paramSet.destAddr   = (uint32_t)(ping_buffer);1 H: N$ e' o1 M; x3 i8 f% _2 e

  I) b# F. `+ ]2 A  B' G0 u                /* Write to the master DMA channel first. */& d/ R& Q+ ~. A+ E1 T
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! G. [  |# C  k3 K" K    }      
3 Q+ l4 k4 t6 E+ B$ B8 k' H) k* F4 r) K. i
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 G, m- F! Z8 w5 Q8 h' }        ( v$ ~0 y5 u7 K
    if(result == EDMA3_DRV_SOK) : t. o/ F" h- d' K1 v
    {! _9 E! \' x8 F9 H
            print2arm("edma3 driver init success.",0);5 v$ B: u" L- f
    }
) s) S7 I$ {2 R& W/ ~}/ j, t- I0 ^: l, v: G% w2 [* {# `

3 X1 e! l- N3 R( l
5 Y" N+ h& x$ d9 rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* Z- g9 n# F& d
; A' w6 T. d2 s( u) _4 m
, @6 p2 ~! Z2 K  Y2 C4 ~( l* ^
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ m- h2 L8 |8 H. a/ ~$ }每次DMA传输完成后都要再次使能传输
) G' D, U; t/ {8 q! e
原来是这样,我明天去试试,谢谢了!




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