嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 C0 s7 w. H4 K$ w3 _" X9 V
#define  PING_PONG_ACNT          1
8 g4 X: L# S0 {#define  PING_PONG_BCNT          8*32*40 : N9 k& d; [) R
//#define  PING_PONG_BCNT       1
3 |! v: Y' n* M9 V/ M* q" S, p#define  PING_PONG_CCNT          1
% D$ W" y5 k$ I4 ?& w5 e#define  MCASP_BASEADDR          0x01D00000
  }' b/ r( F' v7 y) D% r9 I( I#define  Mcasp_RXEVENTQUE        (0u)6 r. [* I! f, t2 T' e2 k7 h  t
# @) k, e/ d7 W  r! s* V2 {
/* OPT Field specific defines */
! i. r* Q& I! `/ |#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
* \4 [0 R& h4 w) l9 s. u. H% t#define OPT_TCC_MASK                        (0x0003F000u). u4 l8 m& t0 t5 ~5 ~
#define OPT_TCC_SHIFT                       (0x0000000Cu)
8 M( s  ?& Z9 M) w  O2 Y#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# f" i3 N+ ]- z: ~: _' ^#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) p1 X+ q. ]- {' p# [, n  G% X- T+ Z2 j  }
. L6 `$ ?- m% }7 B3 Ochar ping_buffer[PING_PONG_BCNT];
; P4 v4 D+ U0 V; A8 G1 t4 O+ Dchar pong_buffer[PING_PONG_BCNT];
& q* ?  b+ T: d0 @- F6 e- L
# E, |0 _0 _) A. e- a) y0 g6 v) v; o5 D

7 k- n1 m0 ?2 W2 W( ^% ?6 o; Y  ^1 Z3 o& ]
static void ys_edma3_init()
  o& Q4 \  p6 [5 T5 y{
6 _+ b( D( L# [1 Q/ I        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 Z  ~" S5 _2 k# I# e        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# a# J" G2 E; A5 j
        EDMA3_DRV_Handle hEdma;
( S# |- M4 s5 v) _0 N7 }    uint32_t chId   = 0;1 b$ Y# O0 C# c4 \
    uint32_t tcc    = 0;" ~* ^( P1 O6 Y9 v* [

+ ~/ G% |: K0 D! M) P6 o8 G! m6 S    print2arm("edma3 driver init...",0);
0 |2 |$ F% T' l9 F4 j% V$ E4 {0 `* K2 i. @3 ?7 T
        hEdma = edma3init(0,&result);+ r- }9 _6 U7 t& h% r: S
        if(hEdma)
( J: ?3 E8 p( e: i6 z1 ?: g. P        {+ `! j5 M& y2 E) t; u
                print2arm("edma3init() Passed.",0);
' Y* t. f+ |+ A        }
  P! m9 W. Z5 F        else
3 S% i' v! e$ t/ A8 r+ m        {
2 a+ X( {3 C0 x, X' `                print2arm("edma3init() Failed.",0);8 z. x: X) x4 j1 J- n8 f- H
        }
4 _$ L& K" V4 g; R: r' W$ m9 P       
4 ?! q$ V  ^# y+ k1 W1 i! V- ]        if (result == EDMA3_DRV_SOK)
. Q% f5 Y( [5 E' k) p    {
& C5 R3 p; E6 \; x                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,# Q! N/ C- N4 p0 N9 B; U( S
                                                       (EDMA3_RM_EventQueue)0,# \6 \! a1 ]2 m: ^
                                                            &edma3_isr, NULL);
0 U  t$ j' F' F& H9 B/ x$ v2 a1 J    }
7 P$ S! D* p( {! X8 ~7 u2 ~  [       
) u3 y4 D/ x5 \/ D( ?; E7 h( d" D        if(result == EDMA3_DRV_SOK)' t, P5 U$ d* G$ Y
        {
/ Q4 B" U) P+ _                paramSet.srcBIdx    = 0;
; {' S/ l4 `( _# `# X" b# ?$ y                paramSet.destBIdx   = 1;1 C: Y* m  m, L9 u+ k$ u9 h
                paramSet.srcCIdx    = 0;9 \0 Q9 O! q; ~
                paramSet.destCIdx   = 0;
, F/ h6 ^6 g1 g/ O5 f! S                paramSet.aCnt       = PING_PONG_ACNT;( D% ^* j" b& O% T8 G0 v
                paramSet.bCnt       = PING_PONG_BCNT;' i" N$ D& R2 @( ^
                paramSet.cCnt       = PING_PONG_CCNT;
8 u$ {" k$ j& q, V               
" y3 S" J3 G) ], a% }5 r7 g                /* For AB-synchronized transfers, BCNTRLD is not used. */  W  G$ c0 \7 A  Q7 n3 y
                paramSet.bCntReload = PING_PONG_BCNT;
2 b0 x" N) H+ |7 p3 K, l
. s6 i% i: }  b& x! w9 v; S8 k- A                /* Src in constant mode Dest in INCR modes */
& {# X% B/ R, C5 S8 k9 Q. i                paramSet.opt &= 0xFFFFFFFDu;
9 |# Z% l$ \9 B2 h                //paramSet.opt &= 0xFFFFFFFCu;" M7 U; x6 |4 q) J5 n, |
               
; b7 D, B+ k: J  `8 G0 f$ J                /* Program the TCC */8 i/ o# W, p/ ?4 w: e+ s$ z
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( f: ]( I4 m6 j" a7 P9 h( M( w8 l. y* r, R4 E+ s7 e
                /* Enable Intermediate & Final transfer completion interrupt */
7 P  P6 u$ }* Y                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 g3 y0 h& u( o
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& S8 ~4 Z5 ~1 x) F0 K" B

4 f- u4 w; q4 h/ g5 i# g                /* AB Sync Transfer Mode */
# o6 Z0 b2 e0 Z9 A$ S6 Y. |# U                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 n% z/ z. I4 O4 X. C& O
               
& o* z1 _2 G, g5 F6 M& B! {                /* Program the source and dest addresses for master DMA channel */
; d. V+ K& X0 ~/ O" g- R8 i' ~7 `                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
; |/ ^. N2 g  d- X: X                paramSet.destAddr   = (uint32_t)(ping_buffer);% v. m' t9 J% L/ y+ X

$ t! T9 f% ?1 C% d  D7 d                /* Write to the master DMA channel first. */6 d2 \9 I# A5 e: R
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
5 E4 W, D# ?% W1 ~0 H, `+ z- M. ]    }       * ^8 J. ^# _# S. N0 g" D! D
" r) @/ ]2 Y+ ]1 _) D% g- {
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 z7 C- z, T1 P5 J. \5 h
        8 A( F. O1 z, c) l" L
    if(result == EDMA3_DRV_SOK) * ~. \, L/ r* R4 Q- f7 _0 I' A
    {
8 e5 F/ b  Q& G( }) B            print2arm("edma3 driver init success.",0);: a- A8 s& A+ Z! V6 K- O  W. e
    } ) P8 P0 f, ]! V( A) Q/ q
}
  @- d: Y: O) I' J$ B, q
& t; Y4 |5 _( m0 _1 D" x# w% ?. U5 x
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ C4 Z( V# s1 M( H' w* D
; D4 X1 F5 ~2 A- c. }) ~6 m3 N
- \' w# v4 K$ |( x6 H- M4 ?

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:477 P1 t0 F- t0 `- P' _* T4 l
每次DMA传输完成后都要再次使能传输

2 S: X' k3 T! q3 R7 T原来是这样,我明天去试试,谢谢了!




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