嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 F' k( V6 \+ C& a$ E  r#define  PING_PONG_ACNT          1
% F- j& S7 U9 w# w$ q#define  PING_PONG_BCNT          8*32*40 * A8 R! H( ?& y1 z6 k
//#define  PING_PONG_BCNT       1
+ `. [& A1 _' \: a! y#define  PING_PONG_CCNT          15 t4 ^- y- A- U
#define  MCASP_BASEADDR          0x01D00000
$ K& d/ O. C" Z% c4 @$ s#define  Mcasp_RXEVENTQUE        (0u)
$ C" r' L6 ?) r& B5 S7 F" i& u, y8 z, n% P. x, m% i
/* OPT Field specific defines *// W1 j! j/ W9 s7 N
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
6 s& i  t- f* i( x' I9 o0 f#define OPT_TCC_MASK                        (0x0003F000u)$ `9 M6 ^. {& c5 z6 i- Y! Z: H
#define OPT_TCC_SHIFT                       (0x0000000Cu)) \. U5 z4 o  T' h- r- V6 W, Y
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
) |# R* u3 m% a! p% ?# l#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ }: A( {' s5 b# B* D7 [# p
1 F5 W' }1 N3 V7 ~) n/ x3 \: h( {
char ping_buffer[PING_PONG_BCNT];
# d* H, I5 w8 s9 M6 dchar pong_buffer[PING_PONG_BCNT];
) X7 y4 R2 d; ^; g' u  z6 T% s, ^. R* g" q: e( Z" c9 @
) V, X8 ]7 O8 C7 N( B
$ N% ?5 q3 c5 b* X# o
. E; p. u3 b+ c& Y0 m0 W
static void ys_edma3_init()  D- ]! [, V3 T. R  C
{7 [" ?4 Z- x; y' Y9 e
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( @. O* h9 z9 @2 `! j
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 I2 |4 z: |! |4 }: F" I' E        EDMA3_DRV_Handle hEdma;
' L& c- A  d/ ^0 q4 Z/ y  a% x    uint32_t chId   = 0;
+ _$ g& }, n/ _: o- A    uint32_t tcc    = 0;
: l) l. l9 L" l. b4 h8 b& @9 C4 w: Z' j3 f( c: e
    print2arm("edma3 driver init...",0);
. d! |! X3 i# g4 s% e$ H/ s# f. j1 J3 ?5 Q& ~! J9 K0 o$ ~# s
        hEdma = edma3init(0,&result);% c% B' b0 V0 i6 R2 L! b) n0 [4 J
        if(hEdma)
( @8 x7 z. p3 f& y        {
$ g8 k2 i5 `; j; _! O" c  r5 X$ y5 [# Y                print2arm("edma3init() Passed.",0);5 Y. f9 o! S* \
        }4 K" d7 c5 h6 ?7 p, V
        else9 V& p8 D! Q) O) E
        {% i4 a* H3 G- b0 g  B4 O- B& f6 i
                print2arm("edma3init() Failed.",0);
' W) B$ V) q0 c2 _        }- [% f! y" h  t( [$ @
       
5 J' d$ V/ u/ J, T; v        if (result == EDMA3_DRV_SOK)
! p/ t6 V7 P7 f" v: N+ I" j    {
' Q' [$ w9 M4 o8 d                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ r! x: B$ D0 f4 w! S" u                                                       (EDMA3_RM_EventQueue)0,
+ l: }1 _; {$ l+ z  _( f' }                                                            &edma3_isr, NULL);; y& @3 o) I9 X; Y: n8 z
    }
( a/ T" j% q* Z        . K- M; d3 z4 d) |/ Y
        if(result == EDMA3_DRV_SOK)
8 V; K$ j: Z* }  C: @) V        {5 p+ Y) K$ y1 @
                paramSet.srcBIdx    = 0;( Z5 w5 A# z0 N$ `
                paramSet.destBIdx   = 1;' K) d! I$ b! O9 `
                paramSet.srcCIdx    = 0;& U+ H. Y5 ?+ k5 S& y" t  c
                paramSet.destCIdx   = 0;2 c* p( W6 b4 b. T
                paramSet.aCnt       = PING_PONG_ACNT;
3 n1 k- }- E7 f' v# n% G                paramSet.bCnt       = PING_PONG_BCNT;$ e2 C2 J+ A2 }9 v& j- Z
                paramSet.cCnt       = PING_PONG_CCNT;9 W$ j3 j8 B( V" @7 Y
                . A5 S' ]* w+ G/ c
                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 }. y# Q% C: |  o! b' a                paramSet.bCntReload = PING_PONG_BCNT;" H  q* O2 y! |- P& K) y: F

8 c- d+ g+ \2 n+ m( |3 {* E                /* Src in constant mode Dest in INCR modes */- U% |) q. }  p$ l4 |# b
                paramSet.opt &= 0xFFFFFFFDu;" B2 T/ `+ o  g% ^2 `
                //paramSet.opt &= 0xFFFFFFFCu;1 w, P$ S3 m% T5 L. T
                ! n5 W" h+ z9 {; I. k0 \! L
                /* Program the TCC */
( y5 x3 E, ~% R; O$ k7 `, I, h/ S                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);6 \$ ^/ ~, z0 w4 e/ p  b$ r4 e5 q0 {

3 {8 ?' j9 V7 _6 U                /* Enable Intermediate & Final transfer completion interrupt */: ~! g3 s( d: i' {+ E5 Y$ z
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* K0 j3 `7 G' y8 `
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 H& O; h. M4 {5 t. k* n% n" `
0 z% d6 }  I) z
                /* AB Sync Transfer Mode */
' A/ e, P6 o0 Q5 B, x  Q7 A                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, r/ y9 ]4 n1 R4 k               
- t. l- S" i3 p                /* Program the source and dest addresses for master DMA channel */8 W" W+ ~4 x% {6 }5 r
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);8 |1 q+ H6 v: [" v- w9 B
                paramSet.destAddr   = (uint32_t)(ping_buffer);" N: B% @3 N* a$ k1 c0 F) n
# s! f1 @$ }7 x! |( G+ |
                /* Write to the master DMA channel first. */8 P+ ~6 n6 i+ O. a  y; H
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);; H$ Q9 Z. D. b1 W4 r. O0 l, G* n5 \
    }       ) m. C; J) w$ Q9 a

' C6 W& k" @- `* `2 i/ n6 I6 k2 D$ _        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);3 c; ^" ~4 _+ p3 k/ J
        3 B1 Y+ F. R  C+ G7 l2 f' G. |
    if(result == EDMA3_DRV_SOK)
3 V& ?' u; c; R1 A8 V- t$ h    {
% N! J( N5 I' T+ q* J            print2arm("edma3 driver init success.",0);+ j- l$ t/ A3 O( S+ x
    }
  V- U9 o* _- r4 x}0 p( U; k2 i% O' F# e6 }9 F8 L
& O( B% q$ @, U6 M: h$ T
- M8 `, j9 O0 d$ H- t: g/ L! I+ `5 V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。+ n7 C- p1 s4 x
1 ^9 [: ?7 P) ~$ u: z8 \5 l, w, U* q

; {/ j' \% ]; o/ F
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47' w* P# Z2 f$ \( @: `
每次DMA传输完成后都要再次使能传输

! h! r# p8 C3 U- ^) \1 p0 M原来是这样,我明天去试试,谢谢了!




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