嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ X, K6 S- ^9 R+ k+ u2 s
#define  PING_PONG_ACNT          1& Q- T/ w* x% w# f) q. o* m4 H$ _% e
#define  PING_PONG_BCNT          8*32*40 4 \( t2 A2 h9 Z  J7 k
//#define  PING_PONG_BCNT       1 ( X* n6 s9 J  ~- l7 ^
#define  PING_PONG_CCNT          11 X0 [3 R/ W( {
#define  MCASP_BASEADDR          0x01D00000! S, s0 o6 g$ Z# r1 h. ?
#define  Mcasp_RXEVENTQUE        (0u)
, e/ P7 X! y  }( l& m/ S6 u/ s- z6 \# E
/* OPT Field specific defines */
5 n- _/ d6 ~, `1 |/ ~$ y#define OPT_SYNCDIM_SHIFT                   (0x00000002u)2 ]8 Y' i9 D5 G$ n% r. ~9 T
#define OPT_TCC_MASK                        (0x0003F000u)
1 S& {& x+ u2 e9 V2 F: j( s) F#define OPT_TCC_SHIFT                       (0x0000000Cu)1 e; w$ L0 A- p- w! v
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)4 v0 \) ^7 M) l7 }3 }; c" B0 z
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) t5 m3 P7 b& ^, s* |
3 c& E3 ^; z4 Kchar ping_buffer[PING_PONG_BCNT];3 k. z1 L" g7 p; D
char pong_buffer[PING_PONG_BCNT];
& T6 j8 i) S8 X4 o( h1 Q+ p$ q4 z& j) i0 j( k4 H8 O" \6 [

/ m- P9 B( q( d- B9 o2 |$ W! V4 a1 O! n1 m- P9 X0 s

- R& R; o3 `/ S/ \: H7 xstatic void ys_edma3_init()' x: b7 D- X5 A+ o
{+ L& X# A6 t3 X2 ?1 L' p+ ~- a
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% i5 ~' J  U0 [; f- w; m
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
; ~; |3 x4 w6 W* r4 `& g        EDMA3_DRV_Handle hEdma;
2 q) N( `* M* z6 B. y    uint32_t chId   = 0;
% j  Q5 A, f, d5 d+ |- L% r    uint32_t tcc    = 0;
! c( b/ I% L) b  C; D. e  w# A0 a
    print2arm("edma3 driver init...",0);
) [' g" ~/ Y# f- W! }- N5 |  R0 L; {% e
        hEdma = edma3init(0,&result);8 n3 ?0 d5 {1 `; M3 T5 B/ S* M
        if(hEdma)
3 |: A2 O+ a, O( A0 ]        {
; Z( V; k/ b, y5 R                print2arm("edma3init() Passed.",0);# ]/ m' e% D- y0 L2 ?. n7 s1 G
        }# p3 `: @( M' o! Z
        else
$ A$ ]1 `! F, r5 w' `' O6 a        {" z" P# G7 p( k6 N/ ?: V
                print2arm("edma3init() Failed.",0);- b, @6 T2 w  L
        }: e# T" x1 E2 P: P7 r1 {9 h" M
        ) I/ P6 P3 B3 v: N6 \( B
        if (result == EDMA3_DRV_SOK)- H/ D) K$ j( S2 L! i- F: ]" W
    {* l2 t7 J$ U8 O2 _  m2 y
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
3 ?4 B; o' l0 x                                                       (EDMA3_RM_EventQueue)0,5 a& E% [* L6 O7 r; m8 \% u
                                                            &edma3_isr, NULL);
; Z) E# g  e0 p6 H( W    }
8 n- b0 {6 t- e1 K9 K8 b' @% w       
# ~- E( j* T2 g* o3 x3 Z! Y        if(result == EDMA3_DRV_SOK). x1 {+ a" A, j
        {3 O$ j7 O" i- t, [4 N2 I' ?* @
                paramSet.srcBIdx    = 0;5 \3 {  `! _# s0 U
                paramSet.destBIdx   = 1;
- ?, |: o; I& h) v8 W: l# a                paramSet.srcCIdx    = 0;! n# g1 j2 ~4 y, N
                paramSet.destCIdx   = 0;
# d! s3 W6 d" g, q( `$ J/ b                paramSet.aCnt       = PING_PONG_ACNT;
# Y& E2 }% v0 k1 ?, T- f4 a                paramSet.bCnt       = PING_PONG_BCNT;' V6 _" N6 C$ T" x- {
                paramSet.cCnt       = PING_PONG_CCNT;% {+ |- U0 F  J2 r! ?/ o
                & E7 W& h- Q: w4 t" i) n3 `
                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 H" b  R# |! S( p& H7 B' c' P                paramSet.bCntReload = PING_PONG_BCNT;- u, R4 V$ q" i  v1 C9 ~# [
! C; s+ z2 }# L3 Q+ V4 w, n' l- i8 y
                /* Src in constant mode Dest in INCR modes */# U4 M* {- I! D) ~% F6 {5 p
                paramSet.opt &= 0xFFFFFFFDu;
  `/ \! Z1 Z2 o) C                //paramSet.opt &= 0xFFFFFFFCu;; p0 V/ ^( O0 i' t" K4 R# I9 ?2 r5 G
                ) @" `# W# G' r  b7 O
                /* Program the TCC */: M- [0 K+ g9 p  f; Z: @
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 B- e$ b9 F( {" a. p- |1 u. |; b" o
                /* Enable Intermediate & Final transfer completion interrupt */
( O$ ]' @7 Q" \6 t8 U" X" \  N                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* ^) o: K5 z- M- R
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! n1 _& r8 w, a" t+ G
4 t3 l* t; Q/ r' H8 E
                /* AB Sync Transfer Mode */7 W7 o. d9 D- o- j4 P) w
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 x8 c( d1 x9 o! v6 d: u5 K' t5 l: p                ' j, Y6 q/ |6 l; h6 Q; R0 U5 C
                /* Program the source and dest addresses for master DMA channel */# q2 Z7 G; S0 B; o  W
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
' m# m  W* n& j5 b( i# ?# v2 o3 m                paramSet.destAddr   = (uint32_t)(ping_buffer);* m% C! q2 a+ A0 q# n6 s/ A! N$ k

) U2 h. }: W3 ~7 O6 A- z                /* Write to the master DMA channel first. */, i  f5 O$ ]" L# o6 @2 j
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
, i. }, f3 w  k% O9 y+ K5 {4 m    }       4 R1 x- s0 U. ~. r* u' U9 d- D

- Q) `; I4 N( [5 w        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
  u, Z+ ?4 F; R  u4 A( q% f        " ], J+ q* n1 q% k) n3 U6 ~7 r# e
    if(result == EDMA3_DRV_SOK) 7 j. v; a" ^$ g7 M: R: N& [# y
    {
, H1 ]1 {; V1 B            print2arm("edma3 driver init success.",0);8 l( O; w& }/ r$ d
    } 7 ]" O! Z: C, w+ Q; e
}
# A: {2 H+ W1 `
! w1 y% P, h; }4 h
  ?3 `: S' n" I7 ^9 g3 g: OEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: d. r$ _  s$ t. b' V3 O/ i1 ]. R( v& m7 Q- R* }% q: z  F
5 P+ O3 }" Q1 K- }. ~

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 {% }& o4 b$ y0 K! `" F5 o% [
每次DMA传输完成后都要再次使能传输

, f4 \* J- y+ @- S' ]原来是这样,我明天去试试,谢谢了!




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