嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 u( a  ]0 @8 Y+ f#define  PING_PONG_ACNT          1
. d( b1 _9 i% k+ F" o5 L. T#define  PING_PONG_BCNT          8*32*40
5 v# d2 V' S- B9 a0 }//#define  PING_PONG_BCNT       1
1 B% l2 F1 [# ^- w#define  PING_PONG_CCNT          1
3 \" a6 \2 @$ F#define  MCASP_BASEADDR          0x01D00000" T3 b1 P% R" o# |
#define  Mcasp_RXEVENTQUE        (0u)6 o8 [, B1 h8 D5 x$ Z6 H

0 H4 s2 q4 R1 p9 z. m. R) M/ s/* OPT Field specific defines */
! S9 |1 Q- b+ t" C  g/ R#define OPT_SYNCDIM_SHIFT                   (0x00000002u)3 m7 ^( G9 y* J0 }: o$ o/ |0 H9 ?
#define OPT_TCC_MASK                        (0x0003F000u)8 l: k$ P4 I/ u0 |8 J7 _+ r$ F
#define OPT_TCC_SHIFT                       (0x0000000Cu)
" j& q2 B0 n) c4 `#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
/ Y$ j3 j7 G" X( `8 S, _! v#define OPT_TCINTEN_SHIFT                   (0x00000014u)
" V9 G! n. `! c5 Z1 A& Q3 l
; B1 u; S7 I+ [8 v& Z" B/ Mchar ping_buffer[PING_PONG_BCNT];
! }* U, y# Q; ^- D+ A! Jchar pong_buffer[PING_PONG_BCNT];" A2 n7 _9 H9 X1 z8 r) g$ t( G; o) L
! X. n5 b0 F; t
7 [3 L3 _1 h: U. U/ Q9 O# [/ m: K

7 B6 }0 x6 N# e& B* _/ Q$ @: B7 F  P! _) o, p
static void ys_edma3_init(), F2 L! ?; d" G5 T% W, ]
{
2 i) I+ b; o' v- u3 e        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( L/ K$ C1 ^5 k* X/ G! E- Z        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ n$ z/ i4 q, U8 s* k! O$ ^) T        EDMA3_DRV_Handle hEdma;- i7 n; _* Z4 @7 r9 ?
    uint32_t chId   = 0;
$ O3 C/ S) Z' C# b9 l$ c    uint32_t tcc    = 0;
/ A2 n7 z' q9 {1 S. H% P2 l$ x& @$ F7 U: e5 \
    print2arm("edma3 driver init...",0);* e/ w# ^6 V% k+ e

5 i5 X/ o5 k+ G) K( b        hEdma = edma3init(0,&result);
) P% X; r% o3 o, l$ C. _! T2 M        if(hEdma)! W5 |2 _; j. ]7 Z2 `( h7 M$ `
        {5 p  W. ^9 J: `% U, g
                print2arm("edma3init() Passed.",0);9 r* T* h' a. {% a( U9 U, u
        }5 d4 R$ Z1 J0 q4 a" R8 Y6 R' Z
        else- \; [$ a0 q8 f# L0 U% a+ K7 l
        {
) W* w7 s& U$ ~, L                print2arm("edma3init() Failed.",0);! ^& Z. W) V4 O& Y1 h: c( `! a
        }
" D$ o5 i8 z) P0 W6 [4 t  \       
/ h. N; A3 ~& ]        if (result == EDMA3_DRV_SOK)
  s- u4 S0 D: f9 `  J    {
- B' ~/ d9 m" C: N8 T                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 z6 Q  ]% a( S, q. i
                                                       (EDMA3_RM_EventQueue)0,1 S: C% v$ Y+ p+ u6 H
                                                            &edma3_isr, NULL);" n% W) z; a' C
    }
1 d# y! t/ e4 u5 A5 J7 a2 `9 r* b' |5 d       
7 ?: v  R8 ?; m        if(result == EDMA3_DRV_SOK)
: G  I& G  c) S" Z6 F        {9 A6 b$ Z, y+ o! ^( K& ]1 y
                paramSet.srcBIdx    = 0;- C+ q; f- ^8 c9 P
                paramSet.destBIdx   = 1;; r' \* y8 U0 e8 A
                paramSet.srcCIdx    = 0;5 Z9 q' k% C) }
                paramSet.destCIdx   = 0;
6 d* P- {5 h+ Q                paramSet.aCnt       = PING_PONG_ACNT;$ y; F% Y! f# k; Z3 I
                paramSet.bCnt       = PING_PONG_BCNT;$ z- G3 H9 G% y# E# P7 @: v' Z
                paramSet.cCnt       = PING_PONG_CCNT;
: p. N% h. p8 U& }               
" j8 s5 |4 z$ n4 x* {' `! p                /* For AB-synchronized transfers, BCNTRLD is not used. */. P$ a/ X! i2 Q
                paramSet.bCntReload = PING_PONG_BCNT;0 {; z& N, O3 [& y2 w
+ f% c# @* V( n
                /* Src in constant mode Dest in INCR modes */1 ~5 u# U$ o; s4 a7 k8 i# k
                paramSet.opt &= 0xFFFFFFFDu;
# G) v% C, \1 X/ r  U                //paramSet.opt &= 0xFFFFFFFCu;1 M( L& ]% d: h4 q; x
                : w4 B* V" x" f6 J# M: Z4 J# X+ x
                /* Program the TCC */1 S+ v8 s* d* x: x5 S* J% T
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" ?3 V' V: W9 x" [- n/ v1 k$ \
/ W; J- d) U9 |. {4 p3 t5 n$ r                /* Enable Intermediate & Final transfer completion interrupt */7 ~5 c& \4 t1 ]
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! x5 H' z8 A( l  A0 F! M1 [& Y6 ?                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ ~" J" @3 y. ~1 g( `+ i, _5 ]
: R) m3 {- g# e1 t- Z# M8 j                /* AB Sync Transfer Mode */
3 A2 Y) f/ T1 ]4 e. o' v% w                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& J2 D3 C- W: C+ h" N9 t) L
                3 {, g' y/ @3 J( B% h
                /* Program the source and dest addresses for master DMA channel */+ {. x7 E2 t& E* X9 V$ H
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);7 m$ E% n8 W  y/ v
                paramSet.destAddr   = (uint32_t)(ping_buffer);
, Q) k4 z5 O( L( C% ?& y0 F# \( T' f, `" o3 v/ W
                /* Write to the master DMA channel first. */5 e5 x" j9 Q. F2 s2 S$ h/ K
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- O! R: B( d* e& `. E- w! c
    }      
7 g: V. z# ^" s6 k& }# B% w) n2 {2 @# r: d) S
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 z, _5 \7 \9 `) F$ g4 s& Y        : [$ i8 r, `$ {# {* o8 B
    if(result == EDMA3_DRV_SOK) 0 ^2 t9 U. U& ]; m- n, ]* @
    {2 W" e, X) L( j/ D
            print2arm("edma3 driver init success.",0);, w8 X  A3 Z3 x1 l. W
    } 8 y+ ?' O4 L/ G& c
}
& X& L- P7 l* B- {) e/ i* I+ D8 X0 ]: x* n8 M. l! v: S
" T; u$ A4 P7 x7 ^. b' [# x$ Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, X4 v" i- p: ?, D6 ~* f9 d' a8 U

+ G4 Y# D8 @# R0 \3 U1 C3 N' f6 a  h* V8 e) N

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, u! H3 J( e/ b8 p! [5 T* @" H每次DMA传输完成后都要再次使能传输

" m- e" i/ u# y# P- q原来是这样,我明天去试试,谢谢了!




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