嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 G% x7 N8 @2 Q1 t4 ^+ a#define  PING_PONG_ACNT          1! C, E5 F4 l; M/ n2 I4 I
#define  PING_PONG_BCNT          8*32*40 8 h7 b/ i; c& n* {- y2 s
//#define  PING_PONG_BCNT       1 3 S) n2 T3 w  @- \4 y9 F
#define  PING_PONG_CCNT          1$ H# ~) v) n# D
#define  MCASP_BASEADDR          0x01D00000: j: h: ?% w% E; }; e4 y; l; u
#define  Mcasp_RXEVENTQUE        (0u)
3 ], i  @+ S, c1 }
) S/ o, P1 \2 z& z" v$ @0 Y3 L/* OPT Field specific defines */
- p' V" j5 G, @* ~0 ]  F#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
- v5 y+ b$ G! e3 R#define OPT_TCC_MASK                        (0x0003F000u)
2 x: l8 a/ C6 D# C3 o$ r" r#define OPT_TCC_SHIFT                       (0x0000000Cu)% b8 |0 E  K/ v8 ]% ~+ f( ^
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)" a% I+ @' n2 J/ _" S$ `, D
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
+ o2 @& W# t8 p; G2 x5 Y3 d5 i0 G
, B& n. R6 J" hchar ping_buffer[PING_PONG_BCNT];
5 G3 y1 }' ]) G0 j: r$ C! B' ichar pong_buffer[PING_PONG_BCNT];; Q6 h6 [/ m& e( x$ t
; G+ w/ L) `% B: o
, s$ n  J1 A1 b) O. w7 B6 c8 u
1 T- |& p9 i& b5 ~
% ~, \2 f/ x) L: ~7 w( ]6 O
static void ys_edma3_init()
0 [/ z6 ]9 m: Q{0 R' H! ~: a2 J$ S& P
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ }- F/ o, E  A- ]
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ a4 w; s- _+ L+ g4 ?+ ^# O
        EDMA3_DRV_Handle hEdma;
& {- B7 L" w8 G$ I4 u) i    uint32_t chId   = 0;7 C/ z$ \0 ], B
    uint32_t tcc    = 0;
2 }1 S- {# _2 j! f' v% e# s% M
* ^$ S2 O# Y- W    print2arm("edma3 driver init...",0);5 t' I0 r9 t$ l9 {, p" _

- k) X8 [2 ]/ y/ o( c' @        hEdma = edma3init(0,&result);# j8 T& I* [0 o# B! S( R% b
        if(hEdma): w" ^1 }! l1 ^/ C/ ^
        {- r- v6 x5 |: ]/ v+ o& A/ Q9 a
                print2arm("edma3init() Passed.",0);
4 [( X6 T4 V- S- I        }& r, w1 [  w  v0 r( c! ^# o: s$ i
        else
8 h1 ^" w9 y* V7 x% g        {0 S: i/ I" D1 H4 k- }
                print2arm("edma3init() Failed.",0);; @( f! [5 O- h' J$ ^, Q9 Z
        }
4 P: ~# j6 [) ~; X4 d0 c2 y       
6 T# u# j) F. E/ I5 y. }        if (result == EDMA3_DRV_SOK)
& o9 V- p/ H7 U  d    {
2 h# O, l) ~4 M                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 z) J/ [5 E: G' I& f9 t6 x                                                       (EDMA3_RM_EventQueue)0,
' L1 X$ Y/ S- I% h3 r                                                            &edma3_isr, NULL);. F0 n2 E  k6 Q) s
    }
% j7 m* N2 N/ a3 u) j, H2 d) v0 U       
0 S4 T7 u7 P$ o; k        if(result == EDMA3_DRV_SOK)0 _$ D- K" Q9 y1 S( \3 Q
        {
/ V! b5 R0 o1 c! N0 F                paramSet.srcBIdx    = 0;" H3 L6 N! o. A/ I$ h( g6 j, i3 ]
                paramSet.destBIdx   = 1;+ \: a2 O1 `% J5 h, R
                paramSet.srcCIdx    = 0;+ @6 w1 n/ o1 g6 U
                paramSet.destCIdx   = 0;
3 O9 h( p, Z! g5 w                paramSet.aCnt       = PING_PONG_ACNT;
" k8 J! A* m# O! T                paramSet.bCnt       = PING_PONG_BCNT;3 ^, |0 i; i1 V4 g( A3 G$ j0 \9 D/ R
                paramSet.cCnt       = PING_PONG_CCNT;
, F6 p! r9 R0 M6 Q$ d0 K                ( F: [. R( X$ z9 ]
                /* For AB-synchronized transfers, BCNTRLD is not used. */: [: U1 f7 a8 [) p. }3 f
                paramSet.bCntReload = PING_PONG_BCNT;
( R" X+ p& ~: q+ ?0 o
7 _. ^, T- `* |  g8 u& y; \                /* Src in constant mode Dest in INCR modes */
' i' G2 Q$ f4 J7 _                paramSet.opt &= 0xFFFFFFFDu;! s8 n' `. R3 P: o, g% N; P! F
                //paramSet.opt &= 0xFFFFFFFCu;
# z- l1 A( w8 g/ S7 O4 W/ r                * H4 C# Y+ \' S! {" K  R# }8 H
                /* Program the TCC */
  v/ w5 F, J4 g                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. K. c+ E( S1 }, g- h0 g) O3 |

8 y  E& a: Y, F5 ^6 s) L8 |                /* Enable Intermediate & Final transfer completion interrupt */1 @$ x; O' u) d, t; q
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! s! q! [6 i' n* L: V
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 G/ H; O  B7 m4 A* j! x
, @: r2 E1 W( x( a& M( H1 i
                /* AB Sync Transfer Mode */. e& i# b8 |' m/ }1 f$ w. F
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 [! o. H% S' H. d               
8 j) k2 L% Y+ c3 |* S" H. ]- j                /* Program the source and dest addresses for master DMA channel */
; v( U  D# K% _( H/ f2 o( c4 P                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
4 P% W$ l, `8 F, x                paramSet.destAddr   = (uint32_t)(ping_buffer);4 @# W& e- a( [% |

/ R- m+ |5 @' t4 }$ u$ D, |& z' N                /* Write to the master DMA channel first. */
" W: v+ Q$ \3 Q* i* D- E                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);7 \! ^3 c& m3 m% ^6 W# I  H) Y
    }      
3 v1 X& C% ^: Y7 J% y5 a+ ?% ^4 U6 P
6 L- d0 h/ w, r; q        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) a4 c7 t) h4 K8 y& s) G: _1 X        ! b% H! h4 S3 n  S) e
    if(result == EDMA3_DRV_SOK) ' i0 n& a0 C- V- n1 z, n6 ?
    {
) b/ s% N( R0 j+ g$ p  Q            print2arm("edma3 driver init success.",0);
5 H( G# A$ o, \1 Y# ]* u0 T2 p" }5 ~    }
" d" w0 @4 g% c; h( R, a  x}
/ v7 R+ ?1 ?  E% C  U
+ C& l: b! \- D* W" l! r8 m
# V5 p! J# t5 l. \0 s; `EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, w1 s- I) S  a

8 M5 ]8 X; c( s% D+ _4 B
" I, `; r: s* m
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% c' T& A6 J' [- @" M每次DMA传输完成后都要再次使能传输

# a! Z- h. R: Q% z原来是这样,我明天去试试,谢谢了!




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