嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! t4 E& v8 h& Q( `
#define  PING_PONG_ACNT          1
) O6 w" ?+ {' V#define  PING_PONG_BCNT          8*32*40 - I1 z- A/ o- I8 Y) X
//#define  PING_PONG_BCNT       1 ; `6 z; j5 d. N. D/ z
#define  PING_PONG_CCNT          1
4 x. F! `0 M5 m* P% p; ?#define  MCASP_BASEADDR          0x01D00000; H; H' y( N) y
#define  Mcasp_RXEVENTQUE        (0u)+ d6 ?6 A$ v, W! ^2 _( Q

0 f, M2 L( G3 v3 D& o5 J3 j/* OPT Field specific defines */
3 a4 i# X7 G$ n3 V* b9 i6 f#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
; }0 x( @: J. f, e9 h8 o#define OPT_TCC_MASK                        (0x0003F000u)
9 D! A$ J' m( [) N6 `) a) @0 a#define OPT_TCC_SHIFT                       (0x0000000Cu)
! y9 B0 i. e5 ]% d" o* l: n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)( v3 r" F) P( W8 K
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
& g2 G) A0 N9 m% B  h- y. U: J: z7 g$ h/ L" u/ Q
char ping_buffer[PING_PONG_BCNT];% Y9 J2 k, U# U* n2 q2 f
char pong_buffer[PING_PONG_BCNT];1 j( x; Z# w( A3 W3 m; u+ X( N

1 e3 ]5 H, f0 c7 a
+ e( ?. Q& M+ h+ y
$ L5 r5 [& A' ?  F9 n5 ?3 E9 r% s
& I) |7 i0 \) P2 p! |) ]' xstatic void ys_edma3_init()
! C" c& }. z! p4 Q3 v0 l" V{7 E) ~% o9 j, x5 T4 Y: L
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( a( N) y- B7 o9 I7 W        EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 n0 D* B8 ^) N& t* w2 [# Q
        EDMA3_DRV_Handle hEdma;
# p4 [: g- U' o( W3 k5 R5 z! A    uint32_t chId   = 0;: U2 D6 R9 Y6 ^+ O3 v
    uint32_t tcc    = 0;& k: R3 C) F) Q5 T3 p$ u! c

2 L) C- o) b. K    print2arm("edma3 driver init...",0);$ h4 T; H/ ?- O5 _7 P3 _( {

2 n" E1 ?# [- m: G+ j. X1 l        hEdma = edma3init(0,&result);
; Z3 k; c  @: U        if(hEdma)$ ^8 e4 a1 W7 p2 A0 S- u% f
        {3 s6 l- ?: G4 Q3 n( b0 ?$ H
                print2arm("edma3init() Passed.",0);
  I7 C. @$ g! A2 U# n        }) c+ q+ j& H- n# Z2 }/ B. x
        else
, d6 Z4 `) K1 R        {
9 N# S- M  _( V2 Y" h                print2arm("edma3init() Failed.",0);& j9 y+ L5 z: Z1 V1 Y; R
        }
% k$ P" J" q9 K" o       
, t( J. X6 q1 ?& i        if (result == EDMA3_DRV_SOK)
- }6 ?+ ], v5 F/ F+ J4 o: x& [    {
, \* b2 M6 F' p                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& `+ z3 s* H5 t  H( D  t/ z" W                                                       (EDMA3_RM_EventQueue)0,
4 P  L2 Z- E% E, s5 o; T5 u0 g2 i                                                            &edma3_isr, NULL);8 k+ P: u4 `9 f- @' O
    }
$ p1 T. P  n2 |! w        8 F5 K: J  Q. b, T. ]2 S
        if(result == EDMA3_DRV_SOK)0 R% _3 Q9 V# F6 ^8 K
        {! u5 ~, |+ J# i; g
                paramSet.srcBIdx    = 0;+ ]' W5 m5 k0 }9 n
                paramSet.destBIdx   = 1;( J3 j6 e" R* h* t/ h
                paramSet.srcCIdx    = 0;0 x$ f) a' ?0 t
                paramSet.destCIdx   = 0;7 C1 O, p- C0 E8 O! q! ]
                paramSet.aCnt       = PING_PONG_ACNT;1 Q( |- |. m. M# t! d1 s& r
                paramSet.bCnt       = PING_PONG_BCNT;
+ ]+ a1 i! {/ V. G* d                paramSet.cCnt       = PING_PONG_CCNT;
/ q% S& I( @" K' @& z3 f                3 V7 O. F$ F' r. w/ s
                /* For AB-synchronized transfers, BCNTRLD is not used. */- ^' E5 x6 R. D! V: ~7 d
                paramSet.bCntReload = PING_PONG_BCNT;; i: m8 @- {; ~2 Q' _

5 J6 E) j+ J3 w8 c  a6 ~) D6 [                /* Src in constant mode Dest in INCR modes */  t$ H9 u2 c1 C# h
                paramSet.opt &= 0xFFFFFFFDu;
. z: Q# k3 v( w* @$ p+ O                //paramSet.opt &= 0xFFFFFFFCu;8 I# K5 i# v3 g6 [3 N# W3 a& L
                , {1 [1 r( u3 c  T1 ^& v
                /* Program the TCC */
6 ?! P  M8 k  B, a& B' C                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ r& p5 N0 v* w8 c9 H
. X4 \. `8 R5 [% P8 q6 v
                /* Enable Intermediate & Final transfer completion interrupt */6 i  R  @0 l* k3 u4 c! Y3 Y
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ |) n3 ^- k; I0 T! I1 O6 ?' ^0 m4 p$ h                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& b. g0 H7 R- U

* H; O  R* l* [" s+ T  x                /* AB Sync Transfer Mode */' G4 o4 [( H3 X' A2 M6 \6 ~2 [
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% x/ b5 U- Y8 ^5 n8 B               
: b$ n& Q# ]+ w& w4 K- }; b                /* Program the source and dest addresses for master DMA channel */
1 j0 B/ `# s3 P, ^3 v: w8 s                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);4 x  }6 r3 ?! l/ ]# I
                paramSet.destAddr   = (uint32_t)(ping_buffer);
+ A, l3 M, T# `7 B0 }8 n; D1 Z! F  k1 c1 }5 C, g
                /* Write to the master DMA channel first. */% y! j9 e" r5 E1 S6 e! D
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
( I8 Q, s5 Z& c4 R) w    }       7 t( f/ s( ]) D0 n9 I; B

. o+ @6 ^1 i0 h/ m        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);  q4 j/ M" I: W- g6 P" i- g
       
* E% Q9 R: b5 y* L  j) L1 r    if(result == EDMA3_DRV_SOK) 2 O$ _+ }" K+ \: O- X6 l
    {
: V7 h6 e+ n& B8 |            print2arm("edma3 driver init success.",0);
; y% _$ {4 h+ ^4 D  D6 P! [! S8 c    }
# l' \$ D6 a8 ^: U}
- X) w; d; }" B! Y& h' w2 L
: i2 C2 s4 U9 z$ D9 v: }& {
2 m) b2 v7 q$ T/ XEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) R$ M" V( C& @" S' V1 i' o5 M) y6 D' p  p* Y1 n( c" Y
9 b3 P5 ]+ G/ D4 l. M5 ]* S( O

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:476 T& R; ], N' i( q
每次DMA传输完成后都要再次使能传输

8 y2 x) w1 l5 L8 }/ v原来是这样,我明天去试试,谢谢了!




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