嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 l0 U# C/ M  F$ e9 x#define  PING_PONG_ACNT          1! @: ~9 `7 [, H9 R3 M: q8 z4 X* f3 O
#define  PING_PONG_BCNT          8*32*40
0 H: x0 h/ R5 v! {//#define  PING_PONG_BCNT       1 + H& A2 u* a6 V% p) B
#define  PING_PONG_CCNT          1
, x0 a6 j/ y8 y! }0 y3 J0 [/ Y# Z#define  MCASP_BASEADDR          0x01D00000
0 @$ o, \8 S5 i3 S#define  Mcasp_RXEVENTQUE        (0u)
* f/ c, N6 V0 t* K6 ]! j' Q1 A  Y+ Q& t- q; ~: {$ ?; p5 ^
/* OPT Field specific defines */
) L% u# i- J0 F. ]#define OPT_SYNCDIM_SHIFT                   (0x00000002u)" O9 I8 R1 v1 _4 o$ [
#define OPT_TCC_MASK                        (0x0003F000u)
$ ]+ ?0 Q2 m+ x1 Z& a#define OPT_TCC_SHIFT                       (0x0000000Cu)/ ^( A  O+ L/ [) |. `: P6 M( ?
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
2 h  i8 T. g5 a3 Q#define OPT_TCINTEN_SHIFT                   (0x00000014u)/ J9 r7 I0 l2 {4 u3 C  r

2 j" Z8 R7 w! m- R/ W. [char ping_buffer[PING_PONG_BCNT];  j& N. ?- |& Z* u3 }/ s5 H, W5 f
char pong_buffer[PING_PONG_BCNT];& y* d% v9 E/ r
" v: u5 v  j* G9 x) g

# M9 X; A  H6 G( V. y" j: O6 {7 Z7 k& z7 `7 T

* Q( L# W4 s5 m* M4 C9 \static void ys_edma3_init()
/ H/ L) F: A: y! d; B{) _/ L$ c6 R2 T* \
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
- |  M1 v, y6 @( L0 p! d# n        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! g' w* a" @+ u+ i        EDMA3_DRV_Handle hEdma;8 _4 U# C* }2 s! f2 A+ P
    uint32_t chId   = 0;  L# x; R9 X1 W1 F% k5 E9 L
    uint32_t tcc    = 0;/ s5 W" e; C$ E5 i& Z

+ ^( y% S, |* n  ~    print2arm("edma3 driver init...",0);% Q9 `) o) Q( R. Q' P& h

' W3 Q6 i7 `8 [+ f" K" G: B        hEdma = edma3init(0,&result);) U9 v# z4 k% K9 ~4 F2 U7 U: M0 Y, b
        if(hEdma)+ K4 n3 _6 r6 z# h7 q
        {
2 `9 u" g6 {; X                print2arm("edma3init() Passed.",0);2 E( E$ ]; Q, ~8 U" J5 R
        }, q5 w; n9 ], Y: O
        else2 i( Z- C6 {) v! h
        {
! F! ^/ g- _; k7 M* X" u" X                print2arm("edma3init() Failed.",0);
1 d6 m# e1 g4 ?8 s" ]  }        }
6 K# N6 I2 u7 Y# Z% ~$ @) r/ h        - [; E/ s% k% V
        if (result == EDMA3_DRV_SOK)
2 Q+ ]0 }  t5 J5 x* Q    {
4 T$ K6 H9 C1 ^) ~9 m* b$ H8 y                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
+ k$ Z0 \. j" I9 C' v                                                       (EDMA3_RM_EventQueue)0,4 b" @$ q$ j# a% _' q" I" |
                                                            &edma3_isr, NULL);% L5 g7 x: ?6 R+ A- J+ V
    }7 o7 {8 s1 W6 Y8 U
       
+ i2 _- o) }7 {0 W: I8 D        if(result == EDMA3_DRV_SOK)
0 A2 ~: l4 e, X        {
) I; o3 t8 r$ D- g/ k6 k6 A                paramSet.srcBIdx    = 0;. T- E+ ?* \3 [# S8 `
                paramSet.destBIdx   = 1;
# o" \8 k0 h0 J5 m4 d  V( j. K* E% _                paramSet.srcCIdx    = 0;$ u$ a5 q0 s0 l  \! v, a$ K) w( U
                paramSet.destCIdx   = 0;
2 S7 D$ B( l: K: Z                paramSet.aCnt       = PING_PONG_ACNT;
" {0 ~$ P" l+ Z) y. i# t                paramSet.bCnt       = PING_PONG_BCNT;# R2 B; c5 Q# @& H3 Q1 S9 g+ H
                paramSet.cCnt       = PING_PONG_CCNT;; C. z4 x  R- T* {4 C$ D6 K. Y
                1 f9 O8 s/ U. j
                /* For AB-synchronized transfers, BCNTRLD is not used. */1 R" [, G! c+ |+ N
                paramSet.bCntReload = PING_PONG_BCNT;' c: {3 G" D4 ]2 N3 K

1 r  \/ f3 M( E/ H                /* Src in constant mode Dest in INCR modes */
  c- X9 Y) |8 w                paramSet.opt &= 0xFFFFFFFDu;. ^) w8 i; E* ^3 e
                //paramSet.opt &= 0xFFFFFFFCu;
1 }/ H. C9 s' ?6 b                ! E$ @: t+ x( M' I# s
                /* Program the TCC */
9 x4 i8 ]7 j$ j4 z& d- M                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
7 A2 }/ \# k/ U7 Q; \& X0 x6 W( E
                /* Enable Intermediate & Final transfer completion interrupt */
. \) ?/ y; f6 @  t/ h6 q- c) |! U# {8 j                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, _8 r6 N% A* c' A4 y% P
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 ^$ p5 @1 U  C% U  x4 C

4 P) ^  B7 Y# @! @9 c                /* AB Sync Transfer Mode */
# n! q2 U5 R2 e: E8 r$ a                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ q  K! q5 O( t- J& m6 I
               
% m- q6 |& t% O                /* Program the source and dest addresses for master DMA channel */
2 s$ g' r% Q, s; A7 g                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
6 o5 {6 J$ Z, N. d                paramSet.destAddr   = (uint32_t)(ping_buffer);: h" L6 J: W* ]8 H/ a

1 X5 ]) K7 t# q& U, Q8 P: o                /* Write to the master DMA channel first. */; A/ ?7 F# i& D" r, V! _$ q" ~
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);/ |, E6 }) k) `; H- D
    }      
3 N( q5 D" F/ B" K, S4 u$ c' M; i4 l" i
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 J% x: t0 v$ w. |2 |        ' B# x; u- w& t9 u! w4 N
    if(result == EDMA3_DRV_SOK) 2 i$ e! ?1 Y, z3 T9 ?0 J( r- ^- I
    {0 s/ L9 E( s) k4 }5 `/ l
            print2arm("edma3 driver init success.",0);6 c6 q. W; C8 \  `  u6 n& `3 b. J0 ^
    } . p* @% M# [# g* `1 R9 D
}
0 x- Y& s$ O4 t0 x6 P; B- i/ W# X' [% i* ^6 m
- t, d2 ^( f3 k# O4 v6 w# o
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 B4 H9 W6 h- k, n) }
2 g9 t2 X2 L6 q$ f3 u1 w/ p& J2 K% V" l* e' K9 D7 B8 g! v

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
" X' f$ ~$ ~' {5 Q每次DMA传输完成后都要再次使能传输

3 e! M2 Y8 n( c1 X: a原来是这样,我明天去试试,谢谢了!




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