嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& ^. W# e# }# d% S#define  PING_PONG_ACNT          18 N0 U( j3 x' {9 ^3 l
#define  PING_PONG_BCNT          8*32*40
% j' k  H( g; E4 o6 ^//#define  PING_PONG_BCNT       1
% \9 j+ D9 x3 S#define  PING_PONG_CCNT          1
) ?1 G& ]0 X% @" m* H# I#define  MCASP_BASEADDR          0x01D00000
6 P* h1 T+ D- c) ^2 p9 ?! r$ m9 _#define  Mcasp_RXEVENTQUE        (0u)  L( R& ]7 D3 ~1 `* U& B
' d; {& k; y0 @/ ^8 Q1 @
/* OPT Field specific defines */
. |2 L4 o- c  j#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# J; O- R" e( F
#define OPT_TCC_MASK                        (0x0003F000u)& e/ Q2 g$ h$ y% p8 e: Z8 {
#define OPT_TCC_SHIFT                       (0x0000000Cu)
# e+ Q3 w, W( U/ V#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
& e$ J& [0 Z" L#define OPT_TCINTEN_SHIFT                   (0x00000014u): Y/ @4 F7 I+ N* R

! c; y  X; @3 A- H# y3 b+ y6 e% Kchar ping_buffer[PING_PONG_BCNT];( x- {) z3 q) J* @1 n  H4 U7 ]
char pong_buffer[PING_PONG_BCNT];) }6 v+ I' h% j- T% z

) d4 k8 L6 g* N3 k0 S
3 u2 m: J. U2 R9 O
* S; V4 F3 a" u4 f7 i0 p& C, M0 l% |, |7 i, e2 S0 o3 v9 f8 C; }
static void ys_edma3_init()8 F+ W* J5 u% f) R3 y
{
4 D! ]; c4 @  B  I# I        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( V" q- k7 \( q/ @2 w6 ~1 Y
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ Q0 s( _7 }, t/ `2 T        EDMA3_DRV_Handle hEdma;
* k+ h  M# j2 o& R    uint32_t chId   = 0;2 j' K4 k/ C6 U3 ^% n) Z
    uint32_t tcc    = 0;
6 u; Z' c8 u. E* V' x9 w- H2 W. J, f0 F' c
    print2arm("edma3 driver init...",0);
1 t: Z1 h; v, `0 `7 T  G
! B" }2 `& c1 l" ~$ ^, [2 C        hEdma = edma3init(0,&result);% C. j' g' V4 \% c( ~
        if(hEdma). p. g' @9 Q# q; l, R) w" D
        {4 y' M; t7 w% p, N- C7 C  r
                print2arm("edma3init() Passed.",0);, t3 y6 t$ O* W9 x9 V3 W
        }) Q; W. ~0 F2 {) {9 J" C3 v+ m( F( b5 J
        else
- ?6 r& @7 ]7 k1 D        {/ W7 |& u0 u4 G9 s- ^, l
                print2arm("edma3init() Failed.",0);
9 e! e. N3 y% S8 A( c        }
7 g6 D; D+ i5 k- A7 z' l        - q7 w. \* {' ?2 G$ B. F2 t: F
        if (result == EDMA3_DRV_SOK)
8 B9 }" v, C6 ?# I# V; P! O5 q* y    {$ Q$ u7 A- V9 m
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( k% s2 }' {; ]) J- n9 ^
                                                       (EDMA3_RM_EventQueue)0,# k! t/ o5 S' w; P  h1 E6 u
                                                            &edma3_isr, NULL);
& k" E3 \  N' Z, A& r0 E+ r( i) k6 K+ o$ N    }
0 u: {7 p2 a* D, S1 s       
& U( E6 M; d6 N* }) z3 ]7 z: u  M' D        if(result == EDMA3_DRV_SOK)
, t5 O7 v7 l0 z+ _* H        {
" I# D' M. z% q4 R& t3 G8 G# k                paramSet.srcBIdx    = 0;
& N" Z% Z# X& R1 @/ E; M                paramSet.destBIdx   = 1;
& V) \" S% k5 R9 v0 Z, |' y                paramSet.srcCIdx    = 0;
, Q- w1 X+ y  y8 T) q% T; o4 Y                paramSet.destCIdx   = 0;
& P- p) B( R6 K2 x# ]0 O                paramSet.aCnt       = PING_PONG_ACNT;7 J" h- m, X% h2 y( U, h
                paramSet.bCnt       = PING_PONG_BCNT;; o6 g2 x7 w* ^  ]$ q1 ?9 a& _* Z
                paramSet.cCnt       = PING_PONG_CCNT;
/ J3 m) y0 c3 h                0 J% K4 W1 `, ^( N0 f5 ?
                /* For AB-synchronized transfers, BCNTRLD is not used. */
4 r) _2 J, `/ W& S0 t                paramSet.bCntReload = PING_PONG_BCNT;: G( C. Q  Z; _( f  p) ^& `
% i8 m4 g) R) U
                /* Src in constant mode Dest in INCR modes */
1 F( y) y- }; Z; r                paramSet.opt &= 0xFFFFFFFDu;
: ]( i# e3 H4 Z                //paramSet.opt &= 0xFFFFFFFCu;
6 V' x; N" j6 I1 ~6 {3 x               
% C- H3 d9 s, G/ _7 \                /* Program the TCC */
* N) i# c- m( k. v+ F- \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);- Z& z# l" q4 m
' [9 s& D6 W! A
                /* Enable Intermediate & Final transfer completion interrupt */
) \' J8 ~9 a" S8 F8 D# s* `. L& P                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, G+ i5 e0 q2 h- {
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: m! q# y+ x% M, g5 \6 z9 p! Y* R
% l) E6 W) G( R0 _7 w4 b! i# A                /* AB Sync Transfer Mode */4 v# R# P" v* b" e( H, z
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# p% u5 E3 _1 G/ D8 D# ]5 p( l               
$ q* J8 R2 \% Y) C  @; b- A                /* Program the source and dest addresses for master DMA channel */
8 i/ W. U7 N, ~& t  t                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ h8 l" V5 e* o* r; c  Q
                paramSet.destAddr   = (uint32_t)(ping_buffer);
9 P+ i1 N( _6 B7 b) ~# ~' p+ o; v3 p$ K( v) u2 k, e& W0 h
                /* Write to the master DMA channel first. */
1 `  A# c- E% @" X3 C. Q                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' F- i0 `9 a0 _+ ]5 `    }       ' X' Z8 i) d3 Q+ H% x  c
) |. I- \( q4 T
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% K- M; U7 V0 K' r       
& o0 W) d# V1 r! C# G, V" _    if(result == EDMA3_DRV_SOK)
' M7 V0 z: A5 S+ y+ D9 [    {7 O3 B" m9 P  z) y. U& t
            print2arm("edma3 driver init success.",0);
* I& x3 P+ g4 z, B. r* N" Z3 F) d( r    } ' Z, [* A3 ?& d  f" S$ ]
}
9 ?5 h) @' s, s* z$ J: Q" q0 o( i" [. J( t5 k& v

6 r9 @& b; V; o& t. AEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 S; a) a8 J6 ^$ t7 A

: Z2 D$ s2 A4 N; I9 u$ [* Q6 T  G+ Q5 D' F8 u3 Z# t  K) ]

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 m" r  ^9 P) B
每次DMA传输完成后都要再次使能传输

' I4 R! R. L7 f4 N. ]原来是这样,我明天去试试,谢谢了!




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