嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 `. ?9 X! r5 g#define  PING_PONG_ACNT          1
  Z8 F3 k7 o4 J8 U" W# J#define  PING_PONG_BCNT          8*32*40
. b: o$ }3 p* E; Z! x, s" [//#define  PING_PONG_BCNT       1 $ g8 c6 E) k3 _3 r
#define  PING_PONG_CCNT          1
0 D: n  }' p5 k0 ?) r#define  MCASP_BASEADDR          0x01D00000& L1 P4 Q9 C# f
#define  Mcasp_RXEVENTQUE        (0u)
5 N4 Q8 i' P5 Q" Z! J0 M. ~- I9 ^- W7 N
/* OPT Field specific defines */
* A" S7 Q  _; z+ q( r8 M+ U#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
: }) l( N7 {$ A2 t- J#define OPT_TCC_MASK                        (0x0003F000u)
' _/ S6 `3 R! Y( J#define OPT_TCC_SHIFT                       (0x0000000Cu). K! g- s# G, p. ]
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
$ }8 U1 r& z0 o% v0 E. i% k! R#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ k3 H/ j- a' G: i; o) d/ e

) S( c5 j# ~3 |( N9 T) ^' zchar ping_buffer[PING_PONG_BCNT];: |* S% p0 ^0 T8 y+ s+ ^% S
char pong_buffer[PING_PONG_BCNT];6 c8 E( I$ S2 r. j* i! ]" n4 N

: ]# p; a& u! n6 N
1 E% e6 G& g! ^  ]1 ~/ E) @
* @' ?# e) Z" e) B( W0 k
* M. m7 _# K. M  sstatic void ys_edma3_init()& K6 \' Y& Z- {, }" S7 H6 n
{5 w. X+ \- R+ t3 {2 X6 `3 v# C: `0 F9 X
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ H1 ~1 i& N0 _9 @0 i0 E        EDMA3_DRV_Result result = EDMA3_DRV_SOK;. O$ X) v6 N& ~0 \5 K
        EDMA3_DRV_Handle hEdma;: G( p) o9 q  F0 c) B) Y
    uint32_t chId   = 0;
" \. }* Z$ B8 |0 _  M1 L    uint32_t tcc    = 0;- o) ^. b: \- i0 p
5 }7 o+ a  j8 l) Y* g* `6 H
    print2arm("edma3 driver init...",0);
5 t. r5 f' O) E3 X9 M* a( h5 I8 V% @3 ]7 `9 B' S( E+ U1 Q
        hEdma = edma3init(0,&result);
! }5 J( P! C2 ^9 B$ f        if(hEdma)
$ \6 A, g; _$ S! e+ z! `        {
* ~6 p" F$ {& w                print2arm("edma3init() Passed.",0);
2 C1 S' A* X) k, i! w  z        }% v3 A8 A0 C. a+ i: K
        else' \. T$ j4 o& k$ q  L5 f6 H! `
        {
9 t& Z; t# L5 C                print2arm("edma3init() Failed.",0);
; Y+ \7 p  p5 R        }" K' z( q) q/ d; Z
        + q0 m6 `) a8 E. u  K4 P: ~$ D
        if (result == EDMA3_DRV_SOK)/ y" u* j0 e+ Q2 A% F, y% I
    {& L8 }% M4 u2 Z# _3 o, p' h6 U7 z% A
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ t+ Q7 X9 }7 k: C2 \
                                                       (EDMA3_RM_EventQueue)0,' p7 V& o9 {9 W% C
                                                            &edma3_isr, NULL);: P# I1 S) V+ U; L6 W6 i
    }
) B  y8 X% f7 g1 h3 u3 z* o/ z- Q# `        . ^" r% R! ^" f
        if(result == EDMA3_DRV_SOK)
$ D3 a9 P( Q- p5 t/ n0 W7 @        {9 k4 }- X8 T2 X& X; H. X
                paramSet.srcBIdx    = 0;
) R  U; |; ~- s8 R$ b                paramSet.destBIdx   = 1;
# Q$ }& n+ Z! q9 N1 w! s3 M                paramSet.srcCIdx    = 0;
5 y( I  h8 N' E9 }, u# _) n1 @                paramSet.destCIdx   = 0;
$ s+ ?3 x2 [) c6 S                paramSet.aCnt       = PING_PONG_ACNT;% Q: T1 b: o7 ~$ ^) C$ K3 K4 B
                paramSet.bCnt       = PING_PONG_BCNT;( w* |! i; b) L  C* Q
                paramSet.cCnt       = PING_PONG_CCNT;
- g/ `. S1 U% Y               
" I0 V' G" I1 {( r                /* For AB-synchronized transfers, BCNTRLD is not used. */
7 h5 U2 w) h) `  ?9 W                paramSet.bCntReload = PING_PONG_BCNT;$ @- G, X' V# `

% N- ]. F8 \- e0 o9 k3 N1 p                /* Src in constant mode Dest in INCR modes */
( z+ z$ {3 w7 K' t* u0 v! g                paramSet.opt &= 0xFFFFFFFDu;
" h) |9 d4 q! W7 H                //paramSet.opt &= 0xFFFFFFFCu;
) D7 C% n2 n8 ^6 G; `1 Y                . [4 x1 V% }3 t% O- P$ z: j
                /* Program the TCC */4 k6 n" f! z% g6 d
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: D; h( W1 o8 u* i, U

6 a% K% K9 c: }                /* Enable Intermediate & Final transfer completion interrupt */2 G. D7 G' N9 M" ^
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. C8 F  D; D! V# \6 N
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 R6 `. c) I% [
- k1 W4 |5 S+ m$ B1 c                /* AB Sync Transfer Mode */
8 h5 ?, f8 [& u" s$ h' D( ^0 j5 L  F! N                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 M# `' D( l1 e                2 l! d: G; w) D
                /* Program the source and dest addresses for master DMA channel */
0 o8 V5 I: Z' i8 t' e5 F8 B                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 t9 q' X! B6 k1 b" B# z& Z0 }9 O$ S; c( p                paramSet.destAddr   = (uint32_t)(ping_buffer);
( p. m- V3 j  I8 @0 i0 W& _' f; U; Y. K6 i
                /* Write to the master DMA channel first. */
0 w9 I( ?% M0 L+ a& ~                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 K: |9 p9 ]$ F" \    }       5 n+ Q% h. ^1 v! W
: ]3 P7 l% q) g$ d+ [( g
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! @5 g# l3 d' b' w       
4 [  X9 p! H" }$ B& S* O    if(result == EDMA3_DRV_SOK) % M. j! N/ w; C1 ]9 Y
    {
; V9 Z& G8 A* y! T: G! }& G            print2arm("edma3 driver init success.",0);
3 k# F2 r4 h4 [, f$ Q( M1 H0 [    } - Z& d/ k9 e2 w  y) n4 Z" o; G
}
# x( D1 ?4 G" f+ ^% a3 l6 O) G; ~6 D5 A5 T, c4 [
: d* D* K# }' P' I# m1 A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。. F# `. R0 f0 J: a) d7 k2 S

$ x" e! R* J, V$ z  J! k7 x! V( \; t, t9 z

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:478 c) `! B7 q" }/ a" U) m$ M3 b$ q
每次DMA传输完成后都要再次使能传输
$ {8 a, L3 i9 v' q  T: y
原来是这样,我明天去试试,谢谢了!




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