嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ Q8 r2 E8 S$ f#define  PING_PONG_ACNT          1
, }5 S! I4 S! f8 d/ {) G#define  PING_PONG_BCNT          8*32*40 * X* U% p( b/ D& x
//#define  PING_PONG_BCNT       1   k( {8 w; h! a5 N6 h
#define  PING_PONG_CCNT          1: _' p5 v& N6 T* [: C; [
#define  MCASP_BASEADDR          0x01D00000
5 T8 p  G- k8 u8 t: C0 \% W#define  Mcasp_RXEVENTQUE        (0u)$ F# r  O1 B0 e3 g0 V
( ]2 u3 G+ i5 Y" ]- Q( M
/* OPT Field specific defines */
- S& w+ w0 H7 g4 a% ~0 L* B#define OPT_SYNCDIM_SHIFT                   (0x00000002u)0 G! a. Y- U- n9 M( ?$ C6 n! F" t
#define OPT_TCC_MASK                        (0x0003F000u), h) s, m) U. }5 r/ Q. \, M
#define OPT_TCC_SHIFT                       (0x0000000Cu)
$ X4 q9 d! |  S, f3 I' r#define OPT_ITCINTEN_SHIFT                  (0x00000015u)8 p( T1 e1 K& t& C: Q6 C7 \
#define OPT_TCINTEN_SHIFT                   (0x00000014u)9 F5 C7 z0 H5 l8 z; R

9 P. ^% p% O0 ^8 _( K' dchar ping_buffer[PING_PONG_BCNT];
' a- o4 Z% ~; n: x; g3 ]8 zchar pong_buffer[PING_PONG_BCNT];
5 O" [4 e/ I$ f/ T
) B1 ]9 i7 @$ P  {
5 `2 g6 n1 Y( @- u* P' x4 P
( _% a3 ^& f* U- ^/ ?5 u
9 A: n# A- j. H: J$ x/ X8 Tstatic void ys_edma3_init()
# @. d  e- f; {3 K{7 {0 Z+ q* X5 x# w/ s$ i
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 L+ f" W$ G+ P* b
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;! `) m/ z; x& ], c8 R6 u
        EDMA3_DRV_Handle hEdma;
, K# _5 R5 l3 _1 W) Z    uint32_t chId   = 0;* L* l! d: X2 E/ ?4 @: E" V
    uint32_t tcc    = 0;; j1 m) P! s. m8 H' m

' z3 Z( r- o9 G- |- o( X    print2arm("edma3 driver init...",0);
- _5 R" Z% ]3 V' r4 h+ L: V0 B# S. N5 ^& ^% d& J. x4 `% v
        hEdma = edma3init(0,&result);
& K! `) O( C5 p# J7 R        if(hEdma)
) r/ d- H1 [" M! U        {0 A! M5 `- X( w
                print2arm("edma3init() Passed.",0);' z/ ?+ p7 t3 a2 c
        }: P" b- a* a6 q, p+ f$ @
        else
" p8 N, F! O# q4 V7 K        {3 ^, Y/ e  u2 y# Y& m/ k
                print2arm("edma3init() Failed.",0);
0 }2 L8 v. G* b/ }; y2 s        }
  ?' l( Z. @- T! E4 p% Z        4 v# y' T: m5 G; ]
        if (result == EDMA3_DRV_SOK)
" o: ^" r, t% A5 S    {
0 ?7 _2 b+ F  j# x% l5 d' w1 W                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ v  q( T! e% {' C; b4 m$ V& j$ {) g                                                       (EDMA3_RM_EventQueue)0,3 c- o# C$ z+ j- _/ M& H
                                                            &edma3_isr, NULL);
" A; e6 M, c) `3 S" \  Z% O    }; P5 S1 P; u3 }" \
       
8 J8 O) k: S2 P        if(result == EDMA3_DRV_SOK)3 {+ `! k0 o; q$ B# e- k% y
        {- ^# Q: ~8 h. X$ e- |
                paramSet.srcBIdx    = 0;
5 |; z: c/ \8 ]* b; c                paramSet.destBIdx   = 1;$ X) O7 u- e3 g- b7 \; x
                paramSet.srcCIdx    = 0;& r* D9 t2 t+ O0 x4 c6 P* ?
                paramSet.destCIdx   = 0;
& r8 @8 p7 n. t/ S                paramSet.aCnt       = PING_PONG_ACNT;
5 }# \& h9 J$ U( P: C) T5 x                paramSet.bCnt       = PING_PONG_BCNT;
( Y. r* E. z: B) g* y* `. b                paramSet.cCnt       = PING_PONG_CCNT;5 N$ k8 B1 j' n
                4 d1 c5 d" O% Z3 ]. g
                /* For AB-synchronized transfers, BCNTRLD is not used. */
4 A* S3 u$ X* W4 I- U) S                paramSet.bCntReload = PING_PONG_BCNT;. b7 K; j6 D0 \, }; l

2 X* i9 w" u- q& K                /* Src in constant mode Dest in INCR modes */- b$ }" G) d; U* i8 P) K
                paramSet.opt &= 0xFFFFFFFDu;
9 B$ H. n0 p+ J" I5 F( l; |                //paramSet.opt &= 0xFFFFFFFCu;
9 G; s- ?6 ~. u( A9 N! Q1 P7 [, j8 z6 u                * w; q) q8 W) N. w0 U6 ~
                /* Program the TCC */4 W9 E0 n9 K/ l8 q# V; H
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);% {! S0 r, s- y
% o- V/ L5 Q4 \, L& m
                /* Enable Intermediate & Final transfer completion interrupt */
- P; o: f0 A& ?# q' {8 f3 F) L                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* Q! c. h" v- `' v                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ L( z4 S# T4 h# ^3 j; Z  r
' n( u( C) P( D9 {  B) P                /* AB Sync Transfer Mode */
, a8 C  X) E9 v- C" s- J$ V% n                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! X# P' R$ d& \" {1 \! }  P6 E3 ]                ; L$ W& J) l+ y. I* {
                /* Program the source and dest addresses for master DMA channel */; o( p/ d+ Y8 C+ f5 {9 T7 y
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; C; K) [& Q6 F
                paramSet.destAddr   = (uint32_t)(ping_buffer);; T0 [$ ?# r: \8 B4 b7 d" x0 J
  K! Y' s7 ^8 t, `8 Y0 D3 U
                /* Write to the master DMA channel first. */
2 A3 T" p- I) @& a0 i- b                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
5 K7 K# o4 ~# l6 }& S' q    }      
' _1 I* l6 |' C3 C! }- Z
+ t0 W' |8 m+ F' Z( p        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
0 Y2 `3 }) F9 P5 r8 @" ?6 e        4 s+ L$ P# m+ L$ e! N% q6 w
    if(result == EDMA3_DRV_SOK)
! i& ~( a) [, i; U    {4 i8 }: p5 ?( w: }6 B
            print2arm("edma3 driver init success.",0);
( _; c% h5 [: P( `% B+ O    } : B8 O9 Q5 C- h$ f- G
}
  B9 j  [. W. W6 b
# K, u! h0 d1 d6 O- @! a
/ ^- t6 ?" O) S4 h9 h0 l) j/ YEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 {* K% E; f7 Y1 D
3 |/ T4 L+ n9 _& W
4 f. W6 I: i% N, r0 F

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 W4 I# y7 o8 ^, C5 u. [每次DMA传输完成后都要再次使能传输

0 ]; _$ F9 t0 r3 x. `1 ]原来是这样,我明天去试试,谢谢了!




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