嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 t8 M8 M2 M- E/ {1 R  g0 W  c, P
#define  PING_PONG_ACNT          1
. p( N% [, M, y5 K$ o9 C#define  PING_PONG_BCNT          8*32*40
7 R$ {  l0 @# a8 N% G: i//#define  PING_PONG_BCNT       1 * r! ~1 A( O+ w$ Y; @
#define  PING_PONG_CCNT          11 Q, U- G) ]' }3 Y' C
#define  MCASP_BASEADDR          0x01D00000
  c. C) h) v1 t5 w4 F. V7 X, k+ _6 W) h* d#define  Mcasp_RXEVENTQUE        (0u)5 v9 K2 @1 G' \
' |0 Y; q& o  K& z
/* OPT Field specific defines */. e/ X' [3 L. s8 z* v
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& j7 o- ^& F& U! g* r1 U7 l" a
#define OPT_TCC_MASK                        (0x0003F000u)
. p/ s$ I; w# M0 Q7 s#define OPT_TCC_SHIFT                       (0x0000000Cu)0 u9 ^6 C. y9 i
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
. y6 j, e" `6 r) s#define OPT_TCINTEN_SHIFT                   (0x00000014u)
- M1 P) y# z! I1 h0 f6 A
% K- x8 O/ o: L# W; `char ping_buffer[PING_PONG_BCNT];# a7 k: y) G! L+ I9 L
char pong_buffer[PING_PONG_BCNT];* ]* L/ _5 [6 ^+ V
9 F/ g3 \$ e$ O
/ H- Z: l8 ]( J. ~7 g

3 d/ a$ v0 b$ h2 ^/ i; n4 X' T' z8 v$ t
static void ys_edma3_init()4 K: K* R2 p( c$ t) _
{) U- T6 R9 G4 S( g
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* L7 A4 q$ ^& g) f        EDMA3_DRV_Result result = EDMA3_DRV_SOK;, v, D( s% ~& }0 T; K
        EDMA3_DRV_Handle hEdma;* D0 \- U3 R, n6 t; M0 V
    uint32_t chId   = 0;- r: x+ n3 \. u0 ]; ~$ C/ `
    uint32_t tcc    = 0;
1 x8 m4 q. f5 F3 D
, P& q; b' Y& E7 b4 y    print2arm("edma3 driver init...",0);
6 O+ l/ C+ F* @1 z
3 Z- ]# Q4 x, E: q0 @( F3 m2 Q- t        hEdma = edma3init(0,&result);
- E  d% a: B$ m! e; t        if(hEdma)
( c3 z3 p8 y9 E9 H, R        {
; n6 G9 K2 p8 j                print2arm("edma3init() Passed.",0);
! x7 \/ P: ~; U( f0 U3 R, @7 y        }+ |1 L" Z8 B$ _. L: Q8 f, M' [4 Q
        else- x+ a4 C9 B3 y- r/ X: Y$ ?. Y0 y
        {
  B" K0 ]/ e7 j2 x& i                print2arm("edma3init() Failed.",0);
# ]/ U, A. q! D8 N! ^8 ]        }
" v2 z0 l+ `2 P+ X7 _9 d* c        ) E2 J" H! U  O. @* B
        if (result == EDMA3_DRV_SOK); R/ Q/ s/ t* u& \2 h
    {
1 p/ c* i$ d3 |) N                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% T0 f+ U$ C& K& e* a3 d5 `4 x  E. W
                                                       (EDMA3_RM_EventQueue)0,
0 v- B3 F. S9 I8 ]6 Q6 t$ E8 a* I                                                            &edma3_isr, NULL);
8 ~* a/ D; i; M0 X5 g! g    }  X" f8 l: r# D! m9 x1 a
        + j! q2 D) e1 h  x3 s7 ]. @- B
        if(result == EDMA3_DRV_SOK)
- Y* }2 A- C  T. s        {
' O' [; ]; H4 Z                paramSet.srcBIdx    = 0;7 N% g% X! p5 u
                paramSet.destBIdx   = 1;/ v' u: _. @( n8 H) p! X, I  w0 X
                paramSet.srcCIdx    = 0;
3 g. b) {+ v8 B' S) ]                paramSet.destCIdx   = 0;
8 y* I8 H: N3 K8 p5 E                paramSet.aCnt       = PING_PONG_ACNT;! @/ A+ f" t4 B1 S3 Z$ z4 ?+ k
                paramSet.bCnt       = PING_PONG_BCNT;
  ?) q6 ~$ t% h' Q7 I! Z- h9 B+ _: _9 U                paramSet.cCnt       = PING_PONG_CCNT;  S6 d# |' R1 ~) V
               
$ u: m; @1 n6 I. s0 O                /* For AB-synchronized transfers, BCNTRLD is not used. */- R" Z2 W/ p0 w' z4 T8 `! o( Z( v$ z
                paramSet.bCntReload = PING_PONG_BCNT;8 C* A; a* ?4 ?0 c: e

7 X/ o3 S) h4 z8 ^# M) N5 Z# T) F                /* Src in constant mode Dest in INCR modes */
3 o7 D, B% N9 m3 G/ i( w; d                paramSet.opt &= 0xFFFFFFFDu;/ L3 M. L) @. k6 r! E6 x( p( Y
                //paramSet.opt &= 0xFFFFFFFCu;
5 t2 @, n7 i% R2 M               
6 E3 U( ^: W$ p5 }; t4 i                /* Program the TCC */
1 v! p( D* H. r' C- C                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
. i" Q( T7 k0 A& I9 x
) M5 g0 n, a' m3 d/ Q1 O                /* Enable Intermediate & Final transfer completion interrupt */) O- L( l7 h. A
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 u; o; S  ?3 w" W9 E. }! D4 y( m* K                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. G( G/ Q) R" [. C8 J; H1 d

8 H. Q% N" Y! @' {7 Q                /* AB Sync Transfer Mode */
8 W& y9 u1 @/ I6 r( ?                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' J0 Z' \! J' i  X' ]5 v7 a# I
               
! |4 e6 l5 J8 R                /* Program the source and dest addresses for master DMA channel */+ j  i0 w, ?$ ?* ?; J
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
# S( x" o. \! P4 t8 Y                paramSet.destAddr   = (uint32_t)(ping_buffer);% l8 `5 b9 W- B$ u& ^
' i, [! e: J  G4 u- v" u9 B
                /* Write to the master DMA channel first. */8 p2 D3 R) P+ [% q0 G
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);2 d7 Q" j1 R" G& J1 J- O
    }       8 D) s  p( I% n$ R

6 V8 N# E4 {  y7 N7 X. c        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- k3 d# M5 w3 r0 j. b
       
% x6 ?' Y* r! J) _  ?) d1 w* l9 q    if(result == EDMA3_DRV_SOK) 4 }8 K  Z5 w+ l/ W" Y5 O& ], B6 L
    {
+ z' x: ^" b( d6 Z7 ^            print2arm("edma3 driver init success.",0);
+ w: t' D, S0 q    } 6 f) N' @  S8 W5 L: s" j5 `) W' a8 f3 I
}/ H! P* E: `+ q( s4 P( X: M

) p; o* y; y- A: ?* y. M" n
3 R+ ~5 `: l* E# ^/ o7 j8 J- \EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 W* j" O  Y6 _  Q- e8 K
' ?) _5 e# G" e3 O% p

& k( ~) a( E+ g" j
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, t1 w3 A; {* `4 j0 `8 @每次DMA传输完成后都要再次使能传输
1 j$ r' C" N) O. W/ X( ^) A! s
原来是这样,我明天去试试,谢谢了!




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