嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& p# H" S/ L: [3 g) C* S#define  PING_PONG_ACNT          1
: S. ~$ ]5 k( x; \3 Q4 ^8 f#define  PING_PONG_BCNT          8*32*40
3 F( L* H% K7 T* p//#define  PING_PONG_BCNT       1
8 o( ]7 m0 d! L3 ~#define  PING_PONG_CCNT          1
; M, ^0 Q2 _) o#define  MCASP_BASEADDR          0x01D00000# Y6 e7 g3 Y/ _: K5 ?  N+ m
#define  Mcasp_RXEVENTQUE        (0u): M) q  B4 k9 I5 F# c. Z- {

, L% F  I8 l6 `7 b! \9 b- s/* OPT Field specific defines */
4 i2 U( d! S% @8 ?3 M" C#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
$ m! d; I3 A% _0 F#define OPT_TCC_MASK                        (0x0003F000u)
) W0 s. K: k0 ?5 I( ?4 p! t#define OPT_TCC_SHIFT                       (0x0000000Cu). s' Z, ~8 D) ]+ @# C8 `/ ?
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
; T; U+ V7 v: z3 W& Q#define OPT_TCINTEN_SHIFT                   (0x00000014u)! v$ a5 \7 \, \2 m5 _% O6 p
$ d0 N& H: W/ A; S  r5 p/ |
char ping_buffer[PING_PONG_BCNT];% ~7 O' P8 [9 o: h1 {  S6 h' R
char pong_buffer[PING_PONG_BCNT];
! C% H# n: g0 e! j" U
+ x; ]- {4 ?2 ]5 Z0 N
; k. i/ H- o+ D5 J( f- F+ |" o- L! r: t5 z4 V- U1 J' {
8 W5 F0 U' H7 n7 s
static void ys_edma3_init()/ Y, G( B* r  c( u6 \: d
{/ M7 Q1 w1 j  m, E0 P; Z
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
2 B- ?/ Z& I5 i( [. y( h6 b0 n        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- w, B' k7 q7 U5 v) Z- Z        EDMA3_DRV_Handle hEdma;4 P+ P$ }' K, k. s, X% ?
    uint32_t chId   = 0;5 Z3 P: N0 u' ~$ S$ B6 k
    uint32_t tcc    = 0;
1 }3 O1 e) s" T) W  R/ @9 F7 ~* T
  w6 ?/ n* {- j# f. i+ ~    print2arm("edma3 driver init...",0);2 p5 U4 `' r' n0 x& y# n8 x
- Z% \1 V4 a8 F( u
        hEdma = edma3init(0,&result);8 I/ r% ~9 p9 R3 a& v0 j
        if(hEdma)
. V1 c: d3 I( a' Q+ W        {( K: G; u; m( v0 v" [/ @' W
                print2arm("edma3init() Passed.",0);9 O" \) ?7 a6 G+ t: Z/ g2 W- `
        }
' Q/ D. F, ]" X/ M  @' I! H* k" B5 @) v        else3 S0 ?9 ]5 B' A" j, O2 i
        {- Y8 l, \: O5 V9 r! D+ m
                print2arm("edma3init() Failed.",0);: g1 q( a& z2 j1 N
        }
( W5 L3 {. c1 z0 T        # B( |/ O# a. t& D% R  s  \
        if (result == EDMA3_DRV_SOK)+ ]. D* A, q1 `" C: h# k9 o! s3 [
    {6 H, ?3 f0 |; F& e) ^
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' F) u& ?% ~" K3 ]4 k% ^, O                                                       (EDMA3_RM_EventQueue)0,8 m& c7 T- p  }' Q( o
                                                            &edma3_isr, NULL);
  {( p( ?0 \8 A/ U# @; ?6 y    }; u2 \6 `# f6 C; B
        & ^0 B6 H3 r  Y% _5 j
        if(result == EDMA3_DRV_SOK)) H, n: C8 l/ ~& H' I
        {4 U' Z' r9 Q$ y4 [& H: {$ Y
                paramSet.srcBIdx    = 0;
5 y0 y% m/ t; ^, X5 O' F, B                paramSet.destBIdx   = 1;4 M, B4 Y; ^* E- L
                paramSet.srcCIdx    = 0;
* v) f5 A  t0 ]5 E                paramSet.destCIdx   = 0;
: O! ?! S1 W4 M& i. c                paramSet.aCnt       = PING_PONG_ACNT;
* p" ?6 I( D6 R$ P, a                paramSet.bCnt       = PING_PONG_BCNT;! u* ^* ?, e; Y3 |
                paramSet.cCnt       = PING_PONG_CCNT;9 H' ~% T' _* b; P8 k" |/ L% E
               
) J3 v7 k6 m  C5 ^- D3 |                /* For AB-synchronized transfers, BCNTRLD is not used. */2 ?) v* M; w. f
                paramSet.bCntReload = PING_PONG_BCNT;
9 o% l8 X9 i3 F
' r* B: _. w" v) o- C                /* Src in constant mode Dest in INCR modes */& g1 `/ X4 |9 d7 C; Q% V: {
                paramSet.opt &= 0xFFFFFFFDu;6 ]) z. j8 g) |  A- s9 d/ |' }0 o( X2 v6 t
                //paramSet.opt &= 0xFFFFFFFCu;1 L, F9 W) c4 g7 ^8 |9 T1 ?7 ]7 J
               
' Z- B4 q" B! h- v                /* Program the TCC */
9 B" I+ Q+ B  ]! F$ M# z                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" x: O) }3 i* m( l: ?# Z7 C* w7 B" y* w4 G5 j7 e) e1 \
                /* Enable Intermediate & Final transfer completion interrupt */% Z- U, m( ]4 c) L6 p+ [2 `& N6 I
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
$ v9 R, y: d9 N6 Z* P                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: ]3 l. |. a# O* R  \  D/ I2 O/ |" {* e" ^* e) Q/ E( s& K8 a
                /* AB Sync Transfer Mode */: s) p8 J" |/ o
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* j# H7 R' V* x: a- o$ J. I                6 u" F0 h. h6 @
                /* Program the source and dest addresses for master DMA channel */
$ W. r8 E+ O) h9 L9 H                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);. e3 C7 ~* v; ?( m8 i# O0 U
                paramSet.destAddr   = (uint32_t)(ping_buffer);! I7 Q8 G) l# r/ B0 Z# x

5 X- ]# W5 s  P2 D7 M5 \                /* Write to the master DMA channel first. */" b/ G: S5 C" M- M2 r- ?
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
4 F  ^) n* J0 {2 e8 j* Y- [    }      
4 G6 j* O; |4 r: p7 Z/ }8 i$ j& |/ ]) E6 m( W9 I
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ ^/ U  \/ H& n; d
        9 S9 u3 e- P9 p+ G" `3 x9 o6 ~' b8 m
    if(result == EDMA3_DRV_SOK) 4 ~, |. [5 b+ H5 z  y
    {+ e7 ?7 {/ H& U
            print2arm("edma3 driver init success.",0);
2 @/ i% y% l) r& L% ]: m    } ( r& j3 A- W( U4 d" }
}8 e: \& y& ^( ?# `5 o

  D. a0 L' v( W3 Z# Y8 S
7 |# z" p7 e* l+ JEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" ~& u" {( P5 n7 V; _
& }# M& F0 D. z) k2 t0 E4 j( \- ~4 |1 D% O) G  Z7 d" i, r

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 Q: M5 M7 B7 z8 m每次DMA传输完成后都要再次使能传输
: E3 C/ u9 M; w( [4 d# v6 E) e
原来是这样,我明天去试试,谢谢了!




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