嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- `( f- x( V" r. q9 t6 b; B
#define  PING_PONG_ACNT          1
, Z: C+ d) U0 L8 G#define  PING_PONG_BCNT          8*32*40
- ?( j  }  e; f& ]$ A//#define  PING_PONG_BCNT       1
) s% V5 ]1 \+ u#define  PING_PONG_CCNT          10 t& X9 a& k, l
#define  MCASP_BASEADDR          0x01D000007 ?  D( g5 u, }4 `( s
#define  Mcasp_RXEVENTQUE        (0u)# t: i4 S, V2 G( x

9 [6 L, d9 ~* g  ~$ ^/* OPT Field specific defines */) [+ N" _( v$ W2 l3 j1 R7 c
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( U8 K) ~0 j; ^#define OPT_TCC_MASK                        (0x0003F000u)
3 A2 N2 X5 `3 v6 _- \1 m  j#define OPT_TCC_SHIFT                       (0x0000000Cu)
8 p6 T) E2 {8 R! Y: {#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 n% {- M2 j9 H8 p. I
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) W* g4 R1 F9 U7 M( G
3 ~. S1 Y3 Y, O( m1 @% Zchar ping_buffer[PING_PONG_BCNT];
3 {2 g) W1 X& _char pong_buffer[PING_PONG_BCNT];
/ m) f$ ]5 h; G% W1 e( |# y0 I; h- E# j$ s9 K
2 N1 z: i7 f7 K6 \1 |# [5 u, y
( F4 d+ R: {; t) J; `  W

  ]3 ?) s% c4 C) sstatic void ys_edma3_init()0 X* b8 [  J" P5 J+ S: [" ?
{( d& V! P# c9 J# e" t( f( @
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 A% i( `0 ?( t2 E2 e- t" c& U0 g        EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 l8 F' G# I8 N, G+ B
        EDMA3_DRV_Handle hEdma;( _1 u# `! i' O$ }7 }1 @4 V
    uint32_t chId   = 0;
: \9 J" \! ]! w( s0 q    uint32_t tcc    = 0;: g6 D* [. V: G; N

% i: g8 S8 U2 e5 w3 j; R! |    print2arm("edma3 driver init...",0);. }& b" }9 c# R# ~" f. X
0 y8 t5 w, T" u+ Q
        hEdma = edma3init(0,&result);$ o1 _$ b) n6 G2 k( H
        if(hEdma), j; y2 S% ^* f6 S& G
        {- e0 |, x" x, r: D# Q* R) [
                print2arm("edma3init() Passed.",0);
. @) p% t5 |  [* C" k        }+ G4 R1 N% J0 N9 ]& q/ f! m/ `
        else
  E: |2 v8 G  A, k6 y8 l        {
! _2 ], o, O+ k0 ]                print2arm("edma3init() Failed.",0);
9 _1 s% i- H) G  l2 X* X" i" L        }  b3 c; T. C" U* a, }! T1 n
       
, _9 Q; H( R: t( N+ s! n        if (result == EDMA3_DRV_SOK)7 S' Z3 P. F6 G/ p: M( D2 v$ {
    {
; B1 I. _2 |& I/ Y6 s% A  \. ~                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( t: U# ~6 K8 J6 h$ Q2 ?9 q2 M
                                                       (EDMA3_RM_EventQueue)0,
) W# w8 `7 z' l* ^$ f9 Q- P                                                            &edma3_isr, NULL);
+ K( X- @& n, k4 c  v    }! }  s! k+ d+ @* R
       
/ m" _0 j/ H2 S# l' i1 Q6 G5 J        if(result == EDMA3_DRV_SOK)! c' Q" S6 B; }! m+ T& i* h. r" X
        {
& d# ]: T0 B  _7 L' Y1 u                paramSet.srcBIdx    = 0;9 x6 R1 w* x7 q" J
                paramSet.destBIdx   = 1;
. ^' I( ^) O+ Y% o                paramSet.srcCIdx    = 0;
. }) i" W$ d& P( ^; a                paramSet.destCIdx   = 0;+ W% H* ^& b6 P3 A
                paramSet.aCnt       = PING_PONG_ACNT;
- k# J+ e/ V! y                paramSet.bCnt       = PING_PONG_BCNT;
! s+ p5 C( l3 T- [9 E, a                paramSet.cCnt       = PING_PONG_CCNT;
8 K/ d5 ]( _9 F5 }1 J/ u: t1 |, [                + S" D9 {- @' q; T: T6 d& n3 j
                /* For AB-synchronized transfers, BCNTRLD is not used. */+ M: l+ d! t1 U% b. \- C8 y
                paramSet.bCntReload = PING_PONG_BCNT;
- d, l& ?* q* z2 _9 i7 r
+ ^3 B' Z) q5 k0 [                /* Src in constant mode Dest in INCR modes */
8 t+ `/ Z/ d' ?' `4 {/ q                paramSet.opt &= 0xFFFFFFFDu;
3 R9 j' S0 Z0 i/ _9 L* j7 Y                //paramSet.opt &= 0xFFFFFFFCu;; g: R4 |+ T1 Z
                5 ^# l; Y8 o: j. v5 ^
                /* Program the TCC */
8 i* v: x$ C4 K* q- e                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: O) J& [7 H+ J: F4 u: f- C' y+ f! `4 T2 t: e" i( l
                /* Enable Intermediate & Final transfer completion interrupt */! a6 E- _6 l- V! j' ~, y
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 P7 }. i5 N" v7 O4 E; D: t9 ^                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 |7 E- h( o. K1 O
8 i, p. [1 P1 H" p" a: \/ e
                /* AB Sync Transfer Mode */
6 J- R8 K( u5 N& n* t                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
, k/ M9 i; t( Q* n                0 d3 H1 g/ L4 {" @- M( ]* K  B
                /* Program the source and dest addresses for master DMA channel */5 j# a" Q# k# C8 C
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
: P( \/ P9 }8 D0 j                paramSet.destAddr   = (uint32_t)(ping_buffer);
8 ?9 R8 L8 k- Q  j0 A
7 r7 w: a, o7 h: U0 T6 Q: r                /* Write to the master DMA channel first. */
0 F7 V0 t; W4 o                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
+ i6 f- i7 A" a8 @, s    }       0 n9 p) N  x1 \. m

, A3 y7 Q# V3 P, U0 P% z% \8 f        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);! P' s2 b! n! R. D
       
  a& c3 N3 B7 g2 {& x- U2 B    if(result == EDMA3_DRV_SOK) 2 ^# _5 j1 }: I  w4 Z1 P" o7 U0 j
    {/ a* m: G, v+ N
            print2arm("edma3 driver init success.",0);* K% h! |9 `+ _0 J5 ~6 W
    }
* _' x& L( k$ e' A}1 Q3 U; H3 {. n: G" O  k' ~' ]: I( t" F5 \
# o# K4 S; j/ B1 B2 E
0 b3 H3 P! ^6 W7 Y, d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& g- a  ]9 `( g& A& r1 r3 R
8 Q! c! ~, l% ]- j2 _5 v1 R
  m6 F9 H9 X: [/ G$ t, k# X
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* V, O* x7 R* u7 E每次DMA传输完成后都要再次使能传输

" ^4 a, S# Q0 |) F/ }原来是这样,我明天去试试,谢谢了!




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