嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 I& g' u9 _& P6 n( O& L6 U
#define  PING_PONG_ACNT          1
( u( j0 c5 [( k4 x4 \/ S#define  PING_PONG_BCNT          8*32*40 5 |7 [/ F1 r; O7 c9 i
//#define  PING_PONG_BCNT       1
/ E8 s1 ]: ]) i#define  PING_PONG_CCNT          1; Q$ h1 w: x2 k
#define  MCASP_BASEADDR          0x01D00000
' F; h* v) q! L+ w4 n" r/ c$ k#define  Mcasp_RXEVENTQUE        (0u)' k& M2 D$ m5 _' F
' Y# o; A# ]: E( w" h- D. F
/* OPT Field specific defines */
" U0 F4 @, ^, W( r: t#define OPT_SYNCDIM_SHIFT                   (0x00000002u): Z/ ?2 P5 r% @
#define OPT_TCC_MASK                        (0x0003F000u)
  f" E. z; m9 t9 [#define OPT_TCC_SHIFT                       (0x0000000Cu)
  e; H* O$ q. L) K0 b#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
/ k# ^$ {, _0 W5 M  G#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 I) ?  \0 A4 a+ r" k
+ {# ^. L* v* m# s: r  y4 ~9 fchar ping_buffer[PING_PONG_BCNT];2 K: I: X# w( B9 }. [
char pong_buffer[PING_PONG_BCNT];  h2 n% g' R( T) P2 P( F' T8 ^

3 Y5 h9 _/ Y6 P4 E* i! z
/ y, C9 d* [$ Y/ i. j3 e+ ~" }
# G# ?8 ~7 f9 X0 u5 t% J6 z* i
$ y2 c* q- w: o& R3 Sstatic void ys_edma3_init()
# R" S2 n0 P; I' H# H1 B7 V{8 W+ A* ]3 P  x% X4 {
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: M7 X2 C4 C& a' L
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# w. `: J  K2 p
        EDMA3_DRV_Handle hEdma;
, x6 h: C8 G9 H# `    uint32_t chId   = 0;
' [# Y; r+ a" y9 I: l    uint32_t tcc    = 0;6 f) w1 X2 |& m4 U
& P- D. n$ @- v2 m/ B# ^
    print2arm("edma3 driver init...",0);' R; a+ ~; u/ v

1 n+ |' W. s& y/ [5 E( P) L. O        hEdma = edma3init(0,&result);$ b) {1 T: |7 |& s; _
        if(hEdma)
) R0 f* `' i6 E6 ~2 z0 f1 d) f, e. m        {
# f: \- ^* q; h, W  x+ D- f                print2arm("edma3init() Passed.",0);3 c  X1 |1 L! P% s
        }/ o- [5 P, H0 R* L
        else0 k. W# f1 t9 [  E: L
        {9 S3 A. h9 |- N1 @4 c8 M" y3 S/ D
                print2arm("edma3init() Failed.",0);
& S9 [( G' }( W1 M        }, P. T2 t+ W2 P2 i; H2 p
       
, L" F" o3 C. W" X% d  D/ d        if (result == EDMA3_DRV_SOK)5 ~8 X% U* Z. L( }( p
    {$ H5 @5 s/ A- y7 D
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,. [4 M: ~% }, m7 ~* N5 s& [6 T
                                                       (EDMA3_RM_EventQueue)0,/ t, J  h( O5 K, {, e
                                                            &edma3_isr, NULL);
, i; E9 c1 r  D( U! p' }1 R    }0 Z) X. d" ^- P# \' P
        3 |% O2 X* y; O8 v) ]/ Y7 H& }7 [% S
        if(result == EDMA3_DRV_SOK)) v: V$ P* w! W# @$ R' W: [. r
        {( {( |* m# [# W" \/ {5 b
                paramSet.srcBIdx    = 0;
' s" f- a' s6 W5 a% r                paramSet.destBIdx   = 1;4 f4 G! l$ X8 d2 [1 o4 O
                paramSet.srcCIdx    = 0;  p& S7 C. b  L$ c  P5 x
                paramSet.destCIdx   = 0;
& r( O3 p- y4 F% w. t' C3 P- q) g+ m                paramSet.aCnt       = PING_PONG_ACNT;
0 y5 @  t" r% y5 c                paramSet.bCnt       = PING_PONG_BCNT;. }: d  r4 k' u( v1 B- T
                paramSet.cCnt       = PING_PONG_CCNT;
- I( `. ^" H! C, X  D               
+ |" {( [/ X0 S+ d% Q& E1 x* d                /* For AB-synchronized transfers, BCNTRLD is not used. */
; j, R  Y6 q5 U: C, g! ^; i4 h                paramSet.bCntReload = PING_PONG_BCNT;
& m% T. r. r* I. @0 E' d2 _# N6 e% a) `6 \  T5 c5 S/ R
                /* Src in constant mode Dest in INCR modes */4 p2 c7 G' |0 Q
                paramSet.opt &= 0xFFFFFFFDu;8 u. e( Q- ^8 v& |9 m: G! u  q5 p
                //paramSet.opt &= 0xFFFFFFFCu;7 }( j9 _8 y* p3 U8 e/ u, z
                ! h3 Q& l* F# L: Z5 O( J- e
                /* Program the TCC */
8 q9 |9 s8 [% }9 a* g                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( {  L. R6 Y! `( G; o& _

0 n, i. J4 X; u+ a2 l5 K                /* Enable Intermediate & Final transfer completion interrupt */
" Z4 l4 }4 w3 \$ ?  T6 y                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( J% t3 e1 q# N" `+ P# B                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);  Q) X/ X# D! z+ T4 K6 p

# P% p8 c2 l. n8 Q/ m                /* AB Sync Transfer Mode */1 ?& U- n. W) F; G& a& ~
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% X! n9 F, u: {$ R
                3 c, c* w. I1 q: p6 E
                /* Program the source and dest addresses for master DMA channel */. h! \$ M$ q5 S/ }. X
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
/ D; P* m: k' |: x2 g                paramSet.destAddr   = (uint32_t)(ping_buffer);  x2 a0 a* C4 ?" z- i2 A

- H$ M# K- T& ^% O/ p: d8 K                /* Write to the master DMA channel first. */
' }, \! {- B9 n& {% L5 X# f                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
: o3 y7 _/ l: q2 j5 G; I8 t* ~    }       " j$ l2 P& T  U9 @) U" k

+ s6 _- {; T4 `' v' o) j. k3 b        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! i' @5 h- C1 y; B- T       
8 [4 n( [$ P# X9 w* h    if(result == EDMA3_DRV_SOK)
6 h2 `/ F1 ?2 y. J2 T* _    {5 F7 z' z; P6 }) N4 D" r
            print2arm("edma3 driver init success.",0);) o7 O9 }- x+ T- d0 G+ m9 d
    } 7 k$ z# b( j7 T& S
}$ D* `6 \" K; y9 I- o, F

& U+ a2 l# C  x1 W/ N* K/ h9 F; B  I
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。1 B) u% ~2 L; B  _3 ?! i# O3 U

  u$ `9 I( y+ s3 A
5 G8 r2 m, j8 M1 z4 o
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) w5 J( M, p$ {1 K每次DMA传输完成后都要再次使能传输

* @, z% v! z$ s5 I( V* w9 {  z4 a原来是这样,我明天去试试,谢谢了!




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