嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! U1 L9 f4 e) E9 j#define  PING_PONG_ACNT          1
: a. [, E1 w$ V% {2 J: ^#define  PING_PONG_BCNT          8*32*40
$ s, o& J9 v$ v0 s& c% M( m//#define  PING_PONG_BCNT       1
# u' G0 k/ b; D) [3 A6 D  F, V#define  PING_PONG_CCNT          1; Y: a4 B/ Y9 F2 d+ e% z
#define  MCASP_BASEADDR          0x01D00000
1 m9 ^( N6 O4 `$ D#define  Mcasp_RXEVENTQUE        (0u)
9 N* A" ?2 u. m* m0 v8 h: z* z- L( Q9 _) W+ r/ A1 @
/* OPT Field specific defines */9 n9 J- N/ g$ \- k& P: |0 ]
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)3 e# _8 ~+ o9 M
#define OPT_TCC_MASK                        (0x0003F000u)- j+ G9 v7 c/ Q; ^0 N
#define OPT_TCC_SHIFT                       (0x0000000Cu)
) c+ Z; r+ w1 d! p#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 {+ d6 x5 r+ r; u: \7 l
#define OPT_TCINTEN_SHIFT                   (0x00000014u)) `1 F$ N4 T: O( a
0 }$ V% G  h& Y8 s1 [
char ping_buffer[PING_PONG_BCNT];
- D8 m) b+ s: r. J! P  fchar pong_buffer[PING_PONG_BCNT];) I9 V  c$ l% D% X5 {3 m* c7 Q/ Z
) n8 n2 U3 X, k8 S

$ E. \; f) Y6 ?9 @& a6 g
* c( R( N* N' j" K& G! ?
5 N$ |1 {# u, V9 E0 A' k2 Wstatic void ys_edma3_init()
( ?& x1 Q2 }6 h/ e{
- U2 I: s  D; S8 |" j6 r% a3 E" g        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# x0 `* J' g, K' W4 w! o- S        EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ M' z* @1 o6 s8 _
        EDMA3_DRV_Handle hEdma;: x4 O( i  ~% }4 c7 V
    uint32_t chId   = 0;, n, q( F6 @5 s: \- s
    uint32_t tcc    = 0;0 \) M9 V  u  o- y( q
/ }9 ?& m0 [& _7 ~
    print2arm("edma3 driver init...",0);
/ u/ ^& J2 H0 U) [6 J( R
) U3 F5 o& I+ V2 G$ o        hEdma = edma3init(0,&result);2 D# \  O' C% t* F! r
        if(hEdma)" G/ L& |3 I0 `* `4 I3 [: d
        {
. Q; ]6 ^4 O6 q: t9 p2 B  |7 }                print2arm("edma3init() Passed.",0);2 l8 J% |- ?7 o8 e9 t1 F2 A- X
        }
/ f" J* G6 y2 q        else- T( \7 ?0 s6 p$ d
        {  E" u. S" `- h
                print2arm("edma3init() Failed.",0);
9 h6 u) @3 }7 E; z2 s( Q3 C        }! K9 g" o& m9 l6 D( s/ D# F4 L
        ! G* j6 z- E1 O7 {4 V3 U
        if (result == EDMA3_DRV_SOK)
' ^9 }9 c1 t2 Q2 X) k    {4 W& C4 K/ T1 P! i/ N' g
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,: _" V3 q1 Z% G; [
                                                       (EDMA3_RM_EventQueue)0,, d+ H! }- u# I! G$ N
                                                            &edma3_isr, NULL);1 A9 C$ T' W: v3 D+ ?
    }, s6 t, T4 Y4 z( X0 f4 G) B% `+ c' E
        $ C1 q" p. A# y" m1 V/ n$ Z, L
        if(result == EDMA3_DRV_SOK)
  y& [, x; c/ ^) Z. Z9 e        {) Q" _  \7 x$ A' ?9 x; h7 a
                paramSet.srcBIdx    = 0;) W5 u3 O: P# ?; k1 l6 |( [
                paramSet.destBIdx   = 1;
& r. L' n. M) J8 j: t! h                paramSet.srcCIdx    = 0;9 e* N+ {3 H8 q! H5 Y1 g
                paramSet.destCIdx   = 0;' X4 Q: R4 p, y7 w. s0 \) g7 x( y
                paramSet.aCnt       = PING_PONG_ACNT;( }  H3 Q. O+ p0 W( J0 W2 D7 o3 e, E
                paramSet.bCnt       = PING_PONG_BCNT;# p! D! q  G' x. O7 l
                paramSet.cCnt       = PING_PONG_CCNT;1 o2 D) z8 G# g" v
                ! p1 O, f' Q- N% M; ?5 K: O
                /* For AB-synchronized transfers, BCNTRLD is not used. */; A# y5 _; p: g) Q: N* |. d4 ~
                paramSet.bCntReload = PING_PONG_BCNT;
/ o, a; s# Q! [* x
( P- V7 V$ V! h7 Y  _  t                /* Src in constant mode Dest in INCR modes */
# |1 B9 G" T+ g9 x$ o; B7 w                paramSet.opt &= 0xFFFFFFFDu;
4 l4 {1 k9 i+ \, R, b* _* N* |, a, d& S+ h                //paramSet.opt &= 0xFFFFFFFCu;, }5 _" D5 M  N; ~
               
, q& `6 W1 \& l6 F- R                /* Program the TCC */
% l3 N0 i. c8 F/ `& W                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! w7 H5 I5 X6 l) A) i$ r4 ~

- g7 A% n$ _6 z) R                /* Enable Intermediate & Final transfer completion interrupt */
# ^2 j! h; c; ?/ l1 B                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 Y. o' ~0 t1 r7 i; {2 C/ N                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- i- w+ @4 G& v" D2 H6 K3 A

; G# b( ^# [* @$ W% V* Y: l, L0 x- S                /* AB Sync Transfer Mode */
; ]' ^9 ?2 M, u                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ R& O6 F  t5 X" x+ t$ p                2 H  d1 \0 Q- a' c/ {% z  l# u% D
                /* Program the source and dest addresses for master DMA channel */# {! a! Q+ k, o9 o
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
3 `5 }% X$ l7 x& p; ?& g6 [" I                paramSet.destAddr   = (uint32_t)(ping_buffer);
- b# d& B- o7 N: M. X
/ h9 q+ O9 \4 a                /* Write to the master DMA channel first. */
" o: e2 v( |) N# x& X8 k, Y                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
; t$ r$ q4 Y% h8 ^) m    }       0 V6 v2 M" l: i, p" K

. ~2 f* Z$ O1 t; d        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& l# U& h+ O: A1 l5 t0 x  U        - i2 I3 x8 g3 U8 f
    if(result == EDMA3_DRV_SOK)
9 C: L* u1 ?5 ]4 O, U. Q6 W/ w    {
* q! Q: t& ~$ h            print2arm("edma3 driver init success.",0);
) Z  z/ a8 c, c    } ' B3 ]5 Z" R/ S9 I; e, e$ }
}
6 T. ~7 i$ c! v4 c% O+ M0 L/ }, f2 \2 V+ M" a9 d; j7 W+ c

* s6 u& B- X/ xEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 d4 h6 N) `$ V5 J* t1 i5 U
3 L: n  P1 Q9 I4 {$ r
2 t2 ]+ y; u( G( s; s! O+ \
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* ]8 C, n* x; f/ X  v* e2 G
每次DMA传输完成后都要再次使能传输
0 u/ S' Q; a6 t0 B6 L
原来是这样,我明天去试试,谢谢了!




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