嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: a2 H. b& a9 n/ k
#define  PING_PONG_ACNT          1: j$ I; e8 r# f
#define  PING_PONG_BCNT          8*32*40
2 c2 F5 F. d$ y* y//#define  PING_PONG_BCNT       1
4 c2 Y0 o- |; ~6 `$ Y! w#define  PING_PONG_CCNT          1/ t, ~$ G( f* ^' W
#define  MCASP_BASEADDR          0x01D000003 `2 Q- {6 C) q( p  y3 l; {+ T2 b; d
#define  Mcasp_RXEVENTQUE        (0u)
( A, R9 w2 s" @0 [! O/ U1 ?4 b8 |4 c
/* OPT Field specific defines */
3 R, H0 d/ b; a#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( p$ D! y: _- C4 \3 y. C#define OPT_TCC_MASK                        (0x0003F000u)* }( o" b0 W, I7 i: V: y) q; p& {
#define OPT_TCC_SHIFT                       (0x0000000Cu)
7 n' ], ~0 X4 f5 X2 q# Z#define OPT_ITCINTEN_SHIFT                  (0x00000015u)5 Y' @3 J" O( K% |5 u" a2 `8 ?# S
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
9 [4 ^1 o1 |# c: P$ x; m# i9 Z" Y
0 ?9 H& o& e4 u: C  ?7 rchar ping_buffer[PING_PONG_BCNT];2 A6 _& g- _% R: X* a2 A8 x2 q% m
char pong_buffer[PING_PONG_BCNT];3 f- g# w! \2 D

$ G( B; E+ w  v9 H+ A$ s5 z/ \5 Y6 J4 w1 f

5 {- _3 j) b' p
  I8 D: R3 C( j$ _static void ys_edma3_init()
  {, u, M2 a  d2 e5 b* \6 e6 b6 D{
: }) [* W  c' ?4 \        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' K) ~1 [: B: E: N+ I
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;. R0 @/ m! u# F6 n( g  n5 l
        EDMA3_DRV_Handle hEdma;- U, D" v8 V( }- W; ?! {/ J
    uint32_t chId   = 0;' e: i6 k: P( _
    uint32_t tcc    = 0;4 [* `4 a+ C" j# n/ l8 A" O5 O

6 \- c$ Y# Z3 ^    print2arm("edma3 driver init...",0);
- t1 K" w! C; B6 P7 L8 x
3 m7 [4 G% i* s  E9 R3 @' `+ w, _        hEdma = edma3init(0,&result);' O1 O2 ?% |$ Y! R6 q6 Q
        if(hEdma)
/ I& ~# r7 C, Z" w        {
7 p" W4 R/ a5 L/ |0 a4 ~/ v( `                print2arm("edma3init() Passed.",0);
; C0 |3 H* ^' U# r2 q        }0 u! A7 R5 N0 ~9 h' v8 M! i
        else% I5 ^( A! d& s( @
        {
) K; G& N9 X5 e9 l7 i7 [5 \                print2arm("edma3init() Failed.",0);
% @5 i4 y% ]* I2 \$ W/ `! Z$ E        }4 J9 g/ ~  k3 f( w1 B/ n2 j7 B
        . l; U: V7 o9 q  e/ h: G) \
        if (result == EDMA3_DRV_SOK)" z+ w1 `9 Y- q
    {
  V& R  z: }/ h4 S4 E5 W7 i9 l                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,! H' F* c0 M" ]# t: v* E' F* I
                                                       (EDMA3_RM_EventQueue)0,0 c4 u' I4 K8 V3 o+ y
                                                            &edma3_isr, NULL);
- X! O7 d& n" O! p( `  A% V    }
3 ^4 a) s0 ^3 Q: O; z        - t9 _- f- i' |  s- x- K
        if(result == EDMA3_DRV_SOK)
7 v$ M, T: u4 b' W) [" x& u# _" N& K        {
$ v' Y$ i1 h$ S6 Q                paramSet.srcBIdx    = 0;# i7 ]' t( y8 x' o
                paramSet.destBIdx   = 1;
" m" @/ E* ?) H* {# W                paramSet.srcCIdx    = 0;& W/ T% m9 w, N+ d/ B
                paramSet.destCIdx   = 0;: Z) ~- C. |" [* j/ B- }& B
                paramSet.aCnt       = PING_PONG_ACNT;
4 }; ]$ f# e+ p; \                paramSet.bCnt       = PING_PONG_BCNT;
2 {, s& h* C& v, N# D$ C                paramSet.cCnt       = PING_PONG_CCNT;
: ^- Z' c! |1 P               
( t7 t6 C4 f/ t. A& D, \3 M                /* For AB-synchronized transfers, BCNTRLD is not used. */5 u, Q' w  W# z0 `7 ]3 A
                paramSet.bCntReload = PING_PONG_BCNT;
0 h# L( q1 A" X  z" ?% }  a2 N5 @3 @: ]0 s# i6 @
                /* Src in constant mode Dest in INCR modes */0 u3 ?# a- }* l. _8 D
                paramSet.opt &= 0xFFFFFFFDu;
0 r" Y3 v- l+ A/ ~4 _, e" Z6 o                //paramSet.opt &= 0xFFFFFFFCu;
: [8 Y- E. G( v0 |                # Q2 @+ |' A7 E5 U0 ?, r2 _9 L4 S" q
                /* Program the TCC */
$ F  g  V/ Z( N3 `, @- b" n                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 p7 O3 w0 k0 c4 w
3 r. P/ J% y7 @1 f  w2 o
                /* Enable Intermediate & Final transfer completion interrupt */4 t' r9 E( j' |7 Q* a7 b2 T
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' f! F1 n3 p% J) Q& v# z
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ f6 @4 o1 v- Z; n
! V8 L+ U# G4 @/ g7 Y                /* AB Sync Transfer Mode */8 L* y: U2 R3 J1 @3 i
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);1 ~% @0 r9 E# t3 V! s. v
                # ]- ]2 [' d+ U7 e8 I
                /* Program the source and dest addresses for master DMA channel */; S- p9 E, d" y& `$ r* d, ?
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);) p" N- G% Q7 K: L8 \
                paramSet.destAddr   = (uint32_t)(ping_buffer);
- v) c* d. [+ C3 U; L& i6 s5 A
8 q1 R  i4 Z4 R: x) ?                /* Write to the master DMA channel first. */
4 j& d( F* X5 @' u9 q. B; Y                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
. _& W2 f# F( N6 y: r0 ]' E    }      
( t3 Q; X& y8 b( p+ b4 g& l: ?) d+ a4 H; f- x' z% K) u$ `! e& y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);' \- a1 m+ ?# ]  c
        1 ]( g, r% w# X9 `' e7 Q
    if(result == EDMA3_DRV_SOK) / A6 c4 b  b4 B5 v  F
    {# \$ X" ]. ]: c6 y2 M
            print2arm("edma3 driver init success.",0);5 E  {9 ^5 |2 Z& l" u1 i
    } # U/ t& s) j0 X6 T* l1 |
}
2 H) c7 C5 w# |7 F' ?; g4 r, _  f9 e# k" y+ ?9 M% Z5 }

$ r/ z( Y5 ^) z% f, hEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 I1 N0 W9 t0 y. H* p6 P
) q& p  M2 n+ K
% v3 A' f/ O, x9 {2 G

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
' N+ `1 f  y  B& b; V7 w. q: w每次DMA传输完成后都要再次使能传输

1 a+ q/ M9 ~/ g. L6 s( r: g8 g原来是这样,我明天去试试,谢谢了!




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