嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 M# @# {' }8 T
#define  PING_PONG_ACNT          1- ^  I+ _/ G9 T. \9 v' n) V
#define  PING_PONG_BCNT          8*32*40
7 x5 D5 Z' @: \//#define  PING_PONG_BCNT       1 % y  [2 @! M: b: W8 s* g2 L
#define  PING_PONG_CCNT          1
& e" x, m! c; D% E" Y7 L8 R- |#define  MCASP_BASEADDR          0x01D00000  t/ ^; g9 Z* M5 V
#define  Mcasp_RXEVENTQUE        (0u)6 W# s4 S, f4 `$ J

: c; y$ B: g1 v. z# o% s/* OPT Field specific defines */
3 Y! N/ |' h$ ?) m4 O#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( y( F+ L! u7 Z  ?8 [/ L7 U$ X- ?#define OPT_TCC_MASK                        (0x0003F000u)1 `" H$ z7 H  E5 b8 O( l& u
#define OPT_TCC_SHIFT                       (0x0000000Cu)  `9 B8 N" H# S/ a4 o
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
) F. R  `6 D2 F! F8 g! Z0 K#define OPT_TCINTEN_SHIFT                   (0x00000014u)& @& N  O: K, S) V7 U, C
- y8 _0 g. J, j, g" ?* s+ r
char ping_buffer[PING_PONG_BCNT];
  @. Y3 K, K) X2 z* [  V. I: e7 lchar pong_buffer[PING_PONG_BCNT];3 C) e, Y  e4 J/ _

" n# n3 H; t+ @  c' V* s. j2 p* l5 @1 w3 Y3 W

& D0 H% D1 g, n+ O/ E) e
5 E- I8 s( _& S- p% z2 G7 {2 cstatic void ys_edma3_init()
) [6 F' V* b2 D' K{
+ C2 v" w+ w2 B6 u2 Y2 a        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};. d$ M9 f  s- E. Q$ O% A
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# {! X! Q  M/ z/ M8 o8 H
        EDMA3_DRV_Handle hEdma;- v. r4 k; F/ l; j" m- p# l+ ~( U
    uint32_t chId   = 0;
  x( P7 ]( R* h0 i$ S    uint32_t tcc    = 0;# W+ ]4 f0 m: k6 @2 a/ u
" Q# T; r' W- a" a; C3 |% _
    print2arm("edma3 driver init...",0);
8 Z1 b7 r' l. E* R$ q& ~8 d$ T$ |
        hEdma = edma3init(0,&result);
' B+ ?0 u5 F5 s) M        if(hEdma)
' a8 y! q7 h7 c% B% p5 f        {
& L6 b8 q& S; m5 o7 E% T" w7 l                print2arm("edma3init() Passed.",0);
8 t' {2 J$ ~6 t4 ~        }5 W( U) Y2 L' [& K' }0 Z7 \; H
        else
. W# R9 l" O) k% u1 }        {8 ^$ K0 G; y, E- }7 _5 ?
                print2arm("edma3init() Failed.",0);
% F; D7 e$ d; x. L  L/ J2 M7 Q$ k2 M        }" O* ^9 L5 u3 t
       
, ^& Y. @, u* S9 l* X        if (result == EDMA3_DRV_SOK)
1 Q) ?3 A+ A: ~$ ?7 S/ I, |    {) Y, }- r% x6 g3 Z. C
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
: r2 z8 c- [( @1 K$ K; \5 d5 j! G                                                       (EDMA3_RM_EventQueue)0,
' y9 e5 Y# l2 I- N                                                            &edma3_isr, NULL);
: E. Y5 B. K8 x% ?8 j    }: f1 k9 B! X0 {( C5 a4 n
       
, Y/ h2 G1 [! [$ E! D        if(result == EDMA3_DRV_SOK)+ O' N6 Y, _% K: B9 n7 z9 S
        {
: A$ l; [" r3 g; g' M- L                paramSet.srcBIdx    = 0;
1 O- M2 O" ]( Z7 k! v% j                paramSet.destBIdx   = 1;* q( z1 n4 ]8 n1 K
                paramSet.srcCIdx    = 0;
- l" e$ U# z1 `/ c                paramSet.destCIdx   = 0;1 J& E9 \' q8 G& Z. K( X
                paramSet.aCnt       = PING_PONG_ACNT;. V7 _3 @7 ]. u4 s# _
                paramSet.bCnt       = PING_PONG_BCNT;
0 z0 j% h; {0 F) [1 t  @" G1 `                paramSet.cCnt       = PING_PONG_CCNT;3 C' v: Y% d! s. v
               
3 x, e8 @: a3 C  D( S2 B' v                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 \. x- j  g/ q1 B% S0 g                paramSet.bCntReload = PING_PONG_BCNT;9 m8 D: D; O& r" P- |; D

( `4 E; `) X3 F9 n  ~9 J9 c                /* Src in constant mode Dest in INCR modes */
/ L9 W- Z+ O3 I8 S3 i                paramSet.opt &= 0xFFFFFFFDu;6 _+ |) l) y, ~, o/ u' p1 B
                //paramSet.opt &= 0xFFFFFFFCu;
0 A0 h. p2 m' k                5 k+ I6 L- E1 i- j5 ?1 V% O
                /* Program the TCC */
8 T' [, n! W0 N- D' M  y                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( E# C# \3 r4 P0 i  k- B
7 K5 _% E: D# r# h" F% @1 Z
                /* Enable Intermediate & Final transfer completion interrupt */. X3 D; q1 U% D. X/ M) V6 a' N
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( O8 T8 b7 M7 Y# x: y                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
  t3 c7 H! J4 @- ?
. p. g+ [( [6 i4 g" I                /* AB Sync Transfer Mode */  _0 H+ U- m% E1 `- r$ j- n
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 i( F5 a) N0 N, ]& C2 h               
& [  k  e" h  p2 V! C  a0 l                /* Program the source and dest addresses for master DMA channel */# ?) s7 g/ n% h6 v4 T
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);5 U$ A6 [6 b/ k, ^$ O9 W
                paramSet.destAddr   = (uint32_t)(ping_buffer);# A2 @  X# c) ?/ P

. C/ L$ U. M! H5 P                /* Write to the master DMA channel first. */
( L* {, l" @+ r& ^7 ]                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
/ w0 ?$ `4 X5 W  n2 D9 Y3 D" R) n    }      
! X& v+ t/ S! p* X' o* R' e6 M
( Z( Y% j+ t' T2 j/ X  E) H        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: y3 r$ `" l. I; ~' o% }
       
, e7 m3 V" Y+ |    if(result == EDMA3_DRV_SOK)
) y3 x; t3 {. U& s& ?, N5 l    {0 ]& f2 V, w1 Q$ U0 F
            print2arm("edma3 driver init success.",0);
5 ]: [+ d6 L6 ^5 h8 ~8 Y9 p    } , k/ P2 ]5 e# X( D
}
- X; J: z8 l- |& h/ v# Y! b6 q0 f  B- Q* x$ J- E/ U) z

: c3 H- m9 R; [1 QEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) E7 o: N) ~: g% [) |% w4 u& [
) H1 h% b  S( `
% I* ]5 m0 H* }6 V4 ~9 _
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 j7 i5 `' H8 M每次DMA传输完成后都要再次使能传输
! o- k& q2 i; w
原来是这样,我明天去试试,谢谢了!




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