嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 O# b& g( n  ?( D* g#define  PING_PONG_ACNT          16 t/ k; b( U% e
#define  PING_PONG_BCNT          8*32*40
1 g" W, {9 Q: d9 k* e//#define  PING_PONG_BCNT       1
% O, Z0 k. o8 D% N; S#define  PING_PONG_CCNT          16 E3 @: A" q6 |+ u! m# i
#define  MCASP_BASEADDR          0x01D00000# }3 \: ~0 ^1 ^; S* L1 `
#define  Mcasp_RXEVENTQUE        (0u)6 D* y. P" t/ A6 q7 G

  G. ]" |# Q! g/ x! Q( s/* OPT Field specific defines */
1 ^2 N6 e" t* P; j! I#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( O( ?7 [! j' F+ A* k1 \#define OPT_TCC_MASK                        (0x0003F000u)
. J$ S6 k7 V  V' ~5 p#define OPT_TCC_SHIFT                       (0x0000000Cu)0 E- _& |. v6 g+ t4 N, X
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
2 g! M' f  E8 p) R% J#define OPT_TCINTEN_SHIFT                   (0x00000014u)
/ D$ e) A+ U. ^3 D1 K- }/ ~# R/ c9 p8 \9 i
char ping_buffer[PING_PONG_BCNT];
. E8 O2 _6 Z1 x* n! ?; _0 Achar pong_buffer[PING_PONG_BCNT];9 @. [% ?" J2 Y  h: ?+ I/ t
. s) m5 n, j. S" F$ C

: _3 X! R- L$ z) ~: \+ @, B; ^# y
- q% A' ?- {" l' x- G3 I
6 n# v  m# |- T. H  Kstatic void ys_edma3_init(); F2 L7 a6 Q5 e* U; a
{2 }  ]; Z( D8 O3 H
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};9 e  P, a3 T2 @5 E* t  B" @5 w/ _# a
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ _* W+ X% J' I. Y        EDMA3_DRV_Handle hEdma;
4 U$ m, e, @/ r8 v( m    uint32_t chId   = 0;1 @8 Q- V$ c: E# N: ^2 {
    uint32_t tcc    = 0;6 L. Q' Q* s' y" X/ r

, y/ i0 u$ _+ b9 B' Q2 I    print2arm("edma3 driver init...",0);- u& G- f* H9 ^- E( f  H
) l9 J  @; T7 c% w3 n
        hEdma = edma3init(0,&result);
  D7 [- p: G1 w% S$ v        if(hEdma). ~( J; U+ D4 Y" L: {( b
        {1 d# s0 v; m  R3 X( `
                print2arm("edma3init() Passed.",0);8 t1 f" ^& Z- r( p0 w. o5 L
        }
: R: F) G" ~9 C: p% i        else
% f- M; G4 n  H5 j* u+ W/ G5 T, x4 R        {, d' `# P' {9 Y; ^9 \! ^+ l
                print2arm("edma3init() Failed.",0);
+ a/ Q# a5 E# H/ U        }, D& s  V9 G& ^1 I
       
. c8 o$ T/ A1 r4 e7 a        if (result == EDMA3_DRV_SOK)" Y: [5 v% Y9 Z2 e
    {1 d2 b8 v5 I2 S$ Z3 |' u
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" ~, Z! U% u* Q                                                       (EDMA3_RM_EventQueue)0,( O" t* C$ L. y2 B
                                                            &edma3_isr, NULL);
9 t7 ^: E2 u* {: o    }
* k1 W: A/ b; t  t5 l        4 p; U3 i" g  p5 r
        if(result == EDMA3_DRV_SOK)
/ \  Z, n2 S* O& B% A* H1 a        {
% G" H0 I" Q1 i  G  |  b                paramSet.srcBIdx    = 0;! h4 N, I( v& v! e, K
                paramSet.destBIdx   = 1;
0 o$ z6 {: k8 L0 j6 u" X* I                paramSet.srcCIdx    = 0;. j7 X" q' g! C* i5 _
                paramSet.destCIdx   = 0;9 K, t! e% N+ T1 P
                paramSet.aCnt       = PING_PONG_ACNT;
. G2 U$ `# s! T& h0 \                paramSet.bCnt       = PING_PONG_BCNT;
0 ^9 D1 E! I2 }9 p& n& l( g% j                paramSet.cCnt       = PING_PONG_CCNT;" j; N5 Y% i. _; O, P2 a
               
5 R3 v9 b7 j2 z+ x' |                /* For AB-synchronized transfers, BCNTRLD is not used. */. w9 H" k* j. B4 v. i' \
                paramSet.bCntReload = PING_PONG_BCNT;
, U: @# a7 b0 C6 h
% v1 L# a" s6 M8 M) T                /* Src in constant mode Dest in INCR modes */$ D% G: }; e% ~- X
                paramSet.opt &= 0xFFFFFFFDu;% q* N( D5 d9 V
                //paramSet.opt &= 0xFFFFFFFCu;8 Y: J" a) d! `* C. ?# O1 S
                . O3 {0 i/ @7 z1 ^" P' p
                /* Program the TCC */
* a' i! Y2 O' P                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" ?8 `! p  X& v: l" _& q) G" P6 R2 f- `
                /* Enable Intermediate & Final transfer completion interrupt */1 n" B) K8 Z; K2 Z" m
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ u3 W; [: u1 M+ U1 p6 t
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, e* J, D  R& R+ F1 g, k( S% P, w. _* x- S
                /* AB Sync Transfer Mode */* E" M4 ?' h, V  C6 G2 b
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ E0 ?$ G2 e' _4 k
               
8 B4 X0 C( B( C& H                /* Program the source and dest addresses for master DMA channel */
9 |; ^+ ~8 Z. w/ M  g                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);* o3 _  i8 S* Q; r2 O3 C8 L
                paramSet.destAddr   = (uint32_t)(ping_buffer);
) @* h; y2 \' d- Y( @5 T! d, T5 m# t% ?0 J8 M' |& H
                /* Write to the master DMA channel first. */
' o3 K6 V3 {; o( G0 e, r6 W6 T                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);0 |! L' l6 n, ^$ J
    }      
4 h1 D4 \* `! M$ [4 v( J# b; R8 W! ]1 U" d+ }$ K
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* b, B' }8 z7 W' }       
9 C+ G" f8 c  l# m& q- x& S# [    if(result == EDMA3_DRV_SOK) 4 E& k$ w& C- ]. B: j& ?0 d
    {7 N' x% S( c; y3 d3 E! J
            print2arm("edma3 driver init success.",0);
0 J. l# d5 t, v& k  v, x    } ' S) f+ k* l8 i3 N/ w
}& c2 y: C5 R! S! E
$ x; k) |. L7 A/ A
" g1 t6 g- p6 D: v5 O! m& g5 G( t
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* ]5 n9 V6 n# n3 f8 A% D/ e6 v' d% V

, B. H3 x- {4 f2 x0 G# l; B% B
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- [# G; V, f) }% ~' j7 t+ s' @每次DMA传输完成后都要再次使能传输
  Y5 ]& Q3 F' Y9 ~, K& a  j
原来是这样,我明天去试试,谢谢了!




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