嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& `5 {* a+ ~' O! Z: y" w& d* j#define  PING_PONG_ACNT          1
' h. }4 t. [3 d0 M) N#define  PING_PONG_BCNT          8*32*40 / l6 E& [! B* ]
//#define  PING_PONG_BCNT       1 3 I) N3 `* j% q7 V  ?2 H
#define  PING_PONG_CCNT          1
) Q' D- ?9 F' F4 \! \' ~0 j4 }#define  MCASP_BASEADDR          0x01D00000$ m+ G# ?4 x8 j- Y& T
#define  Mcasp_RXEVENTQUE        (0u)7 q% S* d  A- z7 h6 g0 f' w  W

; w& `3 T# L# r/* OPT Field specific defines */. S7 U* y' i6 {3 |) G
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
2 L9 c6 o+ e8 e( ]8 p( u#define OPT_TCC_MASK                        (0x0003F000u)
; b! Z. R, E1 f  S#define OPT_TCC_SHIFT                       (0x0000000Cu)1 H3 O, r: T2 |; w6 z
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)1 x& M$ J& n" z2 t+ Y
#define OPT_TCINTEN_SHIFT                   (0x00000014u)& j- \& K4 |  o
+ w. ]% y1 ]2 w: z  O
char ping_buffer[PING_PONG_BCNT];
- a6 ^* T) y% N( y, ~6 G; lchar pong_buffer[PING_PONG_BCNT];, N$ j. m6 k/ w- H; q% a, t1 u  E
! e( e) `+ N7 M* c0 y

; L" \5 c, n& o' [3 B. b/ f( [3 H1 e

+ @+ `/ k& S9 |5 B' S# xstatic void ys_edma3_init()+ t0 B$ S  n! P1 |0 ]! \$ P7 Z
{0 {/ @3 H! C- _0 v9 J$ L
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 @" F0 z: J3 R: T# D( m  Y2 K        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
: _! x* F- J9 U5 D/ @0 k        EDMA3_DRV_Handle hEdma;. G3 d4 }- n1 Z
    uint32_t chId   = 0;
/ l4 _0 b( Y! E* m+ M8 W, |    uint32_t tcc    = 0;9 X# l' G" e4 x5 G+ ^. ~4 I

- M5 m& d5 t3 S8 G8 F    print2arm("edma3 driver init...",0);. T, F: r1 w- X! z- ]& b4 t* V9 P3 I
; `2 T3 m, R& e. j% m' _  P
        hEdma = edma3init(0,&result);# I( S: z9 N" T* \: n$ i
        if(hEdma)
! n3 h4 w9 x' w3 r" I7 u3 `: z        {
8 P( |1 O7 n* n- ~                print2arm("edma3init() Passed.",0);
% D5 {. X: K. W7 D, W; {3 e9 }        }
  j8 Q) a* d$ ?5 k1 m2 _        else; A; q/ G6 Q2 [/ j" _, P
        {
3 B5 F9 z8 ?: G9 J                print2arm("edma3init() Failed.",0);8 A7 ?8 r) H8 Z& b& T, s! [8 Q9 h
        }
4 i, I: h9 G" Y& u& ^       
6 x$ K6 i3 `: F$ L' z        if (result == EDMA3_DRV_SOK)" S4 G9 R" u( D$ ?4 \
    {% x) v& p- B% K3 T
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& R" j! {! H( K( F2 R                                                       (EDMA3_RM_EventQueue)0,) y6 c4 s5 x3 ?7 G2 Z
                                                            &edma3_isr, NULL);
# `+ _3 t# V- G" A* l    }" Y* J1 Y; Q! g6 O, `0 v) ]
       
: R* W) y3 H- ], g5 F# F+ s        if(result == EDMA3_DRV_SOK)
- m# K6 a; ?8 ^0 e# N        {+ F6 M6 T6 W! d: O. T# Y% P
                paramSet.srcBIdx    = 0;
; A4 E, ^# P0 B; G6 t/ N- l                paramSet.destBIdx   = 1;
. D2 K( r# @6 [4 @# M/ f                paramSet.srcCIdx    = 0;
- g1 @: `7 k* y9 z                paramSet.destCIdx   = 0;
1 l: G4 ~  l7 Q3 B+ F  ^4 N                paramSet.aCnt       = PING_PONG_ACNT;
4 u& S! Q2 x$ M& c0 O+ U; |, s                paramSet.bCnt       = PING_PONG_BCNT;1 X7 q* I' A1 N; _7 x/ [1 _3 s
                paramSet.cCnt       = PING_PONG_CCNT;
6 h2 a3 j( K' C3 i/ E9 _               
/ R2 r  {! [; c, y                /* For AB-synchronized transfers, BCNTRLD is not used. */4 N. N+ n& O6 N5 W5 }# C
                paramSet.bCntReload = PING_PONG_BCNT;! k4 l( ~1 C6 I: r9 Q
" [# V! b' y; L' d1 r- u
                /* Src in constant mode Dest in INCR modes */+ G! a9 W' ^4 Q' u8 u
                paramSet.opt &= 0xFFFFFFFDu;
8 s; k+ T8 @& J; I" d                //paramSet.opt &= 0xFFFFFFFCu;
* b' t7 \/ j& M, e( v1 a+ k                : `- z# v: R8 G# l5 H( W$ m$ Q
                /* Program the TCC */+ ?8 ^% p% c0 j! m3 b
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 p" e  ?) G5 A+ Z

+ l% W$ l( h, i0 D0 J! o; i/ B                /* Enable Intermediate & Final transfer completion interrupt */3 E6 ?- Q0 C7 U: Y! R) f0 c8 n
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);" }, {$ m1 |. z/ G. e2 Z
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ E. W5 M9 k8 I$ E9 ~6 }
; n! H1 R! X; h9 r                /* AB Sync Transfer Mode */
4 L( k4 j3 A0 U# C' r- b1 u6 W                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 P0 U1 @& Z! J( d: w8 K4 x
                & @8 m1 m! P9 x
                /* Program the source and dest addresses for master DMA channel */
+ X0 M9 B* j, @8 f( a4 U                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
, t. h7 D9 J  S: ~; K8 J                paramSet.destAddr   = (uint32_t)(ping_buffer);- |; }  v3 h' O! {

  n1 n  o# ^% ^8 w                /* Write to the master DMA channel first. */- [8 C, F2 A* @0 q- T3 K
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);) T) M0 k9 [# D5 H7 K
    }      
4 E6 [) b5 h3 q9 n4 m  V" q; m( C; x& T
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 I+ f2 F! v8 G: \! q
        ! G  v1 j+ o& m; B5 _5 Q9 f' x
    if(result == EDMA3_DRV_SOK) : k& P& F) _/ F4 F7 k( i- {
    {
! {$ Z$ X9 s; v. C            print2arm("edma3 driver init success.",0);% F" a& M, r, R6 X% K5 }  e
    }
& v- d7 n& B/ l$ B$ K% u7 @; U}
7 F6 |* D) {) Z+ Z: d& d8 P: _" o' V
" D2 L5 g/ ~! Z' s* w) J  o3 u+ A! L& ?
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! L7 `  V4 H- l" z* {

$ o* B: [/ k3 v. T1 z
& x  {& j1 ]5 f) q* o
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
0 m( }+ K# V; h  N& u' j- d6 `每次DMA传输完成后都要再次使能传输
+ L7 M. r! ?6 M: F
原来是这样,我明天去试试,谢谢了!




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