嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 R# h  ~& A8 m' f" B) d+ H
#define  PING_PONG_ACNT          1
& F9 e$ y  }8 f9 o8 F6 r: Y( e3 a#define  PING_PONG_BCNT          8*32*40
2 q9 Z+ a) C6 _! {4 M//#define  PING_PONG_BCNT       1
7 o" c6 {2 q( m! R+ G3 d1 _4 X# h#define  PING_PONG_CCNT          12 c7 d! g7 ^+ N8 E- P( s5 l
#define  MCASP_BASEADDR          0x01D00000
1 J% g/ |* o# \* R0 G  ?* k! f#define  Mcasp_RXEVENTQUE        (0u)' W  v+ B* w3 g  ?5 [5 ?0 ?

+ j! _- S) S- |& F. r/* OPT Field specific defines */
- w3 E' G" ?. E, M5 U9 F#define OPT_SYNCDIM_SHIFT                   (0x00000002u), I( E' ]) }' A/ w
#define OPT_TCC_MASK                        (0x0003F000u)" S. z- Z( c. y9 D5 m; W5 N/ r) C5 E
#define OPT_TCC_SHIFT                       (0x0000000Cu)
* T9 W. v* ]( U7 D/ g#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
7 u  d, h& {+ w$ ^1 ]6 |3 \#define OPT_TCINTEN_SHIFT                   (0x00000014u)7 q0 y8 V, M( E  p( L/ P
5 Q7 G2 m, O& X& g# G( H. j
char ping_buffer[PING_PONG_BCNT];$ w+ ?) D' w& y$ J
char pong_buffer[PING_PONG_BCNT];) w- Q, V' ~4 T
& e: \; {4 u) Y! s
/ L1 M3 d8 W5 D1 y; T. ^  ~8 b+ w7 v( ~) f
6 `$ E0 u; R+ I* L# w3 l4 q

; V' j- T" @6 \9 @static void ys_edma3_init()
0 Q5 {$ ~, Z5 s* n{
2 X1 M* y- |. ]/ x1 J! X        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* K) y. ^) s& w# E8 v/ S        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* P; P# j0 s* t        EDMA3_DRV_Handle hEdma;, c+ A4 i+ s  a' x5 Z& r
    uint32_t chId   = 0;
3 X" C) O: V6 S    uint32_t tcc    = 0;5 i& E8 F8 z8 o3 {5 v% A
/ G+ Y$ s2 p) d/ Y3 Y
    print2arm("edma3 driver init...",0);, t$ M  K9 x' f( `5 r# j+ D

+ \$ z1 b  l3 C2 a        hEdma = edma3init(0,&result);3 }3 g/ d& O1 i4 k
        if(hEdma)$ \0 J3 M' D# [
        {
! U8 Z' ]9 X7 Z. w6 D                print2arm("edma3init() Passed.",0);
3 X7 Q5 B( S& J; `& e5 {- {        }
6 v* {- c0 d- u+ m        else
7 ~5 T/ Q; p8 B0 e8 g$ D        {
) s3 `( o: Z4 ^' `- {! l. J( k                print2arm("edma3init() Failed.",0);
4 {6 Q  E8 Q5 S, A        }8 _$ i' i  E6 a% }( y
        + g  k3 H! O0 X3 F& P% K
        if (result == EDMA3_DRV_SOK)! B8 X( x6 b/ g+ Q
    {
8 Q7 {# k6 U5 r* a, K. d5 N8 _                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 s. e) W' T/ b  ~# z                                                       (EDMA3_RM_EventQueue)0,
; k& J0 S' D/ E8 Q) T" Q7 F7 D                                                            &edma3_isr, NULL);
. \* j* U, d/ H    }
# N- c9 c& X* E. q        & T& I) ^; F& c& S. ]# G5 ?: n
        if(result == EDMA3_DRV_SOK)5 E5 C5 Y9 ]9 e: y& t5 N4 G& V
        {
6 I4 Q7 g3 s8 h$ x                paramSet.srcBIdx    = 0;. [* ?  O+ ]1 R
                paramSet.destBIdx   = 1;
9 I- g, ?4 C, R, p, D                paramSet.srcCIdx    = 0;( P" |2 e9 f# e. N; ?5 a3 {; F
                paramSet.destCIdx   = 0;) p, w0 ^: r- u' V" o3 o
                paramSet.aCnt       = PING_PONG_ACNT;5 u8 A. b$ w9 d2 ~) G
                paramSet.bCnt       = PING_PONG_BCNT;3 S8 W6 F0 Z5 A" J+ _
                paramSet.cCnt       = PING_PONG_CCNT;4 E6 _5 T$ }: n& X  q4 \
               
: o8 a8 W3 S7 r. ?3 q2 e0 ~8 V+ U: F# g                /* For AB-synchronized transfers, BCNTRLD is not used. */
+ b7 m! Y0 g1 T/ ]+ Z! X                paramSet.bCntReload = PING_PONG_BCNT;1 W' f8 C4 C, N9 s9 B

+ |. p+ x1 s1 u! {                /* Src in constant mode Dest in INCR modes */, j& h3 O/ s2 U$ Z' W" X* I; Y: c. g
                paramSet.opt &= 0xFFFFFFFDu;  ?! h' i" @5 s, ^
                //paramSet.opt &= 0xFFFFFFFCu;& R& o  v0 ]- V- S0 A3 q
               
4 X8 ~+ C+ u: [                /* Program the TCC */* D9 y* I; v: u; p2 z1 q3 Y4 u
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% u# u5 \/ B* a6 D, W+ j. A& j
: _' H+ D1 k; }  h+ L, Q% I$ H                /* Enable Intermediate & Final transfer completion interrupt */0 q, L. J! m2 C& P
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# w/ X! m; i- X+ g  K9 n5 G
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. ^$ D, b. u! r; Z. G: x! M
- ]5 k8 ?0 b+ J+ |
                /* AB Sync Transfer Mode */
9 {0 j; O+ r( C5 G9 u( q& m' N8 M                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 |- L/ M9 x6 }1 A0 X1 f& A
               
9 K  [) f& O% s1 x0 J! e6 P                /* Program the source and dest addresses for master DMA channel */8 o& [2 F, n, g. W4 l2 U
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);5 V" r/ {2 d+ \* X4 D
                paramSet.destAddr   = (uint32_t)(ping_buffer);& ~/ l# z; U. {7 T, [& p% d

$ H! N$ e8 X$ q                /* Write to the master DMA channel first. *// C& g. j' Y0 y9 [7 A" F3 a
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);  F, g& W5 R  U- V/ y9 _3 U7 _6 U
    }      
2 U! f/ |1 T5 \1 c$ K' Q+ s% r6 k' ]5 E  i! b0 l: a
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' l* h2 O& a1 z2 {7 I1 H; ^- r9 o       
  v4 X- {5 I( l    if(result == EDMA3_DRV_SOK)
7 \4 I! x5 ]1 U' |9 d    {8 l+ s+ @$ O+ i! H3 ?- b6 z. Q0 l% s
            print2arm("edma3 driver init success.",0);
. Y5 T# B* r* m% z$ T+ d" }    } 5 X! z. B9 {" ^- w( w: q
}
' t. n1 f! k$ E5 \- s
' J5 Y" Y' G& j0 a; t
: s. l( z( u) SEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
5 E6 c! B9 h4 k9 ^  }+ t6 o# J! m  z9 {

/ ?! x  F+ b. Y2 V- P8 B8 `
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% M: Q" k' B, x每次DMA传输完成后都要再次使能传输

/ A1 |% x) Z7 A- V/ S* m原来是这样,我明天去试试,谢谢了!




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