嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ @& {' G% `. p0 H" h#define  PING_PONG_ACNT          1
. F5 Q1 J1 }) y, F. x+ w#define  PING_PONG_BCNT          8*32*40
9 F# E$ z! s' S, i//#define  PING_PONG_BCNT       1 / y$ f: y) k1 u! C' v  C
#define  PING_PONG_CCNT          1
: k, _) k4 b1 N3 I1 N" S" _#define  MCASP_BASEADDR          0x01D00000
  ~& O; {9 F- K+ B# B4 S  T#define  Mcasp_RXEVENTQUE        (0u)
% m$ S* ]3 F5 G" e) X; N
1 |0 o+ m" s5 ~8 c" ~( X/* OPT Field specific defines */
/ V2 W$ F' a: e( h#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" h0 M# A2 f* `3 L/ N% `#define OPT_TCC_MASK                        (0x0003F000u)8 i! w  U4 W* r# U2 T# S  i
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% s( I0 c( N2 P#define OPT_ITCINTEN_SHIFT                  (0x00000015u)" @4 z* D, H. w1 S5 v4 a
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
* H. d# y9 e& w- g5 J- B# X1 j+ O. H9 e. V
char ping_buffer[PING_PONG_BCNT];+ r( l$ s: T" z1 a1 G, Y; A" ~
char pong_buffer[PING_PONG_BCNT];# s- J$ G! `; Q/ e
+ H7 a, J  ?8 D) R% n$ V: s- s4 J
8 y: Q9 a; `3 P- E: v

9 `1 U# ?' J# m+ O/ \
! y1 p  V; h0 j* fstatic void ys_edma3_init()
# j5 l+ ^+ q, J( W# S3 g) J# K' s. Q{: m* F$ R4 `  b: \# _
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% A$ ?& F  o7 _$ x; R5 W
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# ?9 b5 p9 Z) m        EDMA3_DRV_Handle hEdma;
+ W: Q% {1 ?  J3 L    uint32_t chId   = 0;
* q0 A! X* G; F. j7 ]    uint32_t tcc    = 0;
/ ?* |. f! u( N* Q! _4 g" m/ n! @& m& x) X8 U  J3 o1 T' D% }
    print2arm("edma3 driver init...",0);
  v! r3 l; M- c* G2 e5 s: u
8 ~% L/ `6 z5 I$ y7 F- C  m8 Q' g- I        hEdma = edma3init(0,&result);2 E8 Q7 f: W+ f1 w1 o# s* y
        if(hEdma)- A" r6 g2 P; ^& ^
        {0 q  g) \  i, o4 H
                print2arm("edma3init() Passed.",0);
6 r6 M4 h5 B% L# V' {! W        }. c' G/ ?5 H6 G  V, k' a
        else
% x) e! N  Z& Z/ t& R! A' |        {1 ~4 h: u. Y1 h9 N
                print2arm("edma3init() Failed.",0);1 o7 _* B8 C* g
        }
. L6 |: K/ G% Z  z, B       
! T2 s2 A6 h3 g+ E4 `5 d1 N        if (result == EDMA3_DRV_SOK)
, ^# T4 k5 b2 M, u7 F/ x4 j3 Y    {& L* o' J' N$ X
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 }& g3 O) V  b, E6 n# m4 q                                                       (EDMA3_RM_EventQueue)0,& k2 k8 b  d- o3 @7 N
                                                            &edma3_isr, NULL);0 o/ G4 F2 c4 P, v; k* O
    }- ^4 y2 {% k) H+ K' y9 x
       
( S/ b% q* ?+ L% p        if(result == EDMA3_DRV_SOK)
) R; U9 K4 ]$ o1 o! T* _        {" g3 a8 l: p: q
                paramSet.srcBIdx    = 0;
+ J" r. F) h* N, J                paramSet.destBIdx   = 1;
8 X+ M5 H7 Q& d- j0 _6 x5 @* q                paramSet.srcCIdx    = 0;4 [2 `( ^$ k- P( T
                paramSet.destCIdx   = 0;
3 S7 |; V' T6 I, M: X; A& y                paramSet.aCnt       = PING_PONG_ACNT;
! D- G# [( h! ~; P: N                paramSet.bCnt       = PING_PONG_BCNT;
  j2 [2 v7 D: C' z                paramSet.cCnt       = PING_PONG_CCNT;. U/ O8 S! f, `3 ~: W# V; G
                8 e: C5 |5 \, `+ [. |( t8 J8 D
                /* For AB-synchronized transfers, BCNTRLD is not used. */' S9 A& Q! p( k6 I( u6 u
                paramSet.bCntReload = PING_PONG_BCNT;
. K: `% |, l0 G1 H: I# x- }! Z6 E& a/ U: }0 f
                /* Src in constant mode Dest in INCR modes */
) G9 p6 `3 x% R1 u1 h                paramSet.opt &= 0xFFFFFFFDu;# e! \& C9 T4 L- x0 o
                //paramSet.opt &= 0xFFFFFFFCu;3 m8 W5 M/ B6 k+ }
               
7 \+ D" S. X% F; a: D                /* Program the TCC */
& C' I5 i* s- ]$ h  ?, j' x/ L4 M) u                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);7 P5 e8 G& U7 ?! @% O6 s$ \4 j

, |+ ~6 u* Y9 k' N  @3 H                /* Enable Intermediate & Final transfer completion interrupt */
8 ]4 x! k  V- n( G( ]9 O" `                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% Q  y* p7 u; i; L- \( _                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% U( i2 M/ S1 Y" q% a/ K% ?
2 F% V. h( h; K/ [* c                /* AB Sync Transfer Mode */$ D, N3 Z' c# V) g' q, B- l# o
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 }, T9 N$ X- F$ C- f, s* f               
* A; [1 I& o9 S% A5 h7 J+ z# O( F) F+ n, L                /* Program the source and dest addresses for master DMA channel */; c" R$ u( G% g
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);  b7 h  J6 s  ]6 i7 R4 H$ V
                paramSet.destAddr   = (uint32_t)(ping_buffer);7 Z* S3 k  K/ ?$ m
: x/ o3 h5 _: {' J5 l
                /* Write to the master DMA channel first. */# V  N( h! l" \, d5 y" o- q; ~
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
% i/ U% G9 V) F9 Q1 j    }      
- J; ~# \4 c' g8 V# B
4 n  g3 H4 E- M: R! S        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 v3 n$ L) ]) `; \5 M+ h6 b3 M       
' C# X2 H) B  y1 F8 i    if(result == EDMA3_DRV_SOK) & f/ L: |9 S& ~4 W- H) z- ?
    {, V- s1 O+ L0 }; U5 _
            print2arm("edma3 driver init success.",0);8 E: l: O+ l) j! [
    } , P9 n' P) [+ Q% q0 H
}3 o, u& `, p: i' R# |
0 \  M6 W% ^' k0 R
7 @4 d" N" h' u+ @8 j$ t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* I: r3 ^: v. a( e+ f
# p8 z* I, ~& P- I

  V7 a: \" V* I' O& I
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47# ~% }1 V% |" n. @/ n* C% B# J
每次DMA传输完成后都要再次使能传输

! ^- x8 H3 `* y原来是这样,我明天去试试,谢谢了!




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