嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; g, {0 h% g! k9 A: V
#define  PING_PONG_ACNT          1
5 n' ]9 K, u, t* S4 Y; `#define  PING_PONG_BCNT          8*32*40
3 m8 f0 F% F) l6 }//#define  PING_PONG_BCNT       1
, k+ P6 A2 O; D! Y$ l' A( u#define  PING_PONG_CCNT          1  Y) V3 \2 ^( S* y& @3 z3 x+ N0 D: |
#define  MCASP_BASEADDR          0x01D00000% k+ \- T/ e" ]1 l. n
#define  Mcasp_RXEVENTQUE        (0u)3 p  _0 h* H* K
9 K3 E; e2 F' ^8 M; C6 l
/* OPT Field specific defines */
, ^, y) F6 ^) `3 ~+ ?  i#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
# Y2 n* x; }0 R6 ?: n9 K#define OPT_TCC_MASK                        (0x0003F000u)
1 f- e% e# ~+ j. q0 n; U$ P#define OPT_TCC_SHIFT                       (0x0000000Cu)
, W( a- N( r8 F9 r4 D" ?#define OPT_ITCINTEN_SHIFT                  (0x00000015u)4 p( f6 g0 G4 S& E- J5 [& w
#define OPT_TCINTEN_SHIFT                   (0x00000014u)3 I5 \, V* T9 ?: P$ J6 c3 `
. ~' f9 D: z  ^3 w
char ping_buffer[PING_PONG_BCNT];
1 m& e: p: u, k- e  J0 tchar pong_buffer[PING_PONG_BCNT];
: w. o$ T$ a  }- K
6 L; y7 x0 m' k( s
. B, V4 O, O6 K# m2 W5 ]; j9 \/ x8 l0 L; b  F( H- D+ {+ ~7 s2 v0 b/ o

: u' w' I" W3 O# z$ M5 ^2 Hstatic void ys_edma3_init()4 m& f7 I4 M1 b" d- \% J* K
{$ X) c# l2 T/ K) l: {$ c3 V
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# M5 P3 j6 r. L5 K% g+ @5 p        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& D+ }. E' A/ x& q* O4 w$ [. [1 f        EDMA3_DRV_Handle hEdma;5 a( _5 H/ {( p, Q$ [# g0 W
    uint32_t chId   = 0;$ {! j4 f, {* ~7 j3 m9 n
    uint32_t tcc    = 0;1 H8 M& s( G4 p$ p+ N) J& @; M/ H: Z, q

" q6 \: B( @# ~& u    print2arm("edma3 driver init...",0);
2 r3 c/ _- A' F. u% m6 D7 j6 Q3 G% p8 U0 g/ x: \
        hEdma = edma3init(0,&result);
9 j! b  U/ u. W: b        if(hEdma)
- A# I3 y0 M' @; Q) Z4 `        {
; R+ h/ s+ a6 {0 ~% v                print2arm("edma3init() Passed.",0);
1 f! F( u  U, q& p. B) z# P8 y3 v        }$ R9 x& A4 ?  c9 h9 I9 u
        else
- a. [. G" Q  L        {) H9 o- p$ l" v+ x0 K& W
                print2arm("edma3init() Failed.",0);; g+ ^! I# W' M( {/ k; R# E
        }
; `/ s+ d% t; l6 s1 t4 s        6 j4 u% x% D' j8 P
        if (result == EDMA3_DRV_SOK)
% W! C8 O5 Y3 B  k* g: t- @    {) n( h$ M/ I  I- \( z  B6 M0 y
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 {; |+ @4 u  f% J. R( v                                                       (EDMA3_RM_EventQueue)0,
/ F( p( F3 z; D1 M+ p: L                                                            &edma3_isr, NULL);
3 r. R6 _  F7 E0 W. O5 k# m    }( H& s: V. {) e8 O
       
' w: @! d, c7 E2 x( M- z' F        if(result == EDMA3_DRV_SOK)" Z) ?* e9 W. K! p  [1 \3 \% B
        {* X8 B8 o# }: `& O/ P1 h( _3 d
                paramSet.srcBIdx    = 0;
+ y( z1 Q4 S/ |8 A" u                paramSet.destBIdx   = 1;2 W7 B% `. K# N0 v# _" j
                paramSet.srcCIdx    = 0;! c% Y1 W2 {: d8 ]2 H# }
                paramSet.destCIdx   = 0;3 O  G6 W* x3 E
                paramSet.aCnt       = PING_PONG_ACNT;$ L  I8 J- U- V, q7 L
                paramSet.bCnt       = PING_PONG_BCNT;
/ [% J( [, Z' v1 D% Y5 x# B                paramSet.cCnt       = PING_PONG_CCNT;& N- S( B% d- F9 `
                % i$ A% h8 h- ^. C* U
                /* For AB-synchronized transfers, BCNTRLD is not used. */5 u) {! z: }  G, N; T
                paramSet.bCntReload = PING_PONG_BCNT;
2 H9 A: c- i. {+ O- ?
' p: I- n, u5 W5 ?                /* Src in constant mode Dest in INCR modes */7 }6 ?3 W  e1 P& d; ^: K# e* e  d
                paramSet.opt &= 0xFFFFFFFDu;# |; U$ j  m1 P- D, m
                //paramSet.opt &= 0xFFFFFFFCu;$ S3 Y- B/ U9 i7 ~: |
               
  C& `3 y5 i7 B4 f+ E/ ?$ |                /* Program the TCC */
: o7 N5 R' L) w. ~8 P3 a: H3 j                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! p0 ?$ `5 y, B. a; e: @
6 G$ T+ n0 r/ m; q4 g0 {! m
                /* Enable Intermediate & Final transfer completion interrupt */7 |2 ^- }' o, M1 T, G, u
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);0 e  o# \' z  x4 F1 v4 H
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
. n, _: I- j; j
5 V9 m: w' a+ z, {1 U                /* AB Sync Transfer Mode */) {$ l' m: l. K+ F
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 C/ ~3 _9 y8 x  A1 `) b; E
                % i7 [  n/ ]/ e: j' u
                /* Program the source and dest addresses for master DMA channel */" E! W; M! I" K5 c1 K
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
1 u9 v8 H9 l8 Y  s: @8 a                paramSet.destAddr   = (uint32_t)(ping_buffer);
. z, j% r$ z! {
+ v2 e( w8 V- i1 U. T  c                /* Write to the master DMA channel first. */
2 O, Z4 g- X" x3 a) [1 w5 c1 w: R                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 z  b' r/ z; N: G% ]+ l- f    }       / c# d( b' I) _# K5 c& k, B  K

8 u0 P0 \6 E, r" q        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 s3 ?4 e6 K3 \$ B( X5 ]  U        % k& N4 W% X8 ~0 c. N. p& c
    if(result == EDMA3_DRV_SOK) , E- d4 x" u: Z0 n
    {
' N1 b5 c" e: s& ~* D( c            print2arm("edma3 driver init success.",0);* L- Z% l* Q3 t
    }
, ]! _1 Z+ y+ l2 L; I1 }) U5 w, ^}+ n3 \; w) f3 J% M
8 F5 [- b, F# `9 ?

" u- M3 U( Z6 CEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% j4 H0 Z4 l: F+ s5 U- J0 a, J# {( ~
" h  `$ m4 G3 C$ w0 u  Q" {! K! S, D* w4 ]% }5 T

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* U+ o0 i6 s. m/ f+ w每次DMA传输完成后都要再次使能传输

, |6 M7 V- v7 R, ^原来是这样,我明天去试试,谢谢了!




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