嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' u0 G3 S8 j( o
#define  PING_PONG_ACNT          19 _1 y( P  Y. _* |
#define  PING_PONG_BCNT          8*32*40
' k$ y% T! M4 t& b//#define  PING_PONG_BCNT       1 7 f' g* n- o  H) d/ W. L- u% C& j
#define  PING_PONG_CCNT          1# ~* N) m7 e1 f# A% w
#define  MCASP_BASEADDR          0x01D00000
& \& I/ u! E, I# Z4 i! |#define  Mcasp_RXEVENTQUE        (0u)
/ r6 \% g6 c+ A  D& ?( d( H6 s& s1 L* o
/* OPT Field specific defines */! ~* J9 ~& l& n4 q8 d7 Y8 J) \
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" m, B4 ?: h) D#define OPT_TCC_MASK                        (0x0003F000u)
- f2 W+ I7 p- P#define OPT_TCC_SHIFT                       (0x0000000Cu)
  ~! F! }1 x' m' S9 D#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 y( ~0 I2 E# j0 f# }! E6 K2 f
#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 M2 G+ Q6 K4 n) X% M9 B' h6 H
# x% m- w1 `7 Z; f8 ]8 S! L$ e' T
char ping_buffer[PING_PONG_BCNT];
# T* i% ^! ^1 z, qchar pong_buffer[PING_PONG_BCNT];
9 l( H, d. }8 k; l* C0 v' F' r: g' S
% }. ~) y; L$ N0 {2 r+ L: W
, E4 n4 [8 H! x. }; P* P7 e& h

- W2 \" s9 v& n6 fstatic void ys_edma3_init()
; T- T- e# H4 C{
& k! \. q8 \+ M0 d! N1 Q) R        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 J2 g2 T* N" l% I1 E        EDMA3_DRV_Result result = EDMA3_DRV_SOK;3 E- ]  a. q3 \2 d# k
        EDMA3_DRV_Handle hEdma;
. A1 U' F6 u& Y, _! d    uint32_t chId   = 0;
6 J+ \' S: x. h5 @8 U    uint32_t tcc    = 0;/ M$ x9 t, Y; O9 D: [/ |8 N
( F* P* ?( u$ b) b0 |3 y
    print2arm("edma3 driver init...",0);6 d* ^# m1 J* G* H# T
5 n1 {- E. {2 F3 p6 t# Q* M
        hEdma = edma3init(0,&result);& J1 \, ^$ K* d8 x  [$ c) Z
        if(hEdma)
; j# L" A4 w' L7 ~& o+ B' d4 x. S        {8 X$ ]" G  V% D  P1 A- H
                print2arm("edma3init() Passed.",0);
$ h. f) j, a8 `: e7 s0 c        }
/ y' A2 L: k! z$ G        else  E  d% b0 W* ^
        {, ^# D7 J" j: w* M+ t+ z  S
                print2arm("edma3init() Failed.",0);6 s/ D. R0 q1 _6 k, `
        }
. E6 a% r$ z- M2 p       
. Z$ F7 Y( N4 [7 P8 [& C! r        if (result == EDMA3_DRV_SOK)4 ?: i) z2 i% N1 |: S) d8 J
    {
% a- _4 m' E% n$ j! [                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' K8 L8 q; U% e( i/ c1 F                                                       (EDMA3_RM_EventQueue)0,
6 p5 [3 z, d  w- X" ^6 v                                                            &edma3_isr, NULL);) A3 q( @7 ^- \' b: L+ B$ g! Y! A
    }
- Q- \: h- ?9 ~. W        : R! |8 a/ E' B  W7 d( r. l
        if(result == EDMA3_DRV_SOK)# Z. b) t" L& L9 ?. _" W! a
        {
% p3 }0 J3 O4 w                paramSet.srcBIdx    = 0;5 _' l  @7 S1 h. n4 ?( i
                paramSet.destBIdx   = 1;" s- a% w! p' h0 E: M, B
                paramSet.srcCIdx    = 0;* i& V+ e) S3 O9 u
                paramSet.destCIdx   = 0;
3 U( b3 p6 g% X$ M% |( f                paramSet.aCnt       = PING_PONG_ACNT;3 t' U& E' o$ G8 |, q2 e' O
                paramSet.bCnt       = PING_PONG_BCNT;% q+ o) `; }" U+ a3 [
                paramSet.cCnt       = PING_PONG_CCNT;
% l# O7 [( ?) M* ?# P) n               
6 F" Z9 y1 J5 ]2 r0 T7 ?& z                /* For AB-synchronized transfers, BCNTRLD is not used. */1 u( L. {. P( W3 m
                paramSet.bCntReload = PING_PONG_BCNT;
# b* o( Y6 C6 r4 B! J0 e0 @, u4 Y. q% m
                /* Src in constant mode Dest in INCR modes */: M' {8 C: I) ?* A! }/ S' \
                paramSet.opt &= 0xFFFFFFFDu;
- K0 v+ ?0 G$ |5 i; R$ t                //paramSet.opt &= 0xFFFFFFFCu;
) c  l/ o% H8 R( W" k# t: T2 Z7 ^               
; J; e& t( k7 Q/ c) n4 V" d" d                /* Program the TCC */
5 Z3 t' d# F  D- X2 A7 d  `* k                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 e" p; W5 p; F1 k0 ?
" ^8 b6 W! I: s" J' K8 X, z5 r; O( }                /* Enable Intermediate & Final transfer completion interrupt */
1 A$ l  F5 ^# o: I' z0 Q; i                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" z6 L: G+ l& A5 w                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 H; r: s! b6 b8 d. V- G8 j
- _" ^; H7 @: \/ T  x                /* AB Sync Transfer Mode */
( K! n) z# o7 x                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# W3 `" I4 q7 E: r. H
               
- h2 E( D* f; j/ {4 i4 _- G% J                /* Program the source and dest addresses for master DMA channel */' v) o) A8 n1 c
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
- ?' m# O& M: _. [5 q6 r/ v6 J4 @                paramSet.destAddr   = (uint32_t)(ping_buffer);
6 h# _2 ~/ {5 J6 g6 u% B3 ]1 v
! s- D7 [" L( ]                /* Write to the master DMA channel first. */
8 R+ c4 |4 `4 [+ p; {! R) t" }                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
: |! z* q/ @; L5 v6 J! d2 N/ S    }      
' g% _. J. o* L0 ?
8 }7 A$ X% R$ V) d3 v        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 b0 T  ]! v6 ?# v, y+ z+ s0 }
       
# p% b& R7 ?* |    if(result == EDMA3_DRV_SOK) " h& F! A* g. U* N5 w5 N* @
    {1 l% e' R) j; a
            print2arm("edma3 driver init success.",0);
: J4 y/ C0 J: L: f    }
  n+ d# A- O3 r; }$ u. X}
' N3 L+ n4 l4 b% H
4 Z7 x3 C2 l# B% a  P! \" u# t2 s
9 w! Q1 u3 w/ gEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
; L) f1 P  G% C7 }7 k5 P% n( E' U% G( d; w8 X

" i* O+ d! d6 n! w6 b( N, b
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 S! m7 W9 o: u! E每次DMA传输完成后都要再次使能传输

4 U6 b) l" V* V6 j. p7 Q  @原来是这样,我明天去试试,谢谢了!




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