嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
9 z& z3 Y0 r4 `/ Y7 h#define  PING_PONG_ACNT          1
- Q5 m5 `/ g$ `2 D& s2 s3 M#define  PING_PONG_BCNT          8*32*40 1 r6 I! U8 B% J/ [+ p, Y: `
//#define  PING_PONG_BCNT       1
' |" \& w, K  C1 A#define  PING_PONG_CCNT          1
2 M+ i+ p. s- D8 x; o. w#define  MCASP_BASEADDR          0x01D000007 d! h$ v& _8 M& R
#define  Mcasp_RXEVENTQUE        (0u)
7 b" u6 C4 J1 X$ t( f6 c5 n; F" B6 _( d
/* OPT Field specific defines */8 G3 J, W4 Y) s
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
9 |; P. b) b. \1 _+ e5 Z( t#define OPT_TCC_MASK                        (0x0003F000u)6 f9 E0 w" [& c8 \2 r$ H5 Z" x7 b
#define OPT_TCC_SHIFT                       (0x0000000Cu)
/ P( Q( I& F# t. e! g" ~7 P, w9 n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
  j, ]7 A/ n3 A& ^3 g+ b#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ |0 i1 n/ ^; Z- A, I  B  K

7 t- H; @2 @+ F" g6 Qchar ping_buffer[PING_PONG_BCNT];
0 p' p! H( K4 l9 Z6 V3 H/ C  a4 Nchar pong_buffer[PING_PONG_BCNT];
  d5 G0 p) Q1 T% [1 U. D
+ _4 M$ J/ c% q1 m
; P9 f% Z) J( b$ m! J9 O6 [  D# ^0 i' O& B8 R# O) I  l3 ^! t( Y

; j# r7 B( U, d. [1 ?2 r2 h+ nstatic void ys_edma3_init()
) s$ V6 j& M! u- {: ?{. N0 t/ \  d* F3 ]. `8 [6 |
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 [) s. b9 X7 H: n
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' x/ _6 s+ l# ]3 z        EDMA3_DRV_Handle hEdma;- W/ C6 ^  y) t, a
    uint32_t chId   = 0;8 M" j+ g. v7 ]. ]! [
    uint32_t tcc    = 0;) W4 j/ B9 [9 u6 `8 H8 Q  E7 t
$ E  t6 C7 C6 F5 v6 r  e  }. {
    print2arm("edma3 driver init...",0);/ B# h; y0 D5 `; m, G

1 J( |/ h4 s7 C        hEdma = edma3init(0,&result);3 ^( W$ w, ~9 l9 _1 _/ O
        if(hEdma)/ _- J: U; L0 ?" w2 o4 T9 ]
        {4 ^' B* P" F3 O+ s$ V5 |- P
                print2arm("edma3init() Passed.",0);
: R. F7 Z  t7 a* h! R        }
6 U7 a: \3 h7 @+ }        else
; ~8 C4 O# R" [5 l        {3 t2 o; [! W' K5 r6 O/ g# l
                print2arm("edma3init() Failed.",0);) ^0 }2 u' W+ a* ~0 `; _
        }& R* @  b* a) H# F
        / K4 H# X6 x# |: T1 r& [/ @
        if (result == EDMA3_DRV_SOK)
; ]8 O- {( A6 {% n1 ]6 Q    {7 J  B" l1 Y6 i. O0 N  w
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 e8 |2 M. u% Y$ b
                                                       (EDMA3_RM_EventQueue)0,
. G# G" j- C# f7 t# E, R' `* m                                                            &edma3_isr, NULL);# p) Q0 e* v, J, C2 I
    }
$ V- |: }% ?" o. O       
4 L; ?7 ~2 E! V/ l& J        if(result == EDMA3_DRV_SOK)+ ?+ \7 O  l* l, S: G
        {
: |2 Z; b1 o# v9 R+ S  ?8 \                paramSet.srcBIdx    = 0;
  w  s! V3 S; _) u! Y! k. L" h                paramSet.destBIdx   = 1;
6 z" a* l7 S1 O1 S, S                paramSet.srcCIdx    = 0;/ d8 G. k6 \% j. O8 t4 l
                paramSet.destCIdx   = 0;
  ]- l; R( Z, g- X4 c  u+ k9 T( K                paramSet.aCnt       = PING_PONG_ACNT;) e3 r4 U9 j5 N8 C
                paramSet.bCnt       = PING_PONG_BCNT;9 O4 _4 h: E1 R  [; L& E, A/ h
                paramSet.cCnt       = PING_PONG_CCNT;; m+ k' j4 \# t2 L9 v1 L& t
                0 P3 I2 Z* V3 E, d/ P7 ]- \
                /* For AB-synchronized transfers, BCNTRLD is not used. */
( f: F% Y9 T6 j$ i                paramSet.bCntReload = PING_PONG_BCNT;) ]8 i. H/ `- ^& m' |% Q

/ Y9 z  J/ _' `) z                /* Src in constant mode Dest in INCR modes */4 ^( \; K% {- n% [: g$ I, L6 i5 _* L
                paramSet.opt &= 0xFFFFFFFDu;
* u' }; m/ u" i" L3 B                //paramSet.opt &= 0xFFFFFFFCu;( `& }  N( Q4 p
               
0 T7 n% e2 s5 e" H$ `! z. P) D                /* Program the TCC */* N% @+ p  S* x; `/ A
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: C  u- y# C2 D
% W5 e8 r& c& h( r4 D+ f/ C. z& ^6 }                /* Enable Intermediate & Final transfer completion interrupt */
: b; P: j! @* d% M- s* k  \                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 l" g0 C) @, r( ~  i) F                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: X0 ~" d9 y5 N( e# L8 N2 D& P3 g
" p' F" f& g. P' C                /* AB Sync Transfer Mode */
3 T# v8 F1 d- t- j- h! _                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ n7 n/ O( c" Y& o) C                4 n0 u: L* h; O1 M  K
                /* Program the source and dest addresses for master DMA channel */' Q6 b9 [9 t' Y* L( j5 ^' @6 T  g
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);2 I) D9 F% a; k$ _4 z( F' O
                paramSet.destAddr   = (uint32_t)(ping_buffer);: X8 N- b' d. U* I) G* B

) H3 H0 r: S9 B+ J3 k& F$ t5 G                /* Write to the master DMA channel first. */
3 K& h6 G/ X" X; h: Y                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 b; }* m. I  x* W0 a8 {( }5 h! V
    }       / ^. H- t8 A" [$ t

7 V  U( f% B" a- V* ?9 i' f        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. J' h4 v0 D/ J# ]
       
+ Y$ z4 S8 f/ o    if(result == EDMA3_DRV_SOK)
: H' @' u# @2 n1 O/ _    {
# d5 K" X2 M2 e            print2arm("edma3 driver init success.",0);
3 \4 F1 ?. E( T* |    }
7 E* s8 v; V2 L' H5 j7 |* y0 L& E# c}
+ D4 {9 \1 J" ^) X7 |: B7 j  `
, V1 c' B, x% j# c9 ~- @$ R2 f. n1 ~: U4 {: C4 F
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 l) Z# }& w) t5 R) E* X* [: k' G; f1 T
( K/ f% @1 X% m" O( u5 V! O

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47" y& _9 x  T* Z' C5 W6 W2 k
每次DMA传输完成后都要再次使能传输

; p8 B  P( S/ J原来是这样,我明天去试试,谢谢了!




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