嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:3 J1 x6 D. p) q% _
#define  PING_PONG_ACNT          1
6 u3 m# h. c  T7 E9 T- O5 C#define  PING_PONG_BCNT          8*32*40
- B1 d8 j( {; f$ s$ \9 P6 n//#define  PING_PONG_BCNT       1
* w& R# d( }+ s. ~1 b#define  PING_PONG_CCNT          1
/ o, ]0 P) }& E5 {#define  MCASP_BASEADDR          0x01D00000
+ B) j# y+ g) k# `* U#define  Mcasp_RXEVENTQUE        (0u)- e1 c; v4 {' P  S

/ B% ?) F- p( d4 {- i5 ?2 z/* OPT Field specific defines */
4 j2 @  {6 x1 E2 O  F& B4 V$ {#define OPT_SYNCDIM_SHIFT                   (0x00000002u)8 F5 @& }5 `) K' Q" H# ~: K+ ?
#define OPT_TCC_MASK                        (0x0003F000u)/ O$ z; B5 E) ~) q0 R  V
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% \: w! @. A! ], P7 p5 [#define OPT_ITCINTEN_SHIFT                  (0x00000015u)6 f4 ?& ~8 h' L4 f  W
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
; f- ^  |' S9 ?3 v
! W& H9 A" q2 ~char ping_buffer[PING_PONG_BCNT];
" H3 M, _* N- ?  ychar pong_buffer[PING_PONG_BCNT];$ V0 f- a8 [, K8 |, e+ J

  S9 b  d: V. ^' i0 B# I5 ?/ D2 u6 f, ^
+ y4 S; O# B7 ^" F. {( M- v( d7 \/ J$ S7 h

% C1 L$ G: }- W/ e# |$ K9 [static void ys_edma3_init()
! B" |# t" G8 Y" b5 a1 d3 O{
! j- P: R; W5 I2 D% o9 ^( H        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& o" O6 x, H: G. e; B6 d4 G
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; P' t" H/ c. x# J( S/ x; O. X        EDMA3_DRV_Handle hEdma;
% \0 b' q& }8 j" R    uint32_t chId   = 0;5 S: K1 [8 E& K
    uint32_t tcc    = 0;. y0 W8 p1 t& T& Z, ^+ ]: [( P1 ?
7 ]* J# J4 w* W0 F# Z6 H6 x1 R
    print2arm("edma3 driver init...",0);
2 M/ }7 W) r3 z
9 r5 E( Q; [; d# g6 _4 {        hEdma = edma3init(0,&result);. v4 V" z5 D" U8 r8 P; I- v* a
        if(hEdma)! Q2 I5 f$ w& h$ g- u0 b% z
        {' V5 ~2 Y/ Q' G2 E" @: H
                print2arm("edma3init() Passed.",0);/ o6 O+ t: D" i* W" @$ m
        }
# K- C, u2 n4 Y        else; K2 f' @3 h  z/ b
        {* D4 E* g0 \/ x
                print2arm("edma3init() Failed.",0);, G' q6 C% l- F. p& a3 v! B/ W  T
        }
; W; p3 S9 d9 ~6 G8 a       
& {- y% P4 @& R        if (result == EDMA3_DRV_SOK)/ I, N( ~8 n' b# t( C
    {. G; t+ _3 }! ]5 g% `( h. ?# E* f
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% C3 l0 Q9 _; t$ G9 j" m5 Y: x# E5 i                                                       (EDMA3_RM_EventQueue)0,
3 T5 a" R7 x( Y9 F/ k; v- Y                                                            &edma3_isr, NULL);. _+ e" m5 s7 L- I
    }. w: K# R! E7 W- B  J0 i% ]
        6 b' p; u' I/ K8 O# Y2 y
        if(result == EDMA3_DRV_SOK)  s5 f) d. R" p9 S1 a1 z
        {
5 f6 H5 V' T( g* ~" a4 f                paramSet.srcBIdx    = 0;, R$ q, O% w+ D) `  R) m+ `
                paramSet.destBIdx   = 1;2 W( }( ~4 k( `& H8 w  J
                paramSet.srcCIdx    = 0;! G: M# u. Z" H0 D
                paramSet.destCIdx   = 0;% p7 J/ W! e' V. y  _' w
                paramSet.aCnt       = PING_PONG_ACNT;
( E1 Z* Y0 n, [! u$ P* D3 N                paramSet.bCnt       = PING_PONG_BCNT;* w0 D" K' I! `$ _" T2 [
                paramSet.cCnt       = PING_PONG_CCNT;" d/ C3 b: c4 T
                % D5 Q% d$ |1 ?' g2 M3 x1 {
                /* For AB-synchronized transfers, BCNTRLD is not used. */- U' b! m4 H. k- n
                paramSet.bCntReload = PING_PONG_BCNT;
8 v7 {5 K2 _! g1 m7 w+ |2 x1 E) M; ]1 a) p
                /* Src in constant mode Dest in INCR modes */
' I) {( ~# U& I! K5 ?) w                paramSet.opt &= 0xFFFFFFFDu;
- v& o  ~2 C$ a) L& m) v% p* s                //paramSet.opt &= 0xFFFFFFFCu;
! M+ A4 X- C# a; r, _% S                1 e( [6 G4 W# s& j
                /* Program the TCC */
: `5 D& g+ \  V. C" u+ F) u6 V. b                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# F* P; E) Q* r$ `- `& o" }/ j
/ F- q3 z) u0 `: K
                /* Enable Intermediate & Final transfer completion interrupt */. @' X8 z; G: b4 w0 O
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ O9 T5 t, `9 n  f' x/ p' s0 c
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);; h2 k3 x+ A9 Y4 Z

& j/ i. h# ~  {* `                /* AB Sync Transfer Mode */
# V' |0 }7 G( a1 {, j6 b$ k                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);* o1 Z2 q5 n- D# g, z$ r' T
                1 T, b( n- R; [  P; l
                /* Program the source and dest addresses for master DMA channel */
0 t' X0 n- I, b# t' n) ~                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 P. ^) B7 Y+ v) J6 N                paramSet.destAddr   = (uint32_t)(ping_buffer);4 ?+ g' g- W- Z9 d
$ v0 O+ K5 W) P" i: f$ x
                /* Write to the master DMA channel first. */) A" m9 [; l2 Y; ^
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);8 ?9 Q: P, m. z$ i; P! Y) |
    }       ' V& A+ }. h$ W
: y# U, K9 I& m9 [6 U
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# j7 T* `! k# l$ O$ D, g6 j: R       
; e% b+ t4 c' U) ^" `    if(result == EDMA3_DRV_SOK) 0 B3 r  E" U4 c3 E3 U# O
    {
* K# I2 [: {) M, B2 }0 z! ?6 @* [- d            print2arm("edma3 driver init success.",0);2 X% ]. S0 x2 X7 i! ~; _5 C
    } 6 g) x  B3 Z  c* g$ \) j0 N
}
# ]; q$ y" {6 T1 Z5 M1 N5 ]; [$ F; I2 |9 ~7 {0 v
/ K6 }! y. y6 `& [8 m  V- n% k' u
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。: y. Q* V4 c! O* @& Y( D
" E  T$ O3 [/ W' }

+ ~- I0 Y5 x/ J4 v$ M
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47: q/ i% l+ h( q( S& f
每次DMA传输完成后都要再次使能传输
) |1 n3 I0 w6 K- T9 N* b* o
原来是这样,我明天去试试,谢谢了!




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