嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ Q+ V8 o; M, u. o#define  PING_PONG_ACNT          1
' q0 v# ?; T2 |- f: k; @( Z#define  PING_PONG_BCNT          8*32*40 8 N+ y. Z# A$ A3 J
//#define  PING_PONG_BCNT       1 0 L& v1 _! V/ ]4 O# [7 O" t
#define  PING_PONG_CCNT          1% C# U3 e7 V, q% s# S
#define  MCASP_BASEADDR          0x01D00000
1 M% q& [; e; ?" ]#define  Mcasp_RXEVENTQUE        (0u)
' d) h$ z0 k9 ^; j
! V8 j7 f4 f! I+ j/* OPT Field specific defines */# u( T* }  u+ v9 ~/ ?
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)) t3 w" P5 v; v! E9 L# z5 n* e
#define OPT_TCC_MASK                        (0x0003F000u)7 X- c% @* u% `! i: j5 v9 y+ M% m8 C
#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 S+ i3 J! _& _  |8 ?#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
8 l3 y0 [' I9 B5 x- b" v. Y+ k# }#define OPT_TCINTEN_SHIFT                   (0x00000014u)
, i3 S: d! B) d. R/ J9 C/ z# g5 L
9 }& {, k. I4 Q; x; Pchar ping_buffer[PING_PONG_BCNT];% p. c2 C/ g& W- W! y
char pong_buffer[PING_PONG_BCNT];
. a. u1 y/ `% o7 e. A7 F: a. R& T) q7 h  Y
0 E  O; u5 V4 V; t. H/ |, L" q
. z( f* ^3 v' e
9 y/ {. c$ |2 A! K) B
static void ys_edma3_init()
: p0 h( A; p. p: d% W/ U4 a& \{* S8 ]9 r: f3 X* n, \* J/ N
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
) Z  d5 b/ G/ d: m( t. L% \        EDMA3_DRV_Result result = EDMA3_DRV_SOK;* z  o7 x; z. Y; A
        EDMA3_DRV_Handle hEdma;
- Q% P. ~2 r( j  @    uint32_t chId   = 0;
" m& c- ~* L: j: b( T' [    uint32_t tcc    = 0;/ k; L2 ^0 Y+ T5 ?
/ \# u% g3 H( W) @& k2 v; c6 s' j
    print2arm("edma3 driver init...",0);
& V/ B4 w; x- J; R# s! A9 L9 {  L1 q  H/ \& I
        hEdma = edma3init(0,&result);6 U% s0 ^7 q# _! w  e0 D! M0 D. R% s
        if(hEdma)
" Q' `9 o5 D  P$ L        {
# V6 }; m0 C$ ^. V7 J2 s/ u1 o: C                print2arm("edma3init() Passed.",0);
' l& D3 Z  S  o( m        }7 Q0 f+ b! a, g2 G8 Y- l- Y
        else
3 d, a$ B* R; c  |6 [0 _        {/ b- l5 n, t7 l* w; g; ]& X0 L, ?
                print2arm("edma3init() Failed.",0);
% T4 K8 g5 C! `/ D& Y3 F& W2 Q        }
& v- w5 y' V* k; F        , U, u$ E$ V& Z  M
        if (result == EDMA3_DRV_SOK)
- E7 i/ f! D) p9 {    {
  a3 K2 j) H/ _# N% `; g                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' V; ~$ p5 A/ x/ ~; k: c                                                       (EDMA3_RM_EventQueue)0," _, A# p0 r+ n( S% F
                                                            &edma3_isr, NULL);0 r2 b) P  R; ~9 Z
    }
% o  m3 w- y. o% F       
/ D- n9 \3 X" y        if(result == EDMA3_DRV_SOK)8 E( U/ v/ |- i  B, m
        {7 ?' N4 j! d" d# H
                paramSet.srcBIdx    = 0;4 n% W) {" l: j/ `5 b
                paramSet.destBIdx   = 1;( }0 L! u- a0 ?5 h* F# L& Y
                paramSet.srcCIdx    = 0;
9 X7 H8 W; J" w, d& D( I1 _                paramSet.destCIdx   = 0;+ E% T3 p1 y8 m( U
                paramSet.aCnt       = PING_PONG_ACNT;7 C9 ?3 p$ N$ }# o5 u
                paramSet.bCnt       = PING_PONG_BCNT;
5 `8 Y2 W: i  S6 O7 k- o                paramSet.cCnt       = PING_PONG_CCNT;
7 T4 R" m& a  S' t  Q               
/ Z" }) t6 E0 S& n+ _+ |                /* For AB-synchronized transfers, BCNTRLD is not used. */
/ i8 S3 U6 H: f3 g& s# f                paramSet.bCntReload = PING_PONG_BCNT;3 ~) K0 H) Y4 T1 e
( \0 W2 Y$ ?  @! k( I
                /* Src in constant mode Dest in INCR modes */, w. w+ D) Y7 s8 S' O
                paramSet.opt &= 0xFFFFFFFDu;3 b2 ~( T) ^6 [. y5 o- F
                //paramSet.opt &= 0xFFFFFFFCu;
) _+ t4 @1 P; M+ H# f) x4 w                , J- g9 Q. \# z
                /* Program the TCC */
& G4 J  V( L" T: T) c                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
3 e% N6 X7 i( l1 d
6 i) [0 v; b7 S- l9 r0 A# _" d                /* Enable Intermediate & Final transfer completion interrupt */% t* T& f6 [5 G+ i0 v0 D% u) Z
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; c- _; e7 R5 E# ^6 h( K9 |                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) m' q( L. p! \# h3 o

, w! t4 e% w$ V1 P% p. ~' Y                /* AB Sync Transfer Mode */  L& M, F! y5 m: C6 m" e
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ u7 ?0 A: j9 h5 I
                  J- y) F, K- F1 y8 m% ]
                /* Program the source and dest addresses for master DMA channel */
- C3 ]4 g8 `: B                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);7 C/ Z2 `% i+ F1 j; s4 g+ J
                paramSet.destAddr   = (uint32_t)(ping_buffer);
* x, v5 D! C7 p, p) F; J0 d0 s1 @- {% w' P
                /* Write to the master DMA channel first. */
# j# J1 I8 w# A% T2 M. J                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" O0 s1 k9 M" f( u7 r
    }      
4 O0 d5 N& A: o3 _8 M
. b2 }# y8 Q0 N3 K        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);' K" a9 S8 C& b
       
! D) }  a$ m( d7 }7 ^5 ^    if(result == EDMA3_DRV_SOK)
: _9 s& I5 {# h; o9 L# b- D) D    {
. Q2 ~. |$ S/ J, Q0 j) o            print2arm("edma3 driver init success.",0);/ v4 z% b4 Z- L* |
    }
: w  u3 O" c( M}5 P5 M% ?8 m( l. Q: r4 ~
0 B/ N) u6 v7 y. g( B

1 C2 R7 r1 ^9 R/ P% ?8 HEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, w1 m  u$ n- w5 N$ @2 h! p
# ^1 }) [6 N$ ]6 C% E, C$ \6 i) A- W2 y4 q# H0 F* z/ Y/ v

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:479 B3 n6 Y$ E4 O; G+ p
每次DMA传输完成后都要再次使能传输

" l2 x- o' J& n原来是这样,我明天去试试,谢谢了!




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