嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' b; p' d0 y  M2 U* o) v#define  PING_PONG_ACNT          1, [5 Z- O4 D' J) L: A! w5 z5 [/ b
#define  PING_PONG_BCNT          8*32*40 4 s2 y2 G! w8 q0 M
//#define  PING_PONG_BCNT       1
  D( m$ t* S& S. J( Q#define  PING_PONG_CCNT          1
8 `1 c9 U% y6 W& V. z#define  MCASP_BASEADDR          0x01D00000
0 ^2 n5 ^; _! N7 l; W$ P#define  Mcasp_RXEVENTQUE        (0u). d$ \0 b7 D+ Q" B

3 v0 k- V7 m" Q. s$ M" {/* OPT Field specific defines */8 x  |- I6 W; ?0 J8 P6 l
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)8 h9 T. }( K0 J' l, p
#define OPT_TCC_MASK                        (0x0003F000u)# s1 c1 V  I6 j- L  Q
#define OPT_TCC_SHIFT                       (0x0000000Cu)- Q  X$ a" r; n' _1 Z
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)- q" k: Y( w6 R
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
+ `$ {: t$ ?. y7 _$ ^% p8 _* s' m1 J7 i: M1 v& t+ Q" K
char ping_buffer[PING_PONG_BCNT];
. W4 Z" V& |3 @: o  }/ b2 ]char pong_buffer[PING_PONG_BCNT];
( f" i  v  w8 O
( u5 m+ F( H8 d* ?; z0 `4 h1 e7 z9 s- K. U
! \: d. b) s1 N) |; V

% U! o0 m& d, Ystatic void ys_edma3_init()& k1 ~2 \& t. h8 K2 @3 }9 D, g
{6 Q3 c5 ^, Y9 F) U, p
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};) w7 S* e  Q" j8 o4 e
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 w/ ?) e! O8 E- H) Z: ]        EDMA3_DRV_Handle hEdma;
0 g& C  q" {6 t9 X- A. \    uint32_t chId   = 0;6 A+ t- P5 Q$ b8 |" p
    uint32_t tcc    = 0;
. ]3 V4 |) s; {7 `5 A* X8 P* q& e5 |; O" |9 N) ~
    print2arm("edma3 driver init...",0);
6 q2 ]! u2 G$ ?( ]* U7 R. C& f
$ H8 e. @4 P2 v7 K        hEdma = edma3init(0,&result);
' I/ M) n  u1 i/ M( F" v        if(hEdma)
% x. _4 f$ b+ e+ J! k        {
# H0 i! Y, _! u/ s/ x. B" K0 T/ @                print2arm("edma3init() Passed.",0);# }! E( H+ a- M! z  L6 \. Y7 G
        }
5 ]" Q6 ?$ J7 `/ o1 W4 }        else! D' A9 H8 X! `, F) x! Y9 U
        {; Z5 R. p( ], L' a0 G4 t1 C
                print2arm("edma3init() Failed.",0);/ d+ u# T5 x* a+ [4 V% M7 z
        }
) o  A/ \+ h/ l. Y; ~: u        ! @: ], Z7 }7 r' }* }9 G
        if (result == EDMA3_DRV_SOK)3 E4 ^* x+ h& F
    {
( h1 ?& p7 W( g3 g$ R& D                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 q( F8 Z0 e' K# ~+ J                                                       (EDMA3_RM_EventQueue)0,
& `) ~2 A) `$ n* J/ z5 _, _, \                                                            &edma3_isr, NULL);; I3 ~1 j: R9 t2 ^% f
    }
# @4 Z3 C( C, M& E/ Y& S        - d1 O2 I) c# y' s
        if(result == EDMA3_DRV_SOK)
# B  t+ P% B& C% |1 r        {/ n2 [1 |% F1 `: s
                paramSet.srcBIdx    = 0;  I6 W7 k% n& m) I" I
                paramSet.destBIdx   = 1;
  |3 N  Y( S# S3 F) b                paramSet.srcCIdx    = 0;5 w! Z) u( ~0 B# i
                paramSet.destCIdx   = 0;
' n' _3 `$ {8 n* |4 C5 i0 q                paramSet.aCnt       = PING_PONG_ACNT;
$ H! {6 m* a9 l, A; s5 [* ]* e                paramSet.bCnt       = PING_PONG_BCNT;* C6 V) \$ _, u# r; _
                paramSet.cCnt       = PING_PONG_CCNT;! z# S1 w' E7 B: m
               
" n' C5 a) T6 k2 w                /* For AB-synchronized transfers, BCNTRLD is not used. */
: |% T' S5 K  v9 z4 _- R                paramSet.bCntReload = PING_PONG_BCNT;1 E, ~4 ~) T: {
+ H- r2 |/ |8 t1 C/ D
                /* Src in constant mode Dest in INCR modes */
# I. z) g( b1 L+ M                paramSet.opt &= 0xFFFFFFFDu;* N$ c" g1 G# L. W) |9 Y! v' r5 P
                //paramSet.opt &= 0xFFFFFFFCu;" x- g' @/ w2 E% \' L
               
) [+ \! O( }* e+ P/ `' j1 [1 J                /* Program the TCC */+ S$ \9 @9 I' N- {
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 A- p3 O+ B. C+ k+ d/ X

, z1 A. T4 F- i" O4 z# F' N7 o$ b                /* Enable Intermediate & Final transfer completion interrupt */
5 i- B1 Z4 p2 J8 ~" q7 y                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 E3 w4 O$ N% p1 w2 Q
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 t  [% @0 [7 M% _1 [6 [# p' C0 R( D5 `# L) z5 l
                /* AB Sync Transfer Mode */9 V+ o9 a7 G6 ?! H
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);8 y( c, j. h) a5 _' X; R
                # g, N  W7 Y$ q: ^  k% D6 G8 v
                /* Program the source and dest addresses for master DMA channel */
& d# x- [( `. T3 [- Z: }% K& z                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);! R: o, d7 Y; e, ~- h
                paramSet.destAddr   = (uint32_t)(ping_buffer);
! y. t0 G8 B. y+ g+ p! w! U$ J4 L  j' d
                /* Write to the master DMA channel first. */
9 g: D3 N5 b1 U. y' M" w                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! Y. T! D) x4 p8 x5 ~    }       5 m# ~+ M! z* Q* u* R7 k1 I

4 x2 [7 E8 a, G$ F, Y        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( _# D! _- m3 o. t( o
       
" |* l( o  F7 r% i    if(result == EDMA3_DRV_SOK)
" ?. n$ q. i% _+ x5 i* {# k+ H    {
7 M3 u6 {+ g* e8 u' k: _            print2arm("edma3 driver init success.",0);5 D  `1 `2 ]" B! D& z  P& Q
    } # {2 B6 r% E3 B9 e1 M" N
}
  O1 d7 R' C  n4 ^" k4 H$ z) T5 j' F6 l4 H7 x. J

; d, m- A9 v9 m' @EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。; @7 o( w* p4 T3 y+ x
. C3 ^" y2 w+ W* X4 j! E

% b6 i& r+ v8 I: Y/ S) @4 w" R. m
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47! Z9 i/ B9 `& w6 ~
每次DMA传输完成后都要再次使能传输
/ ?; ^/ X0 J6 j1 V+ B5 Y2 c  S& I
原来是这样,我明天去试试,谢谢了!




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