嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:  q% A) a3 {* S! G$ D
#define  PING_PONG_ACNT          1- c/ K7 j5 M2 B$ s( w
#define  PING_PONG_BCNT          8*32*40
: E0 ?0 i+ x; c2 n8 w( |8 O* j//#define  PING_PONG_BCNT       1
- ^! T: D- t5 s#define  PING_PONG_CCNT          1/ J6 j8 b: _6 B
#define  MCASP_BASEADDR          0x01D00000
  @& O3 b: q2 u0 @/ _#define  Mcasp_RXEVENTQUE        (0u)# A9 o1 n. K. k1 D1 C' @
2 f# g0 p' t; o6 [& ^9 [6 s
/* OPT Field specific defines */
' h7 t* [: |  K; f0 m#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, x: h! f  v8 S1 L! f- h6 x#define OPT_TCC_MASK                        (0x0003F000u)! L% K* j! z$ Z& a5 Z$ D3 G
#define OPT_TCC_SHIFT                       (0x0000000Cu)9 e7 S9 h: p# n2 k# {' M1 N! V9 T
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
, u8 M  X2 B( B* T# k/ |2 _9 o9 `#define OPT_TCINTEN_SHIFT                   (0x00000014u)
. u2 p/ l/ x7 e5 b" T+ @/ n4 ?5 ?, ~
char ping_buffer[PING_PONG_BCNT];
! a. a  z4 a/ c7 u4 i3 e( Lchar pong_buffer[PING_PONG_BCNT];& n4 m. V8 d( w3 B
0 y4 t! z- ^. ^

: d+ O# F( e% W& h7 ]$ [; Y8 c1 @6 C3 d

% a- t3 r# c; X4 T: S6 bstatic void ys_edma3_init()& O  E& w/ F& U
{. Q0 U8 v6 U+ W$ \
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};+ k$ t$ q  h/ H# A- [9 b, [
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" }: T7 A3 c0 j5 y        EDMA3_DRV_Handle hEdma;- e  C0 P$ ~2 A, A, @! t; u; X
    uint32_t chId   = 0;& u$ t  N" @9 C: ^8 T
    uint32_t tcc    = 0;4 c; I, r! y- Z3 R" ~4 z
# k" E- h) m& @' F
    print2arm("edma3 driver init...",0);. q% t; ~0 b/ M6 I1 `- j4 m

# J7 e% e* N3 t" c0 O        hEdma = edma3init(0,&result);
$ n; b; c: T. o8 i/ u        if(hEdma)1 g  \6 T0 X9 N# R* _5 s- A$ x
        {. c/ K) j% f5 C$ d" \. p
                print2arm("edma3init() Passed.",0);
6 Z0 ]0 C2 g1 y3 A" r        }
: s# G; L) N% U/ x+ j: _        else
3 Z: f6 @0 b( Y9 E' u        {8 T, a/ `6 n& D2 P0 I
                print2arm("edma3init() Failed.",0);
. w" ?' x3 j( z* K2 h        }* R6 s# a! h+ Q$ e" s
        * h! b  A  E2 G( s7 v. o6 ^! \
        if (result == EDMA3_DRV_SOK)
" o- e- `. I0 m) t' r3 \    {
( @  F8 l+ A3 g+ M                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 b9 `3 x1 Y3 N
                                                       (EDMA3_RM_EventQueue)0,
% y# A. D" Q6 q$ s& S* C: B: L                                                            &edma3_isr, NULL);  D+ P% ]; t1 L' ?2 s
    }8 Y/ m2 I& ^, v# S7 G( F% k
       
2 c5 W7 A# f+ T' P$ I: ^4 C6 ?        if(result == EDMA3_DRV_SOK)
" b2 s' @1 Y( _: B7 V        {
, V5 b; |1 ^- _' X0 V9 L                paramSet.srcBIdx    = 0;' B5 u% O( u8 h( w/ N, Y
                paramSet.destBIdx   = 1;
" _, s" C9 B; @% U5 L5 O: N                paramSet.srcCIdx    = 0;2 k8 U/ y2 P7 F6 ^- g5 J
                paramSet.destCIdx   = 0;
6 J9 R- `, r5 ]* t2 L1 R                paramSet.aCnt       = PING_PONG_ACNT;
' e8 v7 M- S4 ^2 n                paramSet.bCnt       = PING_PONG_BCNT;
* ]& I! S3 S, A3 @% q                paramSet.cCnt       = PING_PONG_CCNT;% i/ j+ U7 W, W! u: S$ {# |: E; i% U
               
( Z: `" F! o* M, j) U                /* For AB-synchronized transfers, BCNTRLD is not used. */
$ c" U3 E. T1 c3 O3 x                paramSet.bCntReload = PING_PONG_BCNT;
7 H/ _$ w* a6 t' Z: Q& W8 j2 n' v7 p5 g4 H! [* {0 G# o
                /* Src in constant mode Dest in INCR modes */) |/ g( r7 V- P  ?# N; x
                paramSet.opt &= 0xFFFFFFFDu;9 P4 e& r- g8 Q+ }6 z" \; `' c. R
                //paramSet.opt &= 0xFFFFFFFCu;. m& C" \' N- B* y
               
* t% i1 [/ @3 M5 {, P                /* Program the TCC */1 {: y& o) \' o) E. k: }) e5 `$ ~+ A
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: a0 l! q/ p/ }# D0 p6 e7 T% }; _) V5 S
                /* Enable Intermediate & Final transfer completion interrupt */
1 W7 f4 x. j2 D, B* S) n                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 ^) \5 [. L- K0 d6 T6 s  K3 z                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 |3 @  ^9 g. ^. m
5 G! V2 I5 T0 X* g. i) N% n                /* AB Sync Transfer Mode */
# X- E) _* V1 g" R. }/ n                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) S! f; Z1 i. N1 q; }7 x- q
                  p8 q- D' x- |0 U
                /* Program the source and dest addresses for master DMA channel */" G5 @" A! L4 a/ g& [- m
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
. f2 f3 i3 h; c# e% R                paramSet.destAddr   = (uint32_t)(ping_buffer);
+ M: n5 X0 ^! ^- f: s  e
  ^; f* K( Y8 y$ o7 L, [                /* Write to the master DMA channel first. */
9 H) }# F  ?+ Y: Z, h                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% C. ~9 F4 a* w  N( \. ]
    }      
2 ^9 X$ Q5 x- s" Q, ]0 Z3 i+ u) H$ b! o+ D8 l
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);0 M) L. y  U  J3 n5 x$ a
        : B& H9 Q( w: l5 s% x
    if(result == EDMA3_DRV_SOK) 2 S1 X- y5 i! f* ~
    {
) p  [9 W# l2 ?# s& n            print2arm("edma3 driver init success.",0);; \! v2 d  }6 P" ^
    }
: ^, i" m: j1 P& s* V}4 f! [4 o1 H# A/ Z: _
# h) B: J& s4 S
$ F6 {, v) h8 J4 w5 B  M6 k5 w
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% z, `8 M4 H2 w# p5 x
3 X2 X$ j; y( x+ c0 x
- u* t& e* P: y$ z! T% P

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 D; F- C# h1 \/ t每次DMA传输完成后都要再次使能传输

. L6 _0 W5 H  ]+ c6 H9 x原来是这样,我明天去试试,谢谢了!




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