嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 n1 B9 }+ k  w( O#define  PING_PONG_ACNT          10 Q9 G; J  ?, ?: v; u
#define  PING_PONG_BCNT          8*32*40
( J* p' E; x  J6 K9 Y% _* i//#define  PING_PONG_BCNT       1 . O# y# y9 N* u  b+ j
#define  PING_PONG_CCNT          1. o' k/ D2 u+ @
#define  MCASP_BASEADDR          0x01D00000
4 r4 U9 P) V0 {. d# h( l#define  Mcasp_RXEVENTQUE        (0u)
: J/ t5 C0 u7 N& ]1 ]; m
. d, n$ ]* j9 x6 }  r/* OPT Field specific defines */
% }& Z4 h+ v  H0 ?4 i' x8 E; F#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
) F6 m. d# }+ c5 S: j4 z#define OPT_TCC_MASK                        (0x0003F000u)( G. b( R6 W% a) z4 [* Y# g. q* j
#define OPT_TCC_SHIFT                       (0x0000000Cu)! N2 ^/ P6 \3 L+ M' {5 ^4 O
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)* s% Z( e& M, D# R' n
#define OPT_TCINTEN_SHIFT                   (0x00000014u)) n. x6 N! j/ G# x& i. N
7 A4 n7 k7 x1 H4 [
char ping_buffer[PING_PONG_BCNT];: }) m% K; \5 g2 P$ b0 Y
char pong_buffer[PING_PONG_BCNT];
2 f# C/ E  }* y3 j2 o2 L$ a" [/ P' t( Z( F* w; x* j: t; L

7 @; a, d" \" s0 ?8 F/ m1 ~. H
& E5 ~$ |9 N6 j5 |: F
static void ys_edma3_init(). j# m; E3 j$ |* u
{
4 ~( H1 N% J! a7 o8 K2 @0 `        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) O. s( j$ F: L        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# M, @3 @2 k2 k9 \1 H8 e  J, p
        EDMA3_DRV_Handle hEdma;
5 _9 Z/ r7 S0 ?- j    uint32_t chId   = 0;
! K3 j" ^, D$ X. S! K) _    uint32_t tcc    = 0;, q9 [8 q3 s+ j: ~0 P8 U
- N0 `1 G" t4 X
    print2arm("edma3 driver init...",0);
  t& L; L: {( Q/ R* o6 ~% R. l4 C$ _5 @  {
        hEdma = edma3init(0,&result);
% v( @  _6 E5 I; j0 d0 [" g* c4 C4 Q$ a        if(hEdma)5 o' F/ Z0 Y, B# x
        {  Y$ I# z4 w" P" q0 l& @9 a# p0 X
                print2arm("edma3init() Passed.",0);
) x. P; D( V  i4 Z        }/ b/ P% N" X' X9 e
        else9 s* K% b% h; C1 o+ Q" x; {6 Q
        {! y, Q" p4 s/ C* `' N* Z6 e
                print2arm("edma3init() Failed.",0);6 x! X8 k0 q/ V/ I
        }
5 u! }9 P0 k4 P" c       
8 P7 U8 @- S7 y* q! t  r' Z        if (result == EDMA3_DRV_SOK)
  J6 _0 T, k' a  K: [    {
( w9 F. v- ?. W  `, D5 ?8 P                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 P/ x$ t: `, n) O
                                                       (EDMA3_RM_EventQueue)0,
) ~) I0 r, I8 S" P                                                            &edma3_isr, NULL);
! J7 n. g' B  f' I    }8 W/ T& N5 R; X
        ) q/ l/ t0 x! R! V% C+ N& `* d
        if(result == EDMA3_DRV_SOK)$ R6 y4 [& W' i& W  E! w1 v
        {3 y; k- @) p& \" m
                paramSet.srcBIdx    = 0;
/ A: n5 r5 H7 |2 k                paramSet.destBIdx   = 1;
. k9 M0 K1 o/ x0 ^9 m                paramSet.srcCIdx    = 0;
( X: x9 {% X8 c) }7 @  M                paramSet.destCIdx   = 0;
4 w3 d9 Z* m0 n) C: X( C% o6 H                paramSet.aCnt       = PING_PONG_ACNT;; L- W, D3 p% I& a, d& ^6 r
                paramSet.bCnt       = PING_PONG_BCNT;; j  b8 [+ w, Y. d6 L+ u( |
                paramSet.cCnt       = PING_PONG_CCNT;9 A) x3 K* h! m& t
                  |) g  t- O$ N& k8 d! D# L
                /* For AB-synchronized transfers, BCNTRLD is not used. */9 ^. w$ I) k. U  i3 Z- o
                paramSet.bCntReload = PING_PONG_BCNT;
* p# R' A+ m1 p" g- O4 e& E$ @
  U& c/ [; ~! M* G& x: S  X. L                /* Src in constant mode Dest in INCR modes */
1 b- E! W8 c( K' C/ i0 ?                paramSet.opt &= 0xFFFFFFFDu;) [2 q" ~! \$ E. B* R
                //paramSet.opt &= 0xFFFFFFFCu;
8 V0 D: M7 l+ t1 M$ G               
/ o5 \0 H2 g* S: H3 V: a* h                /* Program the TCC */% x' x6 z0 \* [' u' T
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
8 S) @% Q- y; _, G0 T% S$ j" s% U! N
                /* Enable Intermediate & Final transfer completion interrupt */7 Y2 @3 m4 {! I5 i+ s% u8 A, R
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( h% r; i1 j& @) l0 C3 D  R
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);3 g- G, ~1 T# e9 W

/ d4 [) _* W9 P1 Z7 t* E                /* AB Sync Transfer Mode */6 b2 A( O, E- w# y' o
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 P% H( l  w: z4 c  \
                & I7 B( Y: V; _/ t5 v4 r
                /* Program the source and dest addresses for master DMA channel */  k0 G4 k* K5 |9 Z7 B# I
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; g$ y) p2 d1 g& _; r6 @
                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 r" I1 |( P# P1 S9 b! J
% y" ?  R& b2 J; o! I+ {# N                /* Write to the master DMA channel first. */1 y3 ^, k6 A+ v! v
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
1 D6 z7 ^5 y4 p/ Z5 j    }       2 U4 D- Z, V$ b) I7 o* I, k2 M5 x

) k1 x) v4 r: V7 X& u9 G& J        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ T0 M! F" A( H$ _/ `3 S& d0 O  q        9 f: r4 m" s" e+ f
    if(result == EDMA3_DRV_SOK)
4 y5 W1 f5 Y' r; A6 H3 K* Z    {. X$ I. ~& i9 H' E1 l
            print2arm("edma3 driver init success.",0);
  X9 Q3 l6 ^: o% o; Y    } 9 D5 F' m4 H1 x( t4 f% V
}4 S, J* y! N& Q

: d5 B1 @/ L5 _  S! u) J$ p4 a& G" m2 R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: P( I& [: O' i
& o9 H$ l+ M. \
. \/ M- c+ z# O

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:476 E) a9 ?# f/ R; G. l% f
每次DMA传输完成后都要再次使能传输
$ q5 ?$ j3 b# y6 s
原来是这样,我明天去试试,谢谢了!




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