嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 p6 `& x; h1 ?2 E/ k' X0 W2 A#define  PING_PONG_ACNT          15 y% o% F$ t/ G% Z- w9 s# B& L- A
#define  PING_PONG_BCNT          8*32*40
% Q& W7 _. u7 R( v' o$ u8 a//#define  PING_PONG_BCNT       1
& G! K+ R* {4 r0 e+ d- J#define  PING_PONG_CCNT          1& S: N5 D& A) c4 x. _1 ]1 b
#define  MCASP_BASEADDR          0x01D00000) ]9 H* t) T9 d# n
#define  Mcasp_RXEVENTQUE        (0u)( h4 u' ~8 Y, O" X/ A6 z

3 s( ^6 r/ |8 L1 P, \- n6 u  m4 }4 R; l. i/* OPT Field specific defines */3 s! F& F7 E6 P$ S
#define OPT_SYNCDIM_SHIFT                   (0x00000002u), I$ c3 m2 ?9 G5 W
#define OPT_TCC_MASK                        (0x0003F000u)' L, Q" N  O9 v- T% w' q" H& m
#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 i, y* O9 B& F2 `( F#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
5 Q* P' q: }3 a3 y/ v0 R- b6 b* w#define OPT_TCINTEN_SHIFT                   (0x00000014u)* k- |1 T! [$ D! A6 a# K1 f2 h

9 L9 u0 H0 U, Y8 A' ?char ping_buffer[PING_PONG_BCNT];+ f& O8 x6 k& s8 W" X3 v
char pong_buffer[PING_PONG_BCNT];1 Y3 p* n9 \: v' B, R& X& p6 B

( V  a& L9 R- x" @
; K5 B& x8 s1 l$ Y% `0 z+ Q+ X5 x! q# a) x8 Q, p3 o# ?6 }
1 E2 Y/ i& E5 }1 h6 a
static void ys_edma3_init()
5 R9 @/ C! N' \{
# I6 a& s- U7 C: [        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 Z9 T9 ^" V& o' l& w, z7 `7 E' D+ \
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 l! l! r0 ~; |( j
        EDMA3_DRV_Handle hEdma;
7 s: B4 \9 S; F, ]4 U& h    uint32_t chId   = 0;$ M" D! Z; y$ K2 k/ n9 A
    uint32_t tcc    = 0;$ c. O2 A! }: Q3 x* r

6 n) U: [  T% a* I6 p. U2 v! Q    print2arm("edma3 driver init...",0);
3 ^3 d) T" @; a6 g+ H5 p5 ?: C4 h$ o. E0 k
        hEdma = edma3init(0,&result);4 Y5 u7 |3 J3 Y1 C
        if(hEdma)8 a: ^3 o5 e: h: A. _8 N' x3 Q
        {
: u" ]4 J5 k! h$ _6 [6 _' `2 |, C                print2arm("edma3init() Passed.",0);8 W  y6 i  i7 K& U' ?8 L9 `
        }6 L" R1 p6 T0 s% c% s
        else
5 n" r9 h  v8 Y! B2 N. s! B        {2 o, F+ T7 h" C" [
                print2arm("edma3init() Failed.",0);+ ~9 u7 z1 T) J( Q. \
        }
0 L4 B/ t8 i; G. U  p        ' |9 D( n$ X; ]1 \! O# b
        if (result == EDMA3_DRV_SOK)' B9 s6 }+ i4 w* g' f
    {: [2 V- u! J7 B2 a, x- e4 l6 f) j
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
- z. i- c5 |5 g2 h) M7 G                                                       (EDMA3_RM_EventQueue)0,
7 r8 V) d% }% k                                                            &edma3_isr, NULL);
8 z! e, ^, H5 H) g0 _6 \3 W    }
) |6 c4 G1 L* H! `        2 i. C) _$ A' f- Z: R
        if(result == EDMA3_DRV_SOK)1 |4 [5 ]8 ]% v7 _+ p: q3 J
        {; |4 m# a' l! Q4 l) `) }
                paramSet.srcBIdx    = 0;
/ O& l- A$ F4 i% O                paramSet.destBIdx   = 1;. V+ h. x8 D5 a
                paramSet.srcCIdx    = 0;
( U- ^1 V, v  w! W- _1 M                paramSet.destCIdx   = 0;5 f" }5 ^. F6 [  P! [
                paramSet.aCnt       = PING_PONG_ACNT;" c4 v$ E' u1 h. n  e+ e
                paramSet.bCnt       = PING_PONG_BCNT;
/ c& R. F; x$ q" T                paramSet.cCnt       = PING_PONG_CCNT;3 O, P8 Y# @# T+ ^, p0 G* E" p
                4 s7 S/ f& D- @9 ?
                /* For AB-synchronized transfers, BCNTRLD is not used. */4 O! j* ~' ]/ t* t+ F6 ~4 X
                paramSet.bCntReload = PING_PONG_BCNT;; A2 n: u% U& a% e
. {) X2 x, h/ U" g
                /* Src in constant mode Dest in INCR modes */
* X2 h( O- e) X: D( I+ \5 K                paramSet.opt &= 0xFFFFFFFDu;7 d  Z2 d- y+ o/ [; x
                //paramSet.opt &= 0xFFFFFFFCu;5 }! F' e# o9 ^* w
               
/ V  i" K. N$ |* x5 Y                /* Program the TCC */
9 j+ d! e. h& i4 S3 j                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 ], l; Q$ c; c' r; Z/ [
' }7 G8 G" j2 l/ E                /* Enable Intermediate & Final transfer completion interrupt */
4 f: q$ l! l( U. Z( ]$ p$ s0 ~* P                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( b9 T5 W* Q! T; c5 G                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ y/ p3 r$ n- \2 T
( I" q; Q2 B! x1 P* a' `                /* AB Sync Transfer Mode */: S1 }2 G3 v: {, o
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% b* z' V& V4 ]
                $ V+ r' I- R$ a- T5 J! `8 o& [8 T
                /* Program the source and dest addresses for master DMA channel */
7 B/ k8 y* a/ G0 X                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
  {: \# ^! p4 K- t, Y% L                paramSet.destAddr   = (uint32_t)(ping_buffer);0 }5 h$ z9 Q5 P: I. I' v' K% e

/ B) `+ g" |+ g1 g, r; ]6 d                /* Write to the master DMA channel first. */9 A) T  _; N' g2 H7 Z5 X
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);/ P; s0 S* h. v" i) t6 ~4 V, C
    }       1 f: V4 Q8 c! @; L  {4 k, ?
7 b3 T0 O3 T* U+ `# F& l* Y" d: t' w
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 u2 E/ K0 ~6 M& E; ^       
1 ], U! M1 r& p    if(result == EDMA3_DRV_SOK) + E; w! _& m4 ^* Z5 t- L; p
    {
$ s$ [! H9 c" L# G- ~& m+ M            print2arm("edma3 driver init success.",0);
: ?5 s; Y% D+ M; Q2 F    }
4 M6 a* T9 g/ u0 p! P0 ?' R0 t}1 M( {; `/ X. K

. K$ Q( ]) ?5 L) x( ]: l5 E; p: s# ^1 N0 m8 ^
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) i' O5 ?2 M$ I; R- S" _9 p

! ]8 g& W7 G. t, ?' o! X3 B7 }

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47  q3 U( A  @) o  e) |& l
每次DMA传输完成后都要再次使能传输
9 g  X  x, t/ t
原来是这样,我明天去试试,谢谢了!




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