嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* F6 \7 S& G) W) _6 w
#define  PING_PONG_ACNT          1
. L5 _* ~+ K+ z#define  PING_PONG_BCNT          8*32*40
9 j8 N/ A4 J0 A7 ]4 {7 T//#define  PING_PONG_BCNT       1
  B" S, D2 y4 h9 W! n#define  PING_PONG_CCNT          1
' q+ K- ~( T0 T; v2 S! v* X, Z: v1 Q#define  MCASP_BASEADDR          0x01D00000! ^8 Z( {# k; ^7 t6 |/ Z
#define  Mcasp_RXEVENTQUE        (0u)
3 X6 B0 ?. T( N* U" ?' S+ w( N/ j4 @" n- ?8 S$ ?; Q4 q/ W( R3 f
/* OPT Field specific defines */
. A+ ^1 k) @2 q0 y" m  Y8 G1 U#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
! ^  g" t$ d% u/ g4 s#define OPT_TCC_MASK                        (0x0003F000u)
! c2 f" R$ `* f1 e#define OPT_TCC_SHIFT                       (0x0000000Cu)
0 l: b/ D  |9 ]3 F# x( T#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% ~* L0 G/ Z3 n3 `3 V" |$ b#define OPT_TCINTEN_SHIFT                   (0x00000014u)- I: u. B; s, A- f$ v2 f) b
, w# z1 C( @* w! C( w6 }2 B0 Z
char ping_buffer[PING_PONG_BCNT];
: r- }( q2 w" u4 P1 K0 `- F) A- C# jchar pong_buffer[PING_PONG_BCNT];
7 f  h5 s: Y  ^0 d7 M1 \1 D; b9 H  k. k( c4 {7 S) u. S# V
' Z5 l% d: c) u0 U. X" i

, s$ E1 G' e2 ]- P" l( N) V1 ?5 {. o! B) i7 s6 s# j
static void ys_edma3_init()
* Y+ e6 a8 k2 l3 ]0 Y2 U8 C{; ]3 ]$ M" n+ k' x8 [
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 C. Q% v3 g$ z/ Q1 |4 k
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;! F" u7 p& x! U" ~0 `( W
        EDMA3_DRV_Handle hEdma;$ f1 s( _1 x6 I" v' a
    uint32_t chId   = 0;
/ |. _4 T; m4 @6 w+ c9 e# C    uint32_t tcc    = 0;
& E9 n/ A$ ^7 y  O8 y0 @- a) E' P) C
" B7 R8 T- P4 T    print2arm("edma3 driver init...",0);
, d: m' W) E3 N' O( {5 T, x1 q. a- }
        hEdma = edma3init(0,&result);5 H2 p1 D5 G" ]
        if(hEdma)& v+ p5 A$ k% r
        {
& X- D" D, L( g! X; V                print2arm("edma3init() Passed.",0);
+ n) O0 U# i" }2 t( q/ V        }  j( H- H6 c# K8 ~: b% M
        else
% @% A! e2 b5 l+ Q; U6 M        {- i/ s6 J6 [3 Q+ G
                print2arm("edma3init() Failed.",0);
2 ]. W% v, ~2 S+ z0 Y1 w7 B# J        }
. l# Z# C  D2 M& b  d       
# w. [/ f( n8 H/ K  S) x        if (result == EDMA3_DRV_SOK)) I* q; ]6 b: j/ \' M$ \9 m1 ]/ g
    {5 G5 `- t* E5 J7 A) p
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,- ^0 G! b# j, _
                                                       (EDMA3_RM_EventQueue)0,
% `+ O. L  [% U- A                                                            &edma3_isr, NULL);2 A$ _2 k9 `( L' G. l. S# x
    }4 e) w1 ?3 Q: q0 V+ [6 }
       
6 _2 T; r+ m  u        if(result == EDMA3_DRV_SOK), @' T* B! V8 R4 T4 W
        {. F/ s1 `4 j0 c& T' C0 c
                paramSet.srcBIdx    = 0;
  R8 U& U( ~/ V7 J                paramSet.destBIdx   = 1;6 @* [# v+ k# G- T* l$ p
                paramSet.srcCIdx    = 0;0 t  z- [6 D# G7 K4 ]) H# `
                paramSet.destCIdx   = 0;
, i) A9 s+ q  A8 F# N5 b7 `+ x                paramSet.aCnt       = PING_PONG_ACNT;8 T  L7 E) B5 [7 C  m: E# n
                paramSet.bCnt       = PING_PONG_BCNT;
5 G: z9 @0 T! J/ C0 C: [                paramSet.cCnt       = PING_PONG_CCNT;5 \. Z9 y7 ?, g8 ~
               
8 E+ x$ A4 u( P6 ~0 t) I                /* For AB-synchronized transfers, BCNTRLD is not used. */
& E* s: f) F6 |4 f! F6 m* a                paramSet.bCntReload = PING_PONG_BCNT;; d2 n) Z% s  S( d5 m: r6 Z

/ ~6 W7 f- }& e7 t                /* Src in constant mode Dest in INCR modes */
& c: J9 w) W4 R! u; ^" N                paramSet.opt &= 0xFFFFFFFDu;% F, F1 w( d9 s5 q
                //paramSet.opt &= 0xFFFFFFFCu;
! p4 @: n' O$ \, v/ u               
4 v- B  a# }- f0 H                /* Program the TCC */+ v  p& q( {% \4 h+ ]& b6 Q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ |! C8 C  K8 |. k5 |

4 _6 x' `* C9 h) z, O" N4 p                /* Enable Intermediate & Final transfer completion interrupt */
5 B% j# o6 h5 H& c  a! q4 S                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 f7 @# e3 t8 w7 ~( j- M
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% o' Y: A5 X/ j( Z! K' b/ O) t: g# y$ f+ \  i1 Q1 X
                /* AB Sync Transfer Mode */
  X4 x, A( u2 _& n                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- y- |2 o  b+ `" r. e( I                ; v$ R% D  k0 X; {
                /* Program the source and dest addresses for master DMA channel */
& A) n2 _2 ^2 q& f                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
9 S! v3 A+ s; l# [( p1 N( W                paramSet.destAddr   = (uint32_t)(ping_buffer);4 v& Y# c4 s1 e' t3 L9 |" j: p( R
9 E* [% J/ H5 t, H9 w" c
                /* Write to the master DMA channel first. */9 Y# G6 L5 I2 o: D/ }9 \
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
, j& G& j+ E, I4 J    }       & j+ `# @  V9 I# a+ h9 d# A

  v7 u7 a' i( X        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. e% v8 i' j3 K: Y( M' c
        0 c5 m) R. w+ z9 e# r% Y
    if(result == EDMA3_DRV_SOK)
  U% c4 F4 B# Q    {8 h/ [3 s7 G& I, ]$ _: {
            print2arm("edma3 driver init success.",0);
) p" M3 p& {' Q. e8 ~0 [, ?7 K    }
' \5 {4 C& M' H3 u: C}: x  }/ X. c& U" o7 G
1 ~6 x# u  o0 h: `# F8 B( b
, O, M9 J" L+ j# ~  x4 C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, m/ M6 F5 ~) c  {% ]$ V4 R0 I% r/ ?1 ^- M; h3 y( ~

5 e1 E; K  N- V* n* {. [1 o
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 u3 B  d; C- A# q* a每次DMA传输完成后都要再次使能传输

. S' j: g5 s- y: z% r原来是这样,我明天去试试,谢谢了!




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