嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 |$ u1 {8 A2 r# T: K
#define  PING_PONG_ACNT          15 ?: k  i: ?, j
#define  PING_PONG_BCNT          8*32*40
+ Q7 V) [0 n' Y$ B' {! V//#define  PING_PONG_BCNT       1
6 \' n) \$ E* O1 Q* q8 ^" a#define  PING_PONG_CCNT          1
  D( A- f5 @0 k. L7 @#define  MCASP_BASEADDR          0x01D00000
; e: t! c! c, E2 R& J. N#define  Mcasp_RXEVENTQUE        (0u)
: R: W) M: G1 |. d- f, g/ m6 D( @" @) J. R( F3 A- X
/* OPT Field specific defines */* T: X( j$ b% D0 `
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
5 \0 x- p+ q$ r6 a#define OPT_TCC_MASK                        (0x0003F000u)
: {6 y: F( V* b#define OPT_TCC_SHIFT                       (0x0000000Cu)
1 g0 c7 N0 F' Q! H0 P' g3 k#define OPT_ITCINTEN_SHIFT                  (0x00000015u)8 ~+ k* A5 W# J% G( d3 S0 ^
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
  w8 ^' l2 [  w. z/ k5 W
0 ~0 d" ^8 C# q7 ochar ping_buffer[PING_PONG_BCNT];- b! R4 L9 L; H( T9 ]5 ^" }
char pong_buffer[PING_PONG_BCNT];7 V- ^( {4 N7 i- K* M# B

! I3 n" v2 W0 w; j3 v
& @8 n  e( l' |- V1 I0 p1 m5 G3 q; @$ [2 a. B! Z
5 S$ ^  t" M7 G5 N/ o
static void ys_edma3_init()
7 Z" S" o. ~; d& M' ^: ]! ]( O{& E4 Q. t0 x' ^7 n
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: `' t2 b) Y" P% }5 \/ w; V        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' D/ W/ M6 b9 S! B: K8 U+ O: r. M        EDMA3_DRV_Handle hEdma;# X; u/ L# {* C0 {7 H0 H$ H! F
    uint32_t chId   = 0;
' I$ K+ e  J; ^0 {    uint32_t tcc    = 0;
4 C" d8 ~& o; B$ Z- Y, B( t+ }2 x% _. V. e( D1 F. m. ]$ p' ]
    print2arm("edma3 driver init...",0);' D6 w: X1 @9 Z/ {- o" Q
- N2 b# u# Z& n
        hEdma = edma3init(0,&result);% ?2 q6 q# H) t: ?# l# k" ^- y1 }
        if(hEdma)* ^. T; ~$ Y7 D7 w; ]& A
        {
. e4 m1 n: s) k* P2 |1 j1 {                print2arm("edma3init() Passed.",0);
/ e4 _0 y3 m9 a! w* Y9 `6 e        }
( N+ Y! V3 B- S5 e! v, N        else
, {) v# z, Q5 B        {5 W6 b- ~* b! J' n$ ~& L( f) E! M
                print2arm("edma3init() Failed.",0);
# H3 C$ L; j' l) g) ^7 M6 z2 g  n        }
. o1 e  x4 O9 }7 b" \3 R! x       
$ ^3 @8 Z9 x; Z- R- }- ?        if (result == EDMA3_DRV_SOK)
8 D/ d3 g" B& H3 s' ~    {
, s$ X+ |/ I5 C. B6 [8 m- N                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 Z% E  j" ]- d: ?( P6 Q                                                       (EDMA3_RM_EventQueue)0,
. j9 I! J" g+ Z( x; U' x                                                            &edma3_isr, NULL);! |4 U* f. s7 k0 i: ^
    }
+ V; J' G5 e; e        8 x' Y) x- {' f8 i# F, a
        if(result == EDMA3_DRV_SOK)
1 d( c) T' x2 z) \/ C        {7 [5 n2 Q7 H5 o3 ]3 r8 F  @
                paramSet.srcBIdx    = 0;5 H& w- ~2 s# [0 Y+ n1 U
                paramSet.destBIdx   = 1;' O- t% d: @$ y- |
                paramSet.srcCIdx    = 0;
* }! g9 {: f( e3 A  D$ e                paramSet.destCIdx   = 0;
1 s9 l" j% J6 L9 O6 i                paramSet.aCnt       = PING_PONG_ACNT;; z- o  |, A" i
                paramSet.bCnt       = PING_PONG_BCNT;$ a6 Z$ o! |: B
                paramSet.cCnt       = PING_PONG_CCNT;
; F5 g6 E# E; g0 b( A               
# m3 z0 c* k' K                /* For AB-synchronized transfers, BCNTRLD is not used. */5 C% e: v- ?- M" k4 Q. d8 }9 w
                paramSet.bCntReload = PING_PONG_BCNT;
2 u6 }9 D  H6 M3 O  c& U! ~! C; j7 E: e) k, u
                /* Src in constant mode Dest in INCR modes */
/ D5 Y1 e; u5 ~2 d6 F- V5 R                paramSet.opt &= 0xFFFFFFFDu;5 ]& _! e# t/ e
                //paramSet.opt &= 0xFFFFFFFCu;7 H. w( q( N$ _9 S
               
8 C+ q% a4 A: Q- j                /* Program the TCC */0 t' q" |' u- t
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% e# c$ N0 |5 ^! f# ^
) h: d, d9 m' ?" v2 Z  C! i- P( R                /* Enable Intermediate & Final transfer completion interrupt */- V$ ^5 y) W$ _5 @
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 f  N* j: x2 g                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 }1 p2 _0 W% r; X1 I! V7 c3 [/ Q* d% m8 C' B- f* D, _9 x
                /* AB Sync Transfer Mode */7 F3 V/ a- K7 J9 I
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ ~4 _$ g2 h; m/ g               
. k( s: ^& r# |  o+ U( I) b' u                /* Program the source and dest addresses for master DMA channel */
5 C; a: k7 W3 J6 `! `                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);( P2 G2 e$ p0 V0 u
                paramSet.destAddr   = (uint32_t)(ping_buffer);! V( C4 {) p5 @6 m1 c
0 i: f$ }9 L, `9 d* x6 R
                /* Write to the master DMA channel first. */
. n. @  W* M; b+ o8 T                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
. h5 e; n6 [3 p) C4 i- u; Z. z    }      
- L0 r# A, T* T% k0 B' G- ^- l) k( D( j3 j  r
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 H6 o) d8 D& A# Q
       
$ _/ @- q3 \$ G0 k6 H+ P3 N    if(result == EDMA3_DRV_SOK)
4 o1 B: a! B4 I7 n0 q- u3 X    {
, @) R( K- v8 [5 M) r$ N+ T, \            print2arm("edma3 driver init success.",0);
0 h) ~, N1 L+ U2 d  Y) D4 K  N5 c    }
# U/ C! a+ s$ l) [" k, r8 b}
- F+ P0 M/ E0 E: C! P( u' J# ?* Q5 H) S. i" \
3 E9 p0 n, F$ I8 Z, y# v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, N6 ]; I& t0 ~0 H# M8 Q" Z4 x

' V# |: ^% ?9 F" A- `/ C; X, |/ D' A( N; \, o+ e8 s$ J. Q* ]! @

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' c4 F( q) T& K每次DMA传输完成后都要再次使能传输
# U  ^5 k0 W/ O- I
原来是这样,我明天去试试,谢谢了!




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