嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" {; K& N/ H3 ?7 |( V% e#define  PING_PONG_ACNT          1" _0 e3 X  X2 G
#define  PING_PONG_BCNT          8*32*40 6 I5 J: d! Z4 b# E: A
//#define  PING_PONG_BCNT       1 . V" {: s+ D$ h- F( B
#define  PING_PONG_CCNT          1
6 M4 ?+ I1 z$ C( U6 U3 t. u; ^#define  MCASP_BASEADDR          0x01D00000" j  \, T+ x3 [
#define  Mcasp_RXEVENTQUE        (0u)
) a$ v( ~# r1 [& i- u6 e, U
6 L0 o* y: s: C& a1 n/* OPT Field specific defines */
; Y5 F; B9 ^- d#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
9 `5 c" c& X4 t#define OPT_TCC_MASK                        (0x0003F000u)
7 v( H6 }1 F$ J7 B: K% _#define OPT_TCC_SHIFT                       (0x0000000Cu)
. ]  l8 d* |7 J0 g8 m9 f8 D#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
/ i" X; v, d4 ?6 x( M#define OPT_TCINTEN_SHIFT                   (0x00000014u)
% R$ y# k, G/ n. J6 g% e! m1 A5 d: ~& ^( a
char ping_buffer[PING_PONG_BCNT];
1 u+ I; t3 a' a6 S& g3 Hchar pong_buffer[PING_PONG_BCNT];* U3 b- n' I- @& \5 X7 @

* n) @1 k, ?& b* b9 r! L
! ?- {$ T; j& O5 F+ h0 ]7 C' k- W2 J) E4 B

2 U, d% B& Z* q5 ]static void ys_edma3_init()
# N1 M3 j+ M' r7 c( K3 O: ~; e{9 [& h4 M) [' V, c; j, q4 ~
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: ]/ W( W( z$ v+ `& }        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# h) `# h" B( y6 q: \
        EDMA3_DRV_Handle hEdma;
  z, ?" a" l1 D/ f5 {  h# O    uint32_t chId   = 0;
# U1 O2 R, Q6 ~& w7 [# W) J    uint32_t tcc    = 0;' Z( z* @4 v# N, K% D
4 E: d7 R8 X, g: A* w* r
    print2arm("edma3 driver init...",0);
! ~6 c: A$ z0 {! |5 G$ u7 o4 `, c6 p1 M4 o7 l1 l
        hEdma = edma3init(0,&result);# r6 a% ]0 ^: Q8 {4 j; O/ t  b" `
        if(hEdma)
; K& N$ ~4 c/ t0 m# j) T4 p        {7 U: g7 E0 S, o4 Y
                print2arm("edma3init() Passed.",0);
, p8 n1 g# T2 V2 i* K        }9 T0 p5 ^1 b" H- m
        else, R6 r) `# r4 W+ p8 c/ {+ P% _# p
        {
' W. ~4 Y# r4 z8 D! D( J2 j                print2arm("edma3init() Failed.",0);# |, j* t7 K' o6 [" ^, \
        }
4 F4 Q) l' d* p9 m. A* Y        ! b  W6 y8 ?3 D- T% |& |4 E
        if (result == EDMA3_DRV_SOK)
# S7 f2 T! Q- Z( V  X! R. ~    {
. m; _+ M, ~( Z/ P5 I' J; z                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& c; r. \+ ~4 R' a/ o                                                       (EDMA3_RM_EventQueue)0,/ w7 s, u' S2 ?# [
                                                            &edma3_isr, NULL);: f: F- U$ M/ S% j
    }3 B2 G5 O( I& C6 {! }4 `
        1 x7 p: D, Y! |
        if(result == EDMA3_DRV_SOK)8 ?0 D# J+ W7 J7 L: w
        {
. }; Y! [  `9 z  M* S6 u& \                paramSet.srcBIdx    = 0;
1 h: D9 C1 r; V+ J- @3 K6 z, l                paramSet.destBIdx   = 1;$ q/ x! w* y# t8 T2 \% o
                paramSet.srcCIdx    = 0;
6 p4 ~* r% N& A: N2 T" e                paramSet.destCIdx   = 0;) _; r  f4 y3 Y% F8 L0 F
                paramSet.aCnt       = PING_PONG_ACNT;
7 _! K. ]. I, j# h( S/ K, n/ ?                paramSet.bCnt       = PING_PONG_BCNT;$ w& q2 Y: P7 @( J
                paramSet.cCnt       = PING_PONG_CCNT;$ f, @0 S$ N( C( K, i* e8 U5 B
                # q6 C8 y8 |7 r+ {4 T
                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 q/ x) H* Z) \  K+ ~- j' u! E* R                paramSet.bCntReload = PING_PONG_BCNT;
1 N+ x3 V  Z0 k, {5 @; }7 ^& p) N
6 K4 |. m; P  D4 |, ~- E- c                /* Src in constant mode Dest in INCR modes */
; F. a/ _/ G: e; c3 ?" ]                paramSet.opt &= 0xFFFFFFFDu;- m! z" g9 f( `" ?8 u3 I
                //paramSet.opt &= 0xFFFFFFFCu;; A  a! u8 f) W/ P) R1 |2 L" Y
                " i. b4 i7 r- m2 w, d% D. V6 r" f
                /* Program the TCC */6 T; l: p4 d, d! a% O- r
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);% V% z9 _8 p" F+ y% ^$ l7 p8 y
/ G4 A+ ^! r$ ?2 M& m& q- k( x
                /* Enable Intermediate & Final transfer completion interrupt */, L( c' B( m5 x# }/ H
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 x+ B. D! b4 p3 p) i5 K
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);5 ?# \! S2 _% R' ^+ L

9 M1 F. ^6 n: w8 r                /* AB Sync Transfer Mode */, I4 g  `2 w/ K5 t
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);/ a# R# t; |# b+ n; v9 B1 N
               
! J$ u& J) u0 }                /* Program the source and dest addresses for master DMA channel */
8 ~2 K- {$ S+ p4 i0 M. \+ a! E3 ~. a                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);' d/ o5 q7 g0 \+ o
                paramSet.destAddr   = (uint32_t)(ping_buffer);
+ Y/ B( ^' [5 c2 p/ V1 {- I! N2 L0 q1 P" |4 e# L) N- d- p* I+ c
                /* Write to the master DMA channel first. */
: M9 h1 f+ G9 u: g                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' l8 T9 ]1 O* _" f    }      
  R4 v4 s# d% K( i0 O& J
# ~( V; m- P( O+ ?) Z" R$ c+ P        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" ^, ]6 M5 z" Y$ c: ^9 H- e       
% s! K# {! O3 V9 c6 i) X3 I    if(result == EDMA3_DRV_SOK)
" ?9 F. B, O/ |3 @# A0 l    {% W6 [: p& Y- z3 M6 x6 r3 V
            print2arm("edma3 driver init success.",0);3 V% {# B: I3 j. q
    } + \1 G. n3 G  ^& S; C3 {7 [- A, {/ o
}
# `1 C$ z' M3 S2 v; o7 e) y: j7 p5 S. E& ?" S5 G9 e# }4 L

2 B( X. p- G" I# b' Z1 XEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- k( \# L$ Q) f& }- M* g0 z& z
2 s9 k# B$ ]. i7 R9 u' Y, A: j+ L* l0 \: y- g: U" m9 a/ w7 F: I, N

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:470 p& I: Y8 F3 g& P' A- l  p
每次DMA传输完成后都要再次使能传输
# C, a8 H; K' u9 c3 M
原来是这样,我明天去试试,谢谢了!




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