嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& e, D/ X& w0 I3 r# t  w# ], m  F#define  PING_PONG_ACNT          1. D- D) P0 C) Y7 N' _" |2 i% D
#define  PING_PONG_BCNT          8*32*40
* ?: J2 K% Y: m8 h4 v9 \2 j! ]//#define  PING_PONG_BCNT       1 1 m% I2 ?( k, C
#define  PING_PONG_CCNT          1# j8 E& Y4 ]( c2 A5 e0 N
#define  MCASP_BASEADDR          0x01D00000
* X/ b3 f1 b2 e8 a#define  Mcasp_RXEVENTQUE        (0u)
( k5 D! y& x% K+ E" s0 i5 ]( T+ V( {; M. _
/* OPT Field specific defines */
1 }8 v" C& ~* Z! a#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
! h6 J# \* c+ }, {! A. k#define OPT_TCC_MASK                        (0x0003F000u)0 z1 p! Z9 I( l* m
#define OPT_TCC_SHIFT                       (0x0000000Cu)
1 w; J9 q+ Q  V- z#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% C4 b4 k& P, P, Z% u#define OPT_TCINTEN_SHIFT                   (0x00000014u)
' N8 ~3 ^, `/ o
; k2 c  y( k; [/ d' o! nchar ping_buffer[PING_PONG_BCNT];
/ \" g" c# x5 A9 ]3 H$ }  Bchar pong_buffer[PING_PONG_BCNT];4 c! F# N+ K$ V8 p+ y6 g
) A1 m5 \$ z: G

# ]! z% E* i) ~5 \5 \0 E* q% P4 o+ P2 `9 {7 Q/ K/ A

# o) P' B; M" d/ w+ estatic void ys_edma3_init()4 d/ t: `. z$ X- r4 X
{5 A' n- ~$ X/ {) t4 K% P
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 c! V3 F% h- f" R        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# |- e! s* ~, [9 f* J
        EDMA3_DRV_Handle hEdma;
1 {- @9 J! o8 ]0 |2 @    uint32_t chId   = 0;
0 L3 c' m- n8 T    uint32_t tcc    = 0;
! C! D% n. i# h& H* C  V& X/ o5 U: @5 p( j! \8 c) B
    print2arm("edma3 driver init...",0);
* O# G3 B; s8 j! k9 `" w+ f
* \5 u% O- Q* d- y) k: R        hEdma = edma3init(0,&result);- L' o! |; J7 Z/ G
        if(hEdma)
  {2 `2 i7 T) v- E  O) a        {
1 R: e, i% M7 E                print2arm("edma3init() Passed.",0);: U! p, ~: ^& f8 {# Q2 K
        }
$ f- H6 `# \4 W& e* b7 B        else* e; f- a- n' r- R8 C# M
        {# }* p( G4 \5 v3 j0 X1 b
                print2arm("edma3init() Failed.",0);2 g" K0 M6 e$ s' z' ^' k) Y) I% t
        }" E- s# D9 I' F; M# f* n
        0 m+ X; P  u7 r5 b& v# s; x
        if (result == EDMA3_DRV_SOK)* ?( s9 g  @  G
    {
" u7 @+ N1 V0 c' S$ l" v                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 p6 `" L7 i8 a+ K& B
                                                       (EDMA3_RM_EventQueue)0,
% p0 ?7 d% T  d' @$ v                                                            &edma3_isr, NULL);
" m4 H! Y4 u6 m( m0 H: X7 a! H    }2 D2 d+ r5 g' Y" c2 _" m, h9 Q
        - g/ d) Y# x6 p2 o; Q
        if(result == EDMA3_DRV_SOK)
$ \5 ]) a4 j' O: ^" s        {
0 ?$ X& Z+ `( I; k                paramSet.srcBIdx    = 0;  L( V0 f- i: ?2 h3 f
                paramSet.destBIdx   = 1;1 O/ T/ F2 p8 M, h) i; A3 D
                paramSet.srcCIdx    = 0;3 ], E# O$ J( p) {6 O% u7 b6 O
                paramSet.destCIdx   = 0;+ s) I1 ?7 I& F" }& i; B2 t
                paramSet.aCnt       = PING_PONG_ACNT;, b, _4 _5 A; o5 L
                paramSet.bCnt       = PING_PONG_BCNT;( I3 j' K* G+ t- o
                paramSet.cCnt       = PING_PONG_CCNT;' _/ H$ }9 O+ B. V& l9 l3 d
               
3 H6 m! ?; m4 B3 m0 k  P                /* For AB-synchronized transfers, BCNTRLD is not used. */+ n5 F7 Z3 n4 h  i
                paramSet.bCntReload = PING_PONG_BCNT;3 K) q4 k6 M3 g. u1 t" z
) v$ u+ ]1 f; f  h! ?
                /* Src in constant mode Dest in INCR modes */: `3 k$ K; O/ S! W9 I5 ^% e
                paramSet.opt &= 0xFFFFFFFDu;
  k2 Q( L4 z+ |# G                //paramSet.opt &= 0xFFFFFFFCu;# E, s; S4 N( Y" N. M; l  j
               
; R* [# B) d  Q; ~                /* Program the TCC */
, |8 X" p9 b: h% }, }7 N( F2 S                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);8 U0 p3 U3 x1 e, V

  z0 f# H) U8 I8 n. P                /* Enable Intermediate & Final transfer completion interrupt */4 c* w) k8 a) D/ o. a2 Y' P) F
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# D6 n# J, @; p2 E                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, k3 l- }1 A. x! D  P/ w$ v9 t
9 T7 v) K; l. y  @$ a
                /* AB Sync Transfer Mode */
8 C5 f, M: c8 \# ]( \                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);/ ?9 I7 X; o3 ]0 N+ z
               
$ Y" G+ A! p$ S0 S. a, ~6 L1 L0 L                /* Program the source and dest addresses for master DMA channel */8 E$ U9 H9 a) b2 G: N. J* ]& |
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ `6 }  q6 \6 n
                paramSet.destAddr   = (uint32_t)(ping_buffer);
. L0 K2 |* G- T. \
5 Y! f+ i( [/ [$ H& P3 K0 a3 b                /* Write to the master DMA channel first. */  @. \5 G! c8 q# l" J+ a
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
6 |! h$ {& c: s$ Z$ z: k: ]  |    }         d& r/ {  O3 T7 O( F! |6 V' Q7 ?

8 m" F- }+ p8 m( `  E! m- y        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' F" \  Z& J' X) Q       
6 u- a6 ?- O5 w) Z- \' M    if(result == EDMA3_DRV_SOK)
2 V/ n& z3 C  Y    {
! r0 a* d7 [$ _            print2arm("edma3 driver init success.",0);7 W' s; y/ C" h! {
    }
3 z/ w" w# e2 h, h0 c+ a1 \  N( i) O}
/ {& _' Y/ a6 E. G2 s8 J. ?" Z8 r- H4 b1 D
' W: L6 T, M& F3 U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 z+ V2 ]6 R/ q! ?6 H# C* b4 K' ~2 A: @5 r1 O3 W

0 `2 y/ g; ]3 u. Y! `& b6 W2 j7 X
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, b+ l4 O0 H: c0 L
每次DMA传输完成后都要再次使能传输

, e# {/ ?3 g+ D; \! o# H* g0 m原来是这样,我明天去试试,谢谢了!




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