嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ f0 u" U# M& `+ q) ]: o. X#define  PING_PONG_ACNT          1
8 S2 l! k1 |2 W' \#define  PING_PONG_BCNT          8*32*40 9 q, ]$ `+ X! m) M' M+ U. O
//#define  PING_PONG_BCNT       1 " z7 Y  H; z& ^6 ^+ j& a0 d
#define  PING_PONG_CCNT          14 R: R5 a& L) b; Z$ C
#define  MCASP_BASEADDR          0x01D00000  s0 \9 j3 f8 }  @7 j$ P+ d
#define  Mcasp_RXEVENTQUE        (0u)
% I7 P' Y9 b5 S' b; C
8 }' y  N* Y! E/* OPT Field specific defines */7 W+ o' T& d7 r/ o8 x# p7 Z
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)1 k! Z8 ~) \! N% j. G& D
#define OPT_TCC_MASK                        (0x0003F000u)
9 Q- R8 }9 g; K) k! {#define OPT_TCC_SHIFT                       (0x0000000Cu)
; K. r: ^! ]$ Y4 [; V2 W$ d; R- F#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
, d" }2 z- O. G$ h+ f/ u- ]#define OPT_TCINTEN_SHIFT                   (0x00000014u)4 I% l% Z2 y! a- @7 A$ m4 o
8 B9 q! b) j5 v7 R
char ping_buffer[PING_PONG_BCNT];
% V6 z2 B5 E  Ychar pong_buffer[PING_PONG_BCNT];
6 t4 i7 v# r# U9 V" t* C) `& I, f. {  a
. I: c' ]5 D4 d0 P" b& `3 o
/ M7 G# t2 x9 f
0 Z+ Y/ J1 y; l) M3 ~* T, ]
" O6 r7 \3 a( j' Z5 [* p+ d: |1 @static void ys_edma3_init()
4 C" U0 b% @3 F4 k; d{
4 e3 r. W; z6 `# Y- P4 i        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; ~3 A+ R: P4 f% S# @
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# ?" j' K) _- I- X9 b/ f" r+ m9 Y
        EDMA3_DRV_Handle hEdma;& ]( K( v! R, n8 V! {" ^
    uint32_t chId   = 0;
$ H" a9 j# k8 N0 i# d    uint32_t tcc    = 0;2 H" R# Z5 k( S

. _, }8 s& `! y    print2arm("edma3 driver init...",0);+ U; V0 q0 i& `2 ^
- I( F; k( D; q& _
        hEdma = edma3init(0,&result);
3 c" k8 E3 G$ C" k" n1 T/ O        if(hEdma)
$ B/ R  g, j/ [# `        {
# Z3 B; l- Y' q2 p  q# a                print2arm("edma3init() Passed.",0);. X' J) F# r0 d* c: ]) ?
        }
8 R. x, W. {. ~3 `        else
7 L% Z7 G- ^) H. O2 I4 b+ T4 z! m        {
% Z& T# X  Y. n! o: j# X                print2arm("edma3init() Failed.",0);0 z* B, T; y' k  R6 m
        }. t5 l' v- G7 U4 }% I
       
! X# Y/ \7 ^1 p+ D& V) x0 l, {        if (result == EDMA3_DRV_SOK): |' y. q, u/ q3 {) B$ _
    {, r1 ^+ T( t$ b( h
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,4 I( y) u+ o! Y8 s& e
                                                       (EDMA3_RM_EventQueue)0,9 X& E0 t8 e% Z" I7 G( ~
                                                            &edma3_isr, NULL);
- t" A! l# p& N) {    }
4 R$ Z7 |; R9 `) A4 U( E7 P% k3 [        + L& ^. p  b2 P. k3 I; `( y' [
        if(result == EDMA3_DRV_SOK)
4 N8 G1 D# H5 S9 e4 p        {
: ?# K8 x6 d* n( }1 [4 A7 Z6 K3 ]                paramSet.srcBIdx    = 0;% B0 Q7 i) A# v) m0 |+ T$ Y
                paramSet.destBIdx   = 1;1 z! z+ B1 w$ O: c- @
                paramSet.srcCIdx    = 0;
/ M1 A6 D. r& ]) n( N# }( l                paramSet.destCIdx   = 0;
: J$ V: o9 B, g2 l! F                paramSet.aCnt       = PING_PONG_ACNT;
- s7 ?; c0 H8 K- z/ G7 V                paramSet.bCnt       = PING_PONG_BCNT;
. q/ f; s4 a, _! p' O5 v                paramSet.cCnt       = PING_PONG_CCNT;) V2 x& _9 v3 u% [) w5 }% i
               
6 R1 f, y( `0 i/ O' r% M! Y, e                /* For AB-synchronized transfers, BCNTRLD is not used. */
7 _) K3 N* A7 {1 N7 N3 N& I                paramSet.bCntReload = PING_PONG_BCNT;
. n, Z; b* l* A. A$ ?  p# H5 z) h, U
                /* Src in constant mode Dest in INCR modes */
8 Z- V: D! N7 J/ R& `5 Z9 Q! ^                paramSet.opt &= 0xFFFFFFFDu;4 }8 T) |% h7 f
                //paramSet.opt &= 0xFFFFFFFCu;
( L& G, p6 K0 Z& ?4 G                / T/ f, l- L' u) C
                /* Program the TCC */+ f5 h3 i1 J" B& \% u( u
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ N. m* w3 V0 g0 p! D' H
* |' T" D1 I# M/ N: c: \. A
                /* Enable Intermediate & Final transfer completion interrupt */
9 {. O$ e7 g; p                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 _9 Q1 ]: d; ], a) w  V" Y! o
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 E& ~0 \! P6 `( E+ R" Y  E6 O3 ?& f* a4 x/ ~
                /* AB Sync Transfer Mode */% S4 m& c2 g' j( {9 k
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 w. }6 J8 a' ^8 R: K3 O               
( B6 E( {3 z  ^! K% Z- P0 T0 W                /* Program the source and dest addresses for master DMA channel */8 W1 R+ w4 C7 v" [# P$ B
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);/ a$ j. b3 P) t- X3 K) B: [
                paramSet.destAddr   = (uint32_t)(ping_buffer);4 i- l$ ^8 d& w( h

4 ?2 a$ D% l$ }$ N                /* Write to the master DMA channel first. */
5 G5 H- k% b+ w& O- V2 N. ~                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);3 F# h' E) K- H5 i2 Q- P
    }      
0 z& ~" D- f- M5 Z9 ?6 @% v6 e2 J! n
5 ]- Q0 {/ U) _% U        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) D* Z/ @# u% h5 x$ r
       
3 i7 z! a8 K) U& D    if(result == EDMA3_DRV_SOK)
5 h; ?6 n, N7 p. s    {5 F, H  R. X7 L
            print2arm("edma3 driver init success.",0);
! i* F) }, ~2 d; J( _    } 3 m. R2 ?, K# ]6 {6 Z3 E
}
/ }( P  v2 h* {$ W' s5 x4 `. T; \# b* f) N7 I! v

  m! ^2 j+ j. U' g- S7 O  G7 m, c$ a4 UEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" K& d- y- n6 B+ ]/ Y" D
* ~* C. N4 C/ I

1 t& \% w. K+ Q/ ?( i
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47$ G' |7 F  F% \# R( o2 m
每次DMA传输完成后都要再次使能传输

4 @% {1 S2 U8 k) j原来是这样,我明天去试试,谢谢了!




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