嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 |5 r+ A% S$ }; r' R2 t
#define  PING_PONG_ACNT          19 E( U# j8 E; U, v2 J" ^. a5 l/ v
#define  PING_PONG_BCNT          8*32*40 8 W& @' `1 F- @7 f3 q  M2 @
//#define  PING_PONG_BCNT       1
7 L- T" L/ p. c0 A8 z" u#define  PING_PONG_CCNT          1% O6 \4 U! W9 H6 q) A
#define  MCASP_BASEADDR          0x01D00000/ S8 b) a5 L, ?8 q& f
#define  Mcasp_RXEVENTQUE        (0u)
9 O$ c5 F% b9 k4 t9 K9 `& D+ O+ E" {1 v
/* OPT Field specific defines */
3 Y/ B8 w& r0 h  [, U#define OPT_SYNCDIM_SHIFT                   (0x00000002u)$ R4 W. u. r4 |/ D7 n+ ?: D, H
#define OPT_TCC_MASK                        (0x0003F000u). F, N$ g. H8 A9 X2 }+ B
#define OPT_TCC_SHIFT                       (0x0000000Cu)  @" B- I' n" K( A; ^1 H# I  o
#define OPT_ITCINTEN_SHIFT                  (0x00000015u), A" E( N' e& L
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
! x9 }) l+ F7 M+ {4 k7 d. V. c; Z# Q* O! S5 S
char ping_buffer[PING_PONG_BCNT];* e, r+ d6 {# s7 C3 s3 D
char pong_buffer[PING_PONG_BCNT];+ h( U1 L' U) j! Z. W
: S+ p9 k4 x! F! b0 s/ f9 ^/ ]

0 u0 q( O. X0 G& g! C+ t2 W5 W1 Y# \
" D  L( W6 m7 B+ ]2 H
static void ys_edma3_init()
- h8 }' n3 H4 E3 {, e0 X{0 z  _0 Y4 ~) W7 D+ M
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; g7 y& ?' d1 Q
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 Q% t2 S' [: k# z7 b        EDMA3_DRV_Handle hEdma;/ n; L9 j. N3 F7 m! d4 }
    uint32_t chId   = 0;
& N; O, s" d* ~$ v; W) c    uint32_t tcc    = 0;
- ?7 B) l! E/ Y4 {5 @2 v' g  i9 `4 _8 |: K+ I
    print2arm("edma3 driver init...",0);5 C9 I+ o4 s) B/ v
% L+ K' O" f/ ^1 ?
        hEdma = edma3init(0,&result);
0 q$ y4 }- u& |5 J" }, R        if(hEdma)! p& `, K0 q$ ~0 c5 Z( ]: `
        {
7 _+ j) a7 X  ~) C                print2arm("edma3init() Passed.",0);
- g1 d: k0 k. b+ ^) Y3 @5 k! M        }9 l9 I' t' e& Q& f
        else
0 u0 [& L6 G' Z+ \/ r9 ~* V6 g        {
9 t# s- F$ T' J6 q" Y. }                print2arm("edma3init() Failed.",0);! K  `1 j9 P! G: f/ l% j
        }
  ]! m! h9 p" c( f' `        3 `0 O! Z- w7 s% j) `
        if (result == EDMA3_DRV_SOK)) l. C4 q9 |4 |' A4 n. K
    {
0 V, `9 ?1 U6 W                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, Q& w5 P5 Q7 r
                                                       (EDMA3_RM_EventQueue)0,
! ]4 p7 _1 F; g. W* n2 y                                                            &edma3_isr, NULL);' T7 d+ ]  Q. O+ h3 h# H5 n
    }
' R$ B7 ^/ _8 Q0 L# n6 y       
# m$ C! F' O& C- A0 R* E        if(result == EDMA3_DRV_SOK)
0 A2 @& f/ a+ {! g6 S1 [        {# D' z" B+ E; N# Q/ J3 u
                paramSet.srcBIdx    = 0;/ y: Q( J- ]- Z# O0 E$ P& `
                paramSet.destBIdx   = 1;
7 E2 E* d+ X4 {                paramSet.srcCIdx    = 0;  T# v  _+ j' w: ]5 c
                paramSet.destCIdx   = 0;+ s+ H7 _4 x* S1 p: p
                paramSet.aCnt       = PING_PONG_ACNT;
8 ]' G7 ]3 W3 ~5 B3 b/ k4 a; u2 O                paramSet.bCnt       = PING_PONG_BCNT;) ]( ?# M# e  q; p& h: s6 T
                paramSet.cCnt       = PING_PONG_CCNT;5 S, u2 ~8 E6 \
                : e0 t' C  o, w- H2 z
                /* For AB-synchronized transfers, BCNTRLD is not used. */
0 I# P8 i( Y1 O  K+ B                paramSet.bCntReload = PING_PONG_BCNT;
8 N' S1 l+ m2 \* B: [5 g& n
" A4 g; u' `/ v: b4 B" D                /* Src in constant mode Dest in INCR modes */" y' v; K& s4 h+ S; r9 `; K
                paramSet.opt &= 0xFFFFFFFDu;. f/ V6 n# o0 Y, L
                //paramSet.opt &= 0xFFFFFFFCu;
1 K: q' ^# n& D/ G* h3 h                / M" x! z0 Z1 D
                /* Program the TCC */. z$ V$ T' m6 i+ j
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" F  n5 s5 W$ z

) Y$ A6 V# l, @' k/ m                /* Enable Intermediate & Final transfer completion interrupt */  Z, u# E  q" ]6 O7 z1 n
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( j/ j" w- P$ B" S5 f                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! E& }' [1 t1 n/ t7 P, I/ I3 _+ ^( |3 S$ U
                /* AB Sync Transfer Mode */
- m+ V0 G0 a! {2 p5 ~                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 C* q  p+ x4 c1 ?0 z0 h& S, @
                . [6 @- W# ~% \$ D& N
                /* Program the source and dest addresses for master DMA channel */
  I, M6 p5 q/ N! e1 l# t* p                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! u! e0 ?  t* P( V2 q5 \2 \
                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 g. p0 B" v, w9 g; ?  Y2 t4 _- {1 T4 f2 G: }
                /* Write to the master DMA channel first. */4 ^; C+ ^" G% C5 v# W* o$ H6 x
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);+ U/ l2 l; N/ B; W% r- E) f% U9 p. S( M
    }      
( p' {( x- m, a9 T1 n% v( S
/ `+ ?" h" ^0 k2 t        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: M% r8 z. a8 Y- m# M) J8 S
       
/ t3 ^) N/ |. d    if(result == EDMA3_DRV_SOK)
+ q- n) D( W( [; ^9 m) P    {
  h7 l" h, `! ?; c            print2arm("edma3 driver init success.",0);8 l$ p# s8 v6 e# V. X$ U# ]
    } ' Z: J2 i3 f5 {& @/ g; d1 A
}
) D! D/ N% b2 B% v& ]7 \3 Q3 M6 |$ \/ Z/ u
: c. m4 w' J0 F+ Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 X6 Z$ q& N: r0 ]% p5 S9 }2 C
. V8 V7 k0 R( @
2 i& C9 v% I: g2 P' q; s/ t
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& v6 m$ I4 s/ f0 a6 a- Z% Q2 l每次DMA传输完成后都要再次使能传输

3 G5 b- b, y% |: p* Q原来是这样,我明天去试试,谢谢了!




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