嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" _' O% {3 U. [
#define  PING_PONG_ACNT          1
% a6 k/ @  @- e#define  PING_PONG_BCNT          8*32*40 + C3 ]! o! `( S
//#define  PING_PONG_BCNT       1 % h; H( k8 |6 ]2 l8 Q
#define  PING_PONG_CCNT          1% M" e  z6 g  b( k& Q2 N# I( o
#define  MCASP_BASEADDR          0x01D000009 J9 m; s" e+ m8 G" _9 p
#define  Mcasp_RXEVENTQUE        (0u)( W' s( U$ f) A' _! W& F+ W

0 @  h. W6 P8 T  G9 Q8 X/* OPT Field specific defines */
3 p  j% c- W0 w#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
* ^2 P' t  u$ r* j, z$ h3 H#define OPT_TCC_MASK                        (0x0003F000u)2 S. b" f; u. Y8 p4 ^8 G
#define OPT_TCC_SHIFT                       (0x0000000Cu)% I! l1 L4 ]. q* K3 \
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)" h" q1 d. I  f( M0 ^
#define OPT_TCINTEN_SHIFT                   (0x00000014u)1 {& d' }9 L2 s' u) |

! w5 G% ]8 }0 c  t0 ~! h7 Lchar ping_buffer[PING_PONG_BCNT];
. s& R) t) C9 R" Lchar pong_buffer[PING_PONG_BCNT];
! t0 V9 Y  l( t0 g) G
  k. J$ R5 Y$ T9 Q! @2 i$ b( x0 C3 X3 F: s1 m& F
" ~% g0 K" W( J* G9 p; M6 _, {
+ w2 f) O) T2 f- H- o- C
static void ys_edma3_init()9 ~' F2 l* x+ O, w
{
; e3 A" Y9 r! C        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' C5 }: x% c$ ]6 }        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# r( O7 E7 c; ]% [& Q/ K# e        EDMA3_DRV_Handle hEdma;
, c9 n# q9 R/ \) e    uint32_t chId   = 0;
) c) `! ?/ z: F4 [8 m    uint32_t tcc    = 0;' o: [' V4 x8 F+ |. m

3 g/ ~$ U, V# v' P9 A+ }( o. K/ i    print2arm("edma3 driver init...",0);
. P( i4 ]( `& \- p6 Y
' ^/ w: H, i/ o: d7 X        hEdma = edma3init(0,&result);
2 ~2 |! p: O* s4 |9 o$ e        if(hEdma)7 S/ U, |  t& u' O  T# X/ e
        {
! b, d) i- C8 w                print2arm("edma3init() Passed.",0);
; q  v/ N9 }- b$ X! s* p        }  _- P: J  J" M- _! g
        else
/ F$ ]9 I7 g/ ?1 E        {" G, v1 C3 F- g8 y% Z$ E
                print2arm("edma3init() Failed.",0);
6 w/ g+ h$ ?0 H% K% V        }
1 A3 Z( H' |+ a# H       
: N+ K+ n1 m3 h        if (result == EDMA3_DRV_SOK)
) x" V; m8 ^0 V  q; g    {: e# X$ ~' O* a# r/ X, S
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ A3 f4 h3 J' W% z/ d3 I! H* I0 I
                                                       (EDMA3_RM_EventQueue)0,: e4 U8 H* C$ ^7 q! w/ L0 B
                                                            &edma3_isr, NULL);
) t. W4 A: h( K# _    }9 L/ M1 y$ K/ {+ |& t1 I3 o
          C# f" s' I* G4 V. P
        if(result == EDMA3_DRV_SOK)
1 f0 D, I  d( ~/ E1 f) h+ |3 f+ \        {
- l: w+ m) V3 ]                paramSet.srcBIdx    = 0;
# k3 q0 s2 j( Z/ W                paramSet.destBIdx   = 1;
3 ^% k" T% b0 z; m6 ?                paramSet.srcCIdx    = 0;
( M0 o, ~' {0 n% V( ?  X7 O7 I0 D                paramSet.destCIdx   = 0;
% n6 x* d# w4 c  c) I  T                paramSet.aCnt       = PING_PONG_ACNT;
; x7 n, _6 p9 I$ E                paramSet.bCnt       = PING_PONG_BCNT;
+ p1 W. L9 k. L6 Q                paramSet.cCnt       = PING_PONG_CCNT;1 F* q# V. A! i/ B
               
* K; h0 y4 j5 ~0 A$ \- W, c                /* For AB-synchronized transfers, BCNTRLD is not used. *// m6 e3 @* U9 Q. E
                paramSet.bCntReload = PING_PONG_BCNT;
: b6 |3 n& ~, S: y6 l* R
1 p1 F1 `. v; u) D/ W* S/ O8 c                /* Src in constant mode Dest in INCR modes */5 L2 A# M" i, E3 g
                paramSet.opt &= 0xFFFFFFFDu;' C( F) ^9 ~7 a5 A8 N# k, W7 N! W
                //paramSet.opt &= 0xFFFFFFFCu;, F* G2 E6 F+ M) M# ?
                ' t2 F5 g  _1 P+ m7 w# l2 }
                /* Program the TCC */4 G, u( q/ I0 C' L; Y. x) A' h) N
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; K  C! [6 A; y# J# R7 r

/ c% Q6 e" @3 g& _" B, J  ?- _                /* Enable Intermediate & Final transfer completion interrupt */' r3 X& B- V+ H: |6 f
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( ]  }3 R  }  L+ V/ j/ s
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 Z( d! u7 X6 j  h
; {, x. c' J+ `5 l
                /* AB Sync Transfer Mode */
/ M. p0 ^7 _% E( D% I) z                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 O& o* j7 [1 z/ F: A1 A
                # u9 R. ^6 b9 Y. T# i4 ^
                /* Program the source and dest addresses for master DMA channel */
; h: v2 i6 Z" W& h% w) o9 `/ o- |4 O                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);) s2 F( B: `9 t
                paramSet.destAddr   = (uint32_t)(ping_buffer);
" T0 J$ \5 C9 m) f  C; j, V
  z- L$ S" p& d, i- X                /* Write to the master DMA channel first. */4 y. k9 K8 P9 b' ~" g( {
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
- T% a/ J8 p" E+ c    }       4 O8 p$ K" c9 e" X& S1 A5 z, F

8 h' @2 D2 {0 n% K' i: s        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);1 `: J5 }( i1 q: a9 D* H. ]0 ^6 r
        . X4 J3 g( W1 @
    if(result == EDMA3_DRV_SOK) ' `* n6 d  @& Q1 A2 F. U
    {
+ g% Z( D: S; N, q- `/ q* {            print2arm("edma3 driver init success.",0);; e1 }" V+ `, b6 y$ N5 e
    }
9 I( k! N: {! q+ `}. r0 Q0 {+ j1 X5 A. v( u/ F9 \( O

6 n1 \* ?0 J$ p( y: S8 }2 M. I3 ~; ~5 Q2 f( t' E7 F. g$ R
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# u- T/ `  r+ F8 _7 N9 K( |
& B" u2 j% [  J: p; c0 q3 u) V9 k5 x+ ?) ?- X, G- C

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 d# i; Y& p& o2 f每次DMA传输完成后都要再次使能传输
( k8 y8 H2 [: [3 O3 |# f* ~, k" N
原来是这样,我明天去试试,谢谢了!




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