嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ y% e% U; Z$ S$ W/ `4 ?#define  PING_PONG_ACNT          1
- W2 G+ N! S1 p7 |7 x. }#define  PING_PONG_BCNT          8*32*40
/ z& B$ c/ w! H$ j* {3 O" U: ?//#define  PING_PONG_BCNT       1
3 L, X& C, j! c" n( F$ @#define  PING_PONG_CCNT          1  B! O1 ~7 u9 B0 ]3 ?" {
#define  MCASP_BASEADDR          0x01D00000+ P. T' r2 r# ], ~! n" p9 E+ F
#define  Mcasp_RXEVENTQUE        (0u)) A# j5 ^. W! Z6 Z

3 [( ^6 M% R' @4 }* \/ c/* OPT Field specific defines */$ E- s- T' {# t$ S  `" K% r: O6 e
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
9 q5 u" E# k8 R  ?! O#define OPT_TCC_MASK                        (0x0003F000u)
7 S- g( W$ f! C( ]) K7 `, M#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 I! j/ [$ v& g1 O" h# Z% L#define OPT_ITCINTEN_SHIFT                  (0x00000015u); q/ ?: r& Y& y2 k
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
" x6 h' p0 j. l! V4 X  t7 Y* @  ]) ~( X0 i
char ping_buffer[PING_PONG_BCNT];
5 g( E2 y, S4 I( dchar pong_buffer[PING_PONG_BCNT];
2 r" _/ n$ u' O+ L  H4 r# F
" d- @5 R. v) S$ r3 ]
5 Z& l. M* X2 i3 O" t% l7 [2 m2 K. K8 r+ h& p( F' _  ~
- y# N* e# h2 }; ~; z0 J; e! z
static void ys_edma3_init()( q* t, i+ H  v
{' N5 F; }" O5 ]
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};9 m+ L1 B0 b+ V# w3 r
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. H( L( V- W% l0 n& V9 O6 n4 ?% b+ z        EDMA3_DRV_Handle hEdma;9 `; K& h, p9 E
    uint32_t chId   = 0;
9 e* w( o/ r+ I2 j* u    uint32_t tcc    = 0;" N* f3 \# K! B* \7 ^0 T
2 w2 h* k: N, P3 n- T4 G5 N
    print2arm("edma3 driver init...",0);
* l9 m& s7 k/ b3 N3 _; e
  E- y( P) Y8 K6 k+ s4 T        hEdma = edma3init(0,&result);
) h6 U& K$ b6 y( ^/ W& Q; t        if(hEdma)$ k- c9 H+ m4 i/ t2 x
        {( w0 @0 t: {( f$ G: O
                print2arm("edma3init() Passed.",0);/ i% t! a% L% t% H3 i2 }
        }& K3 j. |1 ]! D4 Y/ x* y
        else
$ X0 P: C% c1 g8 @; o6 I" J% N        {; ]( d2 i* _) R8 h
                print2arm("edma3init() Failed.",0);+ ^% R! x, n0 N8 Y& x: y* n9 [( I
        }* v* D4 j4 l% m
        9 K- E6 W3 W3 r& w. }7 K3 p
        if (result == EDMA3_DRV_SOK)
+ t3 m( P8 A1 P" @( K: Z& X# @3 V    {
) W4 o+ j1 B$ `, ?1 c" Q                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" ~" v7 R1 `( c3 V8 N9 u: u                                                       (EDMA3_RM_EventQueue)0,
8 |0 C& x. H6 o7 ]% y( o                                                            &edma3_isr, NULL);4 S9 Z! `7 N5 v' _
    }( R1 U' f% D# ?: |& K4 q
        9 d1 J. w. S$ ?1 ]
        if(result == EDMA3_DRV_SOK)
4 b/ z; E, Y2 v; Z+ X        {4 n. }; |2 ~3 g" Q( B0 B
                paramSet.srcBIdx    = 0;
6 e4 B9 J) h# j& W                paramSet.destBIdx   = 1;$ l/ d: H# C" K% [( S+ N) Y* y
                paramSet.srcCIdx    = 0;
$ r, n& _- X0 s- v( H) A                paramSet.destCIdx   = 0;. s7 f" u8 u7 I* S) \. y" L
                paramSet.aCnt       = PING_PONG_ACNT;5 {- d# k0 z: F$ D  S/ M
                paramSet.bCnt       = PING_PONG_BCNT;* d; z  Y% U8 A- [
                paramSet.cCnt       = PING_PONG_CCNT;
# e; _6 C9 u! U- l/ M                4 V# B" B4 q5 b/ U) H8 B  ~
                /* For AB-synchronized transfers, BCNTRLD is not used. */
: j% f, V+ Y4 c# e% }8 u, p                paramSet.bCntReload = PING_PONG_BCNT;
" j; p5 h1 L2 C4 }& N1 ]# J
; }2 ~. P% E" h* X6 c2 _/ N1 x                /* Src in constant mode Dest in INCR modes */
0 Q1 f: \) K3 O2 ]4 I                paramSet.opt &= 0xFFFFFFFDu;
+ ?% _' t, D1 f  u# X                //paramSet.opt &= 0xFFFFFFFCu;
+ t3 J' r" U& ~6 ]               
8 U8 @: M: _0 P/ z; }& F                /* Program the TCC */
  {/ f- F# v6 \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% J& ?  x6 M" p1 @# p0 @( N" B& u% B
  \% u5 Q% Q1 s                /* Enable Intermediate & Final transfer completion interrupt */
& q0 j2 ~0 x( S. J4 r                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
. f* W& r$ T0 P4 \                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 Y. W3 ^( |/ x! g+ D/ L8 |
' Z  G  q5 q$ K  B                /* AB Sync Transfer Mode */$ v& Z5 ~* K5 t5 d6 C+ m) k
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) W; F% [) W! E" L( d                - }. R( T% [  H* U
                /* Program the source and dest addresses for master DMA channel */
2 B1 V& T% M& |: t" e" A+ j4 Z                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 [) F. g0 D( R$ k, r- K. B' b                paramSet.destAddr   = (uint32_t)(ping_buffer);
/ T! j( o# \# R
& c0 C+ J4 B" L3 k6 w3 Y                /* Write to the master DMA channel first. */
+ g1 f1 L8 j, k! Q6 L* z- |                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
5 S7 a( v% `/ D    }      
2 B5 s- Y/ h: G7 {
; R% d& T, o0 M- ?" l8 x        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 I: Y" Q; X, ]+ p. m        5 i. z" J$ R' w/ _2 ?. i; o
    if(result == EDMA3_DRV_SOK)
1 e; ^5 J' O6 G    {
2 b9 n& K/ U1 b1 c0 p) [/ \            print2arm("edma3 driver init success.",0);
0 X2 }2 O4 r! y0 r) C    } : C$ L" B" T1 \; E3 V9 D
}* F: G+ \+ g6 Q

, b# q3 V1 e, l, o. o0 ^. H8 e$ W
! F- J5 \" V% ^# v" F; p0 AEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 \) I0 }! I* P( Q/ h
% m- V4 Q# e6 F" d* m& x

2 [: `0 V0 v( F! Q: c9 K! r" d
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% t' e. u1 K6 c  f- o5 z每次DMA传输完成后都要再次使能传输
: G2 f) Z" e+ J$ R2 J1 p8 F
原来是这样,我明天去试试,谢谢了!




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