嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- O- n4 I( t, n
#define  PING_PONG_ACNT          1
3 O5 e( x9 l. z8 y# p5 h& |#define  PING_PONG_BCNT          8*32*40
5 I! g1 e% v7 a3 q% ~//#define  PING_PONG_BCNT       1
" V. B0 ^. i* O1 A#define  PING_PONG_CCNT          1( I, r; Y# [2 d2 `( x
#define  MCASP_BASEADDR          0x01D00000
4 K+ b3 T3 q* i6 V( b7 q) j#define  Mcasp_RXEVENTQUE        (0u)
( W+ r( w% T2 v" ]: V5 w
( Y3 z; s" T. v. M6 H/* OPT Field specific defines */" Y* L3 N1 Z9 T. C) h
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)6 f" A3 n# g9 L
#define OPT_TCC_MASK                        (0x0003F000u)
. z% y+ F! p# k% I& H#define OPT_TCC_SHIFT                       (0x0000000Cu)
% d" D/ a8 \& S7 ?( y' u3 q1 G#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
/ T  j$ N. u% k4 T#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ ?& X  q( A2 e9 b+ _# ]
; R& F6 k  u0 m$ x% {
char ping_buffer[PING_PONG_BCNT];7 n7 P/ R7 \# H$ }
char pong_buffer[PING_PONG_BCNT];
; b8 k* u6 h( ?# c- J" c* g; ?6 E7 ^$ L
3 ^) z2 B3 w. H) V' y' O2 V* }( v

! y( b  _) Q3 U
& [( J# H7 |; y  J, U4 o- c4 O+ [static void ys_edma3_init()
1 s. d% U9 `& P, a. {5 T{1 G' `% ^1 v  p+ m
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 H/ y# n7 C! [* f$ \6 v* [; Z. P
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 q, [: N- C2 ~/ t: u/ _
        EDMA3_DRV_Handle hEdma;- ^% o5 P+ W, {" |
    uint32_t chId   = 0;
4 x. f1 m- Y: C" I& ~7 A    uint32_t tcc    = 0;
8 D8 R  `7 G/ l/ V$ B: H& Y. }- B% e) I3 X9 A2 D; c
    print2arm("edma3 driver init...",0);
: D* q  n& y1 z
7 z' k7 S0 ]  j5 A/ v* M9 H        hEdma = edma3init(0,&result);
7 y7 w& |& T/ f3 M        if(hEdma)+ ]: O( L9 n2 i" B1 R1 _$ i: N
        {" W* p& _9 o/ h, T
                print2arm("edma3init() Passed.",0);  y' ~9 v) k. I3 Y: `% z
        }
' ~6 M4 v5 Q% G1 N5 `) ~; E6 k        else
: h  O. R* \* b* Q* [$ h8 ?        {
+ J8 Q3 h# A4 e, f: C                print2arm("edma3init() Failed.",0);; N; e! Y9 R1 K, M' y
        }' b6 [+ Z9 \" o0 g3 q) d! {% \
        1 k6 ]* S1 }3 a2 V* P
        if (result == EDMA3_DRV_SOK)' g! v; L. [* c; E
    {
6 [) \  `9 ]* ^" @- x+ F2 }6 p; }                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,  [) |1 Z' z7 X3 E& Q. J
                                                       (EDMA3_RM_EventQueue)0,
2 @0 D7 j, R' F- s                                                            &edma3_isr, NULL);
8 F/ i3 s3 Q& V' q7 R9 i    }
/ e3 i4 U/ F& ?& e/ }" m9 q        / L" A  v) n6 h1 m. H6 D7 E' H& @
        if(result == EDMA3_DRV_SOK)
& ~% _% a3 r3 J9 R, O        {
/ o* {: u$ F7 f* u. H. C2 U# ~                paramSet.srcBIdx    = 0;
1 A+ [" I) p2 S: h) `                paramSet.destBIdx   = 1;2 H4 `0 j6 `; W) `* [
                paramSet.srcCIdx    = 0;
( R. ~+ _, c1 k8 h                paramSet.destCIdx   = 0;
, M- P* U' Y4 S/ c                paramSet.aCnt       = PING_PONG_ACNT;8 c/ m, q$ n- @! f8 O
                paramSet.bCnt       = PING_PONG_BCNT;  p- [% Q9 d1 G4 n
                paramSet.cCnt       = PING_PONG_CCNT;$ h8 p2 Q( X( a* ]- o" [: m) N" E/ e/ {
                ; H$ Z6 W" `! a. i8 T: ~- O
                /* For AB-synchronized transfers, BCNTRLD is not used. */6 Z9 D2 f9 j& F
                paramSet.bCntReload = PING_PONG_BCNT;  ^0 X  H. K' X4 {
; t( |/ J/ t1 \0 G+ U
                /* Src in constant mode Dest in INCR modes */
  ]. `& K3 D( h                paramSet.opt &= 0xFFFFFFFDu;/ _4 a( B& X7 N- V; `- H; Y$ g
                //paramSet.opt &= 0xFFFFFFFCu;
( d% k! }5 M. _2 W                0 u' a( H& Y- E& t$ K
                /* Program the TCC */
, {. D# O- F; i$ N                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& b& j1 g8 G& M3 j: t
+ D6 `+ t; b8 Q# B; a                /* Enable Intermediate & Final transfer completion interrupt */
( i" z" Q( E+ L3 H& s: H                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& {6 S" R( x" l' B/ [1 `                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);# U! f+ m: ]; Z+ P' O
% G( J" U7 u2 B; X+ V) j( @
                /* AB Sync Transfer Mode */
4 ?( k1 P, j4 ~. D                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
* F( \* |1 {; A. I$ a8 c                . G6 }* m. ?- P# j& }
                /* Program the source and dest addresses for master DMA channel */' S  h# P5 }! s; Z8 J! u" J
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
, m; O% O6 I4 n2 ], i0 c! p                paramSet.destAddr   = (uint32_t)(ping_buffer);* m! s$ G( @( F
* D# W$ I8 n( h- A
                /* Write to the master DMA channel first. */
7 p! _6 }; b3 X" v                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 P9 G# `" s) @/ T  N) S+ u8 D9 {    }      
5 V. M) K. [$ m5 r% C) B! C: b! \
+ a- x+ ~  ?' m; u& A- _* A        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- n- a# W. X. Q% D  S; k1 M' F3 j
        # u% d; R! ]9 i" A& H% M
    if(result == EDMA3_DRV_SOK)
# |. E3 ^, x# ~; i$ x8 H    {
, l# K- d+ i6 E$ Y8 E  o            print2arm("edma3 driver init success.",0);( Y" q% y$ b' P- I! l* \! k
    } 0 f. `& n% _+ \& M6 ]
}' Y; a$ f8 \) V( `0 C
9 }8 l. l2 B6 V  S2 X# \
( q+ I( Z; [$ b8 C1 d2 r  G
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 d: v, f, }& b. f0 ]7 K, k! Y
. P5 c. G) X  K& g( D
- U) K' V0 R, e, D, d

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 B% p! R  T9 {! |& e9 ]% V5 @每次DMA传输完成后都要再次使能传输

$ I* z& {  q. p7 v原来是这样,我明天去试试,谢谢了!




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