嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 S! |9 {# n7 R# y) X#define  PING_PONG_ACNT          1
& c/ r+ d6 e* C8 T#define  PING_PONG_BCNT          8*32*40 " P7 C! y& m/ j3 ]7 o- [9 N2 G
//#define  PING_PONG_BCNT       1 , b0 `$ T& G' j
#define  PING_PONG_CCNT          1! m& X# I! o, z0 v
#define  MCASP_BASEADDR          0x01D00000
( K, i; C6 ^' [. c4 m! u; G% o# g; N+ b#define  Mcasp_RXEVENTQUE        (0u)0 @7 T4 Z" E. r8 J% k
# I5 U5 m1 T/ Z4 q) ?4 i
/* OPT Field specific defines */# g( u8 c7 j5 }
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
$ f( j+ M3 h2 x' B% L) W+ T2 y#define OPT_TCC_MASK                        (0x0003F000u)
1 I8 ]& e) ]" ^& c- R+ p#define OPT_TCC_SHIFT                       (0x0000000Cu)7 s% ~0 R. Y  v+ E
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
& t5 i5 ?' }4 ?% b/ r4 C: c/ j#define OPT_TCINTEN_SHIFT                   (0x00000014u)  M3 P. o" F; W: |

, F+ y8 X5 G( R9 b1 echar ping_buffer[PING_PONG_BCNT];* \! k7 T0 @" n( J! O
char pong_buffer[PING_PONG_BCNT];% D# D  j3 ?: |

& @2 G, }3 e) j. l+ k" K. T/ V: v* k  r+ h
' p5 Z# ]; ?- b) k7 b* M" l

  d; i4 h# y) O) g% y2 vstatic void ys_edma3_init()% Y" b1 z- e' w8 E5 p
{
/ N& u! |; M9 v4 n( b$ T' U7 }        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% |$ X# v% @( u1 E4 M/ y$ N
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;* ~# R* j" ?' L. Z  G) Y" `
        EDMA3_DRV_Handle hEdma;
( ~4 B; |& A' ?$ y- p    uint32_t chId   = 0;
5 v: x. x. f+ I+ E! I7 I    uint32_t tcc    = 0;
' E/ w' D" `4 D5 Q) [
3 A  }. G0 B5 v+ O8 e7 ?    print2arm("edma3 driver init...",0);
, c  C/ U% z) \, ]7 w9 ^) }  ~9 N- b$ W
        hEdma = edma3init(0,&result);  @5 j% C8 a" ]
        if(hEdma)
3 h, [/ j3 }1 @0 F. M& [$ o        {! I$ T  ~, L( x
                print2arm("edma3init() Passed.",0);
+ x  }) h3 c- L( Q        }
1 u( @8 v& k' j% I2 }6 p2 j        else
9 o% z4 k8 H3 q        {
; a" `' }( _' N3 U# Y+ K1 N                print2arm("edma3init() Failed.",0);9 e7 H# K6 D! ?/ w
        }+ l, N5 ^  ?- s& o! V7 Y8 Q& j" N" b
        , U- h' J1 C) \9 ^6 N
        if (result == EDMA3_DRV_SOK)
+ o( @. w9 X8 D. P+ H3 Y    {
- ^+ T3 ^6 p5 e" L% H/ v" f0 h                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( C8 A/ f4 Y  T  p5 m
                                                       (EDMA3_RM_EventQueue)0,) |2 N$ [% j: ]& g6 {
                                                            &edma3_isr, NULL);4 b  |. h* x9 q2 b6 Y
    }6 Z+ p5 u9 i; D9 R
       
  U  D1 [9 x, |' I8 \/ n        if(result == EDMA3_DRV_SOK)
: H2 f+ a, ~: V1 {- o+ R! u        {" w2 E0 g9 t) K2 S, l8 w5 X& V
                paramSet.srcBIdx    = 0;
' v- q; |0 j. j1 q+ X2 T                paramSet.destBIdx   = 1;/ x, C5 M* v8 a/ c4 {
                paramSet.srcCIdx    = 0;
8 C8 F4 N2 x* }* k                paramSet.destCIdx   = 0;& t5 N  H" D' D  @/ c1 i' Q
                paramSet.aCnt       = PING_PONG_ACNT;$ w, I1 l6 |5 d% u0 ^# T
                paramSet.bCnt       = PING_PONG_BCNT;
0 _( D! V) _1 \4 {6 x% v5 |" _                paramSet.cCnt       = PING_PONG_CCNT;
7 d: _9 ?2 m8 ], N8 ?* j: C                , Z$ j- x! w  M9 u% I2 \7 ~& C
                /* For AB-synchronized transfers, BCNTRLD is not used. */
% _. h6 G! m' H/ C: U4 t                paramSet.bCntReload = PING_PONG_BCNT;/ W2 K; r! A: j2 E

3 m$ i( P5 o( N$ w! M3 U5 Q                /* Src in constant mode Dest in INCR modes */7 U8 u+ C- q9 r1 b9 u' M
                paramSet.opt &= 0xFFFFFFFDu;- v4 ^  v7 [" d
                //paramSet.opt &= 0xFFFFFFFCu;) T: ^1 k) O" r3 N0 b1 _
               
: {6 h! y, z, Q" v                /* Program the TCC */9 s" n7 f, q: J- _: d8 v" _
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
  H& X$ J2 N/ H! E% K* m- l- G' I% {; P: K$ s9 q
                /* Enable Intermediate & Final transfer completion interrupt */
* b8 P* e  O; i; f" o* H                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; K  ^  r+ ]) s; X, \
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* k4 V; [$ h$ H' F6 h) e
! ~7 o! r5 Y! O0 T8 o, g/ Y                /* AB Sync Transfer Mode */9 ]" [1 u; ~+ d7 p2 F
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) ^! E; U" ?6 E; M* d" W
               
2 [' t% w/ S8 _/ i' n                /* Program the source and dest addresses for master DMA channel */
. K" B# H# R6 \" Z$ t1 Z                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
  T9 K' b( Y) z* B& m: T                paramSet.destAddr   = (uint32_t)(ping_buffer);
; k: v3 r5 |1 i! B( `5 V! e; W1 a. D6 f; O
                /* Write to the master DMA channel first. */: K5 y. S- X# A0 s  ?! z- Q
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
9 d2 v+ a0 S6 x/ ], z& ?    }       2 C1 |8 h) s: {; n9 f9 g

7 b: p( w  E4 Q, F: U# B& g        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( y( O0 f+ ]; Z. P% p* o& {* K
       
' I/ a/ d" d& c( v    if(result == EDMA3_DRV_SOK) 7 ~! @1 M; Q% q, f/ G) t1 b) S
    {
, G5 m1 v) }. r3 \0 h4 t2 q8 J            print2arm("edma3 driver init success.",0);) I8 }7 S8 f  e3 I) p5 M
    } . [9 o% W% ]  Q/ S" f( h; n: F2 ^# Q
}  f1 l6 J! `  y% G) r6 A' I; o0 D
# D& c7 y9 P" F2 h+ [* y
: _% K$ r- z5 {$ c1 e9 K; W, L' A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 s- A0 b- C( Y6 y& b. {, m

% |4 ~5 Y& H: F& d* ^4 `; Z$ e& u2 z8 w5 k$ p

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! @' S9 H% V. R: t- y2 B每次DMA传输完成后都要再次使能传输

: X/ ~) K- y# S  G6 w. k2 W原来是这样,我明天去试试,谢谢了!




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