嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
$ n3 V4 N# d2 B- B" y#define  PING_PONG_ACNT          1
% F% `6 o- q3 _2 e0 P& k( L# e#define  PING_PONG_BCNT          8*32*40
8 l6 e" @" v2 y0 W//#define  PING_PONG_BCNT       1
6 J4 @; o+ ~. r+ s, {#define  PING_PONG_CCNT          1) J, Z# s$ T" y" z) K8 O
#define  MCASP_BASEADDR          0x01D00000
& Q$ _7 B$ M% [9 b' U#define  Mcasp_RXEVENTQUE        (0u)
& X3 c; b6 e6 c* x( t1 A* U7 M: x) _( M' x$ O" Q2 g
/* OPT Field specific defines */
" ?6 p5 W# }$ {3 M" Y' t6 Z#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
& s8 m  _2 x7 r1 e#define OPT_TCC_MASK                        (0x0003F000u)5 z; Z4 G( m* T0 K
#define OPT_TCC_SHIFT                       (0x0000000Cu)
& Z/ p* ^6 y8 d#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& y* E# k9 e" R5 S
#define OPT_TCINTEN_SHIFT                   (0x00000014u)1 ^2 v& r# E& E( ?8 v
% f: p% j: z- d$ A& h
char ping_buffer[PING_PONG_BCNT];
; w  `0 I5 y" h5 S- schar pong_buffer[PING_PONG_BCNT];6 J. F: X* \  [% I1 y7 r4 X( e
7 d; h5 W5 ]' l  d, [( |1 W

7 n3 t4 X* N! Q2 s) M$ W" ~% ^1 d2 M9 a. Z$ T

2 ?2 ^9 g6 F1 B* i( fstatic void ys_edma3_init()
8 m# m, e, q4 c. z. [( n# y3 b{) b/ [! O6 P5 [; ^
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( b* Z, u$ W+ f9 }; |4 L6 w8 T
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 b' q- ^/ R4 |/ h! H) ?% I5 z$ e" r        EDMA3_DRV_Handle hEdma;+ [  m  B% s+ c
    uint32_t chId   = 0;
' }9 g  B6 e8 o( t    uint32_t tcc    = 0;9 [! n4 m2 }- x& y5 v
% G3 R/ C4 @3 o$ N9 H5 h, J2 d
    print2arm("edma3 driver init...",0);
8 a* D. c7 P$ U% i& I& f% C- Z7 {6 x) @% D! @
        hEdma = edma3init(0,&result);
% q/ f, ]+ k, l7 D1 ?        if(hEdma)( [6 H5 J$ l# Z, ^. G* t
        {9 J, X# |4 O% M' {( Z
                print2arm("edma3init() Passed.",0);
  R% y3 B( o! N" z; B        }
- {% ^) {) Y  a$ M: V: u        else% i8 f# t, G2 v
        {+ l2 j3 {/ L0 R
                print2arm("edma3init() Failed.",0);+ l& D, {% @- n/ B# @# W
        }
. @! Q; K% }2 Z' [& ]' v       
; n! p, {$ s* C        if (result == EDMA3_DRV_SOK); d/ P" J1 P4 }. _6 O3 D
    {
) v: p# {/ E+ \; p7 J3 c0 L                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 Q! C+ r& B8 M) b
                                                       (EDMA3_RM_EventQueue)0,
" }6 U: ^. K9 y: }2 x4 c                                                            &edma3_isr, NULL);
) B; f  i+ x% c$ h5 g* }' V    }) }# o* ^2 O2 T' P2 V! D
        1 O# R, B1 B; m5 `0 M
        if(result == EDMA3_DRV_SOK)
6 G, Q1 E5 n6 l0 f+ M        {$ D% ?/ R: Z& o$ _
                paramSet.srcBIdx    = 0;
7 k) U: ?" ]' \4 U, G                paramSet.destBIdx   = 1;6 f6 T" Z7 L3 [; c% S3 o+ o
                paramSet.srcCIdx    = 0;8 b1 F( T9 }9 S5 h7 I
                paramSet.destCIdx   = 0;' Y" V3 o. U5 _5 W9 h9 }
                paramSet.aCnt       = PING_PONG_ACNT;5 u& y. ^" u0 T# y# t5 f: g+ \+ A  b
                paramSet.bCnt       = PING_PONG_BCNT;
3 Y: F# o( }; K( d: Z                paramSet.cCnt       = PING_PONG_CCNT;- s) L' @* R/ a$ x5 `/ I
               
+ V) s3 k: j8 F3 _- |                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 D0 [8 L9 O! ~                paramSet.bCntReload = PING_PONG_BCNT;5 O9 U* p; P' }6 v) I) b% {& e

4 ]) P0 \0 }; p2 l% l2 c                /* Src in constant mode Dest in INCR modes */
! b9 m: r3 `! Q                paramSet.opt &= 0xFFFFFFFDu;
1 S; [% `1 S6 @                //paramSet.opt &= 0xFFFFFFFCu;
" G. h3 C0 Q; e/ o7 Q/ C" f% t3 _                8 G8 a7 J. L8 V
                /* Program the TCC */5 i3 a' d: j/ g( }  N( n5 |, `
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# L3 V$ n  N3 A' o' E+ |
  V1 t) l' A  F# U' e" G+ _  {- \0 U
                /* Enable Intermediate & Final transfer completion interrupt */' s) |: [5 S) n4 w5 N/ ^: b% k! N$ o% q
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
) j% a! X# ]/ c                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ \3 d1 c* y; \. D+ G
% K' R- `0 C1 [! g9 |# Z                /* AB Sync Transfer Mode */% C( s+ s$ Q! T' C" d
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% j+ T1 f3 t6 U                " v$ C' k3 C, {: t6 Z+ q
                /* Program the source and dest addresses for master DMA channel */2 e/ k9 B5 [% q: T; x& I, P* I
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);1 H) G3 o5 D9 j  ~$ I( a
                paramSet.destAddr   = (uint32_t)(ping_buffer);. v5 V+ _' e! T; X: b- b3 Z8 `7 n2 a

, Z0 Z8 d$ R/ o' N                /* Write to the master DMA channel first. */. i. v6 n& Y& t9 f* `3 W/ L2 j
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);! g+ i' N! f! b
    }       5 s7 Z+ P. d1 ^3 ~& ?# _, f

9 u: P7 o. C& l2 H5 _# s4 ]        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* P5 }  t: t1 m" C& x& x       
7 V- {+ F2 N" q+ t; u    if(result == EDMA3_DRV_SOK)
; _. B3 ?, v% g( P3 `" j* [    {
. y, E' k, S8 _, e4 n            print2arm("edma3 driver init success.",0);: p0 }6 o0 G0 A2 O( o+ H
    }
# f1 |, G' D, m. F7 G}
; B" e& H) n; W- Q! a! h% \7 `9 ^& y$ \# u# y- ^8 q5 V1 B' H

! Z& \' k: b1 t! a% s( ZEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" E* w6 p0 ^1 c8 x5 b

3 l3 r/ Y7 O) p( e
9 o9 ?( ^+ o4 n) b) d8 V2 z
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* @6 S- }0 }; ^8 a1 ~
每次DMA传输完成后都要再次使能传输
3 g  F7 o) {( A4 `6 R, q/ `
原来是这样,我明天去试试,谢谢了!




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