嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 e& ~8 T/ p; i. m5 G5 D( F9 N#define  PING_PONG_ACNT          1
( j8 A# k2 x4 A. \8 a  p#define  PING_PONG_BCNT          8*32*40
# c4 c1 E3 ^: n5 t" y" N/ C7 ?//#define  PING_PONG_BCNT       1 3 W5 c5 P7 g& x8 g$ W
#define  PING_PONG_CCNT          1
9 C4 ?( {+ O# ~$ t; d) \- e1 q#define  MCASP_BASEADDR          0x01D00000' n" }- {7 R! W" b# O! j. O
#define  Mcasp_RXEVENTQUE        (0u)
6 C- W6 ~4 p7 D7 d9 u" d2 i# @) o6 R$ {
/* OPT Field specific defines */
% E9 {# X: e% e: Z9 J. ~& s; w% N#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& ], g# g$ g' Y. i
#define OPT_TCC_MASK                        (0x0003F000u)9 e$ l% x1 l3 ^2 ]
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% ?, J/ J: @4 W. l#define OPT_ITCINTEN_SHIFT                  (0x00000015u)$ k( [! M# a' J& m8 J- s% ~
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
! L( J+ u- Q" f5 J5 l7 @) v9 _
7 U# F! P5 H- qchar ping_buffer[PING_PONG_BCNT];5 r7 z/ }) ~( K1 s
char pong_buffer[PING_PONG_BCNT];& X& ~$ S! t3 w) m& Z: ^( p; ~& f

. y6 z) A1 c  q+ i% _6 c- R+ m% J/ O2 `: r: R

8 L7 N8 U5 y) i2 H0 j
% r/ N) ~* ~; C. e( Astatic void ys_edma3_init()3 V. x, \1 M1 f/ E8 k
{( _: Y. a. r4 |2 J/ z2 t5 p7 U2 v
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, @; }, u, S* P5 U  v3 S2 K
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 N2 v  V9 [( j8 s8 v. x* U        EDMA3_DRV_Handle hEdma;
  A+ C% {9 k+ A0 J# \! j8 Z    uint32_t chId   = 0;
. a' U# B. i0 b0 s% d+ y    uint32_t tcc    = 0;' T. Y  @/ ?3 [4 a) m* F6 P

1 `( N1 i( ~8 }% a) h8 \    print2arm("edma3 driver init...",0);
& |4 b  Z8 u9 y  ]  Y  m
# b& M5 m9 F# O4 ?& m5 G% v        hEdma = edma3init(0,&result);
- L5 ]3 f- A9 z# o) q2 D        if(hEdma)$ [+ T2 f- k# a& Q
        {
! Z5 K* u" E* I! \$ c! l3 U                print2arm("edma3init() Passed.",0);
! J4 }* v( V2 a. n        }
7 C+ B3 C4 @# c/ ~' H        else, c3 h% w4 l' |. A
        {
% e4 d/ K! w1 V6 m( j- n- P& c6 P                print2arm("edma3init() Failed.",0);' L: f/ A) f  T( g' u
        }9 N" j2 n4 I6 f% I4 _$ ~) u
        # }7 R/ x* k1 w6 `+ e1 k
        if (result == EDMA3_DRV_SOK)8 h/ ?  q9 ?0 o/ X6 y$ h
    {
" V! n+ X% y+ q2 A( }+ F                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,* P4 F& |; w+ r. L3 Q
                                                       (EDMA3_RM_EventQueue)0,
, @8 U4 R. E5 J$ d; T  m                                                            &edma3_isr, NULL);
0 q: M5 |$ x0 }7 m8 E8 ~    }0 o& |6 \- P9 [+ k
        * @% z8 j( A4 j  a& _
        if(result == EDMA3_DRV_SOK)7 l2 z$ o. s, ?& V6 T# r
        {+ j& w7 V2 t8 [
                paramSet.srcBIdx    = 0;# q! h- y! f- v
                paramSet.destBIdx   = 1;
' y; x. S2 R3 w  I4 o5 y7 A- A/ M                paramSet.srcCIdx    = 0;$ K( O1 J  R" ]' f( `
                paramSet.destCIdx   = 0;* [& d# P' m& Q! C% D& |3 r7 d& {6 s5 J
                paramSet.aCnt       = PING_PONG_ACNT;6 F. ?3 V7 ^7 \2 N
                paramSet.bCnt       = PING_PONG_BCNT;
8 H; ]: _5 U5 c! ~+ I! b                paramSet.cCnt       = PING_PONG_CCNT;
; [9 v4 D: g8 A4 X8 ?1 m               
+ z, X7 `7 s8 ?                /* For AB-synchronized transfers, BCNTRLD is not used. */1 T2 W( x2 A8 L9 j4 c; y- |9 s
                paramSet.bCntReload = PING_PONG_BCNT;
; Z; e" t4 L' Z" ?* a0 ?; Q8 `% p
: o: J/ n9 y: }1 h5 M& `2 `                /* Src in constant mode Dest in INCR modes */
. m5 X3 ]) ~6 @9 X* V9 i6 Z                paramSet.opt &= 0xFFFFFFFDu;
5 u/ _5 ~2 P9 |7 o1 r. E* J0 O                //paramSet.opt &= 0xFFFFFFFCu;) }2 U: T+ g5 \! K
                8 I0 i- {- V2 a+ H2 Q1 f
                /* Program the TCC */$ h( q) b0 W/ A# U# q3 G
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
. ]7 x! ~) G: Q! V' ]5 E
. U/ b4 a! P( H4 w                /* Enable Intermediate & Final transfer completion interrupt */
2 l) ]" ]' B0 k# {7 d+ C                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! [5 T4 N5 z7 R! z, S; f5 E                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ i0 [% `4 }+ G6 ~8 F0 ^

) |3 ?5 a9 U+ L% g                /* AB Sync Transfer Mode */. H) \& |8 l! H& g
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);2 F+ x9 a2 E9 T/ Q9 ~
               
' E) w" f: ^) \, y/ l                /* Program the source and dest addresses for master DMA channel */% Y0 ^3 p$ }( U8 r4 e
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);" h' \  a& N* x7 c; w! n
                paramSet.destAddr   = (uint32_t)(ping_buffer);9 c7 T% s. X5 b0 C' j* d7 I
6 H3 `0 K1 @  D- c3 \$ X: s- I
                /* Write to the master DMA channel first. */
% j. r7 y* a6 h( @( l0 V                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);4 A) ^' G$ o/ g
    }       % {' r, q+ J2 u, A+ T

3 p8 b8 c9 j: Y& v6 t! Y        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 w* v5 F8 V0 L7 I, P$ n# ~% y1 W
        & z& h9 d& i0 ~* t
    if(result == EDMA3_DRV_SOK) 8 l0 _/ V* P' r8 d$ u& Y* a- G
    {
2 |8 ~9 b- Y* g6 O, l" [            print2arm("edma3 driver init success.",0);
+ b  K+ z% Q9 M    } + t; |& d3 X, M( L8 B* o1 Z- z
}
* b( z: r* x4 k0 n5 Z  I& J7 O2 `7 m# Y1 t; ]! v7 Q
$ s. ~+ w! h1 K& `% w6 J
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 C. N9 r4 _' a; V* b: C3 @) O; h2 |% C. n/ `) q

7 I9 a6 ?( I1 G9 A" Q
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47- [" K5 h2 N* e$ E0 N
每次DMA传输完成后都要再次使能传输
! q1 H$ ?; h; j7 s: v$ B
原来是这样,我明天去试试,谢谢了!




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