嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( E' J1 O% E  n8 t' u6 {#define  PING_PONG_ACNT          1
( t  f+ ~5 Q7 B/ P7 L& k! O#define  PING_PONG_BCNT          8*32*40 ( L- ?. D% k* k  \) ^0 Z
//#define  PING_PONG_BCNT       1
: S- a  p) F! h0 w4 }#define  PING_PONG_CCNT          1
: {  y; r! e) l, J( v#define  MCASP_BASEADDR          0x01D00000  n+ A, y% k$ X4 j+ r# x: w
#define  Mcasp_RXEVENTQUE        (0u)+ d- ]3 y1 h( C  N1 K

1 k+ E( j7 r8 A8 ?/* OPT Field specific defines */
- R4 T" j8 z7 M' p( O! n- }#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
1 k" S; n: m2 Z# r+ X#define OPT_TCC_MASK                        (0x0003F000u)* G  R. i  J5 Q
#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 y2 S& N" p1 @0 u! p( F#define OPT_ITCINTEN_SHIFT                  (0x00000015u)% \+ ]) I0 {+ J  a8 P  ]/ `
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
; ?+ d: F# D5 L" b0 x, i0 g- [8 B8 n8 a& F9 T  p
char ping_buffer[PING_PONG_BCNT];4 |8 e* Y$ F0 I. c
char pong_buffer[PING_PONG_BCNT];
% ?$ D4 ?  V0 i3 V6 w8 ]7 e- u  Z5 o# M5 D; {

8 P( d" z6 ]5 u5 ~
7 W  }; M1 \9 l
( k% \: G) D% ]2 C, V2 r% `static void ys_edma3_init()( f- M& W0 w( \) x# {
{
+ F4 h9 y% e' A9 f& k        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; T4 q  v" O; {) O2 {8 |4 M        EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 k. s' H6 ]7 B9 \
        EDMA3_DRV_Handle hEdma;
2 K8 T$ D, d5 d% ~4 q    uint32_t chId   = 0;
# G2 J0 `4 {- n    uint32_t tcc    = 0;0 k# f7 h) x4 G: F' A- T$ D
$ F7 `+ U+ u' ~
    print2arm("edma3 driver init...",0);8 H) e2 x( S% e' F

6 R1 ]& i" X8 C1 v# V& @7 E        hEdma = edma3init(0,&result);
. G# S+ K" ^4 N% o        if(hEdma)
) X, r1 S$ U4 p, Z  ]        {$ a7 w0 g7 _( ?* c: @
                print2arm("edma3init() Passed.",0);2 m  b+ T4 H' k8 }8 {- C
        }: _# m% O0 S3 }# k$ ^2 C
        else
4 t/ @9 T+ g* N4 `+ D' I  Z        {
/ ~0 h" z/ U& I5 w0 p- I                print2arm("edma3init() Failed.",0);
& R7 ]2 Z- w' m/ U- Y. l$ X+ b        }
  M4 x% M9 A( d' ~9 D, _3 l7 Y       
$ h5 [: d8 \; F) I( _9 Q        if (result == EDMA3_DRV_SOK)% I5 l4 p4 l5 T( A
    {% [; b" m5 q+ |) q
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; K0 U/ `6 j. v5 s' u
                                                       (EDMA3_RM_EventQueue)0,
, h) h+ X2 J. h; S7 \' y                                                            &edma3_isr, NULL);8 A9 K# O5 n) q* ^: x* i# i
    }
" P7 P7 I( \$ y2 e6 N. c       
) a+ h. t7 f) [" [* t* o* k        if(result == EDMA3_DRV_SOK)
( M' o0 @1 |9 \* ]$ T        {
. J+ y; h! p3 |9 g* h                paramSet.srcBIdx    = 0;
2 Z4 }" K6 f+ f3 M, p7 F6 i) X                paramSet.destBIdx   = 1;; \. h5 p5 h( j3 X2 i6 l
                paramSet.srcCIdx    = 0;* v* M7 Z* D3 u' C# _
                paramSet.destCIdx   = 0;6 q7 N2 N! y% H' \2 Y( T& X: S
                paramSet.aCnt       = PING_PONG_ACNT;0 n4 K) J# \- H$ I1 m; H" A
                paramSet.bCnt       = PING_PONG_BCNT;
, A" q9 g4 ^3 k6 R& m" K: x                paramSet.cCnt       = PING_PONG_CCNT;
5 j  ]; E, O/ d& H               
4 A: E6 i6 h: P9 e' i$ K" X% t                /* For AB-synchronized transfers, BCNTRLD is not used. */
) A: P7 A$ g6 B# c& O                paramSet.bCntReload = PING_PONG_BCNT;$ O6 w5 H7 A2 U$ l

5 _9 l6 U3 [, E5 \8 H                /* Src in constant mode Dest in INCR modes */) X) I. ], \6 `( e) }! V- l3 g
                paramSet.opt &= 0xFFFFFFFDu;) }9 ~/ R! X) \. {6 S) [
                //paramSet.opt &= 0xFFFFFFFCu;
4 y2 E6 f7 a9 f% |2 t                0 @+ i# b+ m& k
                /* Program the TCC */
& C. @. J+ s! {; n$ p! M+ E7 [                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
  _9 m. r% l. a" Z
! y2 j4 @. z" g3 Y1 u7 B0 S                /* Enable Intermediate & Final transfer completion interrupt */
" Q3 Y( h& |, O0 ^                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- a/ W! k' c" w$ m' b: Z1 t% a
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& e0 j' l  _- C4 x- F* r$ _
4 h+ D0 Z7 c/ K) F$ U                /* AB Sync Transfer Mode */
2 f6 [2 n' v, |) r8 m                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ `& v# w- t% K0 P% ^* b
                + `1 X* ?" W, k
                /* Program the source and dest addresses for master DMA channel */
3 g6 I4 d' e0 G$ N- Y                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
) @+ o& l! i& b! k* s$ Q                paramSet.destAddr   = (uint32_t)(ping_buffer);
6 V( Y+ Q6 Q) s" ]1 w3 f" S. s# k& S& i( k# g) j: |. t* k
                /* Write to the master DMA channel first. */
/ u6 M  {1 X3 @# \! b7 \; J: }' B* ~* R                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( c( j6 s( O  h
    }       8 m# J3 D; o: c$ n  ]- N
0 a4 d; V/ N: p# S+ H4 x
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 ~$ w5 E# Z; t: C0 _+ V       
3 W8 d# Q6 w2 w; R* r) @8 J    if(result == EDMA3_DRV_SOK)
- q5 E2 M* T* }  M+ m$ v8 H  z    {# r4 k4 S/ l0 q# a: z
            print2arm("edma3 driver init success.",0);
3 w! O! k. ^) k. a* J, ]    }
( U' q* C" g* ?* h5 A}& t' b' R3 {9 e5 Q
9 L# y. P9 |4 V+ [8 v* e  B

* E9 f* q% D! }4 C/ kEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 w" U3 w4 Q$ c3 D% b# y5 V  A" r1 j# T! x, {

1 h) S5 L3 v( x% [7 x4 J# h
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 b3 o# J- e/ h' e  m8 v每次DMA传输完成后都要再次使能传输

8 x7 ]: B8 e/ |. I+ t原来是这样,我明天去试试,谢谢了!




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