嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ ^8 o# v4 d7 G8 H#define  PING_PONG_ACNT          1: J: ~5 ^# I2 ?
#define  PING_PONG_BCNT          8*32*40
) I' Z0 ^  }8 S% G' t1 Q//#define  PING_PONG_BCNT       1
3 R% k* h  h% [3 F#define  PING_PONG_CCNT          13 u4 V/ S$ g7 o1 O# i# f
#define  MCASP_BASEADDR          0x01D00000+ h. ]7 H8 ?* G" i1 i4 y
#define  Mcasp_RXEVENTQUE        (0u)
* C* r" c# S4 a
% R* V; a! c% b# q" v/* OPT Field specific defines */% k) }) M+ Q1 k2 i9 P
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)+ N0 B- i+ M, M% |* f" n
#define OPT_TCC_MASK                        (0x0003F000u)
5 d% \- ]! d6 J$ G#define OPT_TCC_SHIFT                       (0x0000000Cu)5 |1 t4 e( {0 D+ V3 b. i. z9 \
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
9 w) `- r* v4 B/ H* F#define OPT_TCINTEN_SHIFT                   (0x00000014u), q3 R0 j2 [7 U8 @1 q' R8 ~2 z+ w6 p6 X- |

8 u0 Z, J* e8 B$ Zchar ping_buffer[PING_PONG_BCNT];" E2 g1 ~' a1 H, x  r3 O. A" A
char pong_buffer[PING_PONG_BCNT];
+ R  i- E" n; ?, i$ ]$ i/ G
; y( H# O! W6 i( A5 H  a; K
, C' w& y( i. h/ W* I& X- W; G
" z3 r0 |- B. t& b) h6 N: c0 r" W  W
static void ys_edma3_init()5 ~) S% b; j, X* \9 Q1 t. K: o+ N
{& ^' g  q; g. j/ [0 l
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 R" u4 g6 P/ f: `* P        EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 l  O, L- r6 j; N4 H& a: z
        EDMA3_DRV_Handle hEdma;
3 F% ~+ A1 N+ b    uint32_t chId   = 0;7 ?" x2 ?$ |* x
    uint32_t tcc    = 0;; }+ e' `' M" o: ^, {. A$ p
6 E- k. f" o$ ]4 U
    print2arm("edma3 driver init...",0);
. p& H1 w4 b( `3 H0 g  t4 v. J! h
        hEdma = edma3init(0,&result);6 W- J* H" r3 h0 ^5 E
        if(hEdma)
. ^% Y! K( l. \6 J        {  `  W" C8 i/ |
                print2arm("edma3init() Passed.",0);
( q5 k  m" G" e, F( f6 b        }
0 o; P& k+ X, C0 I3 ~        else
: b$ F5 [" x- l7 V; E. ?3 p        {
8 w! U/ B1 h* F: D' t8 A                print2arm("edma3init() Failed.",0);" e4 C0 U6 ?& ^. E; D
        }
: o5 [! _8 s! C( x: V/ f       
1 X* n( K2 c5 ?" {- |        if (result == EDMA3_DRV_SOK); s( M$ l. u- I  L- `' c2 ^7 G/ b
    {
3 `: v7 R! c4 B                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 I, o0 C0 F# ~& E
                                                       (EDMA3_RM_EventQueue)0,
' }( h9 ^- ^; d8 N& s2 y5 @                                                            &edma3_isr, NULL);" j  Y( }, |# z5 S9 p1 w
    }
3 h  f3 Q  |4 f/ {        " W  a; d0 D3 L3 x; x
        if(result == EDMA3_DRV_SOK)
. l- Q2 f5 k* T% o4 ^3 v        {) _, t0 p8 ]8 X4 ^. n5 i4 u* j
                paramSet.srcBIdx    = 0;
' H' _7 Q  N3 v* U                paramSet.destBIdx   = 1;
0 `0 a7 H$ i0 \' U                paramSet.srcCIdx    = 0;
: L$ u8 ]* k/ Q" G8 F2 f' C                paramSet.destCIdx   = 0;' O. e) G& b8 L4 W/ R& q
                paramSet.aCnt       = PING_PONG_ACNT;
: }3 N1 T7 d& b( R                paramSet.bCnt       = PING_PONG_BCNT;, {9 j- X* d* n$ K
                paramSet.cCnt       = PING_PONG_CCNT;$ W# d& r3 D" k) h0 G, H, o1 A) ~
               
! G2 c) [' J/ J                /* For AB-synchronized transfers, BCNTRLD is not used. *// \8 J+ }; B( f, l- \
                paramSet.bCntReload = PING_PONG_BCNT;
  c- c( e1 `5 O* |8 t
6 _: c' u' j; C( m  S) S                /* Src in constant mode Dest in INCR modes */9 ^* w0 y8 o  p
                paramSet.opt &= 0xFFFFFFFDu;
& e4 F( S! D1 T" r5 r, \1 y                //paramSet.opt &= 0xFFFFFFFCu;/ p# U* R: R: p; ^" u
               
+ p: W$ A  {+ t+ C# s. e6 e/ N) K+ e  L                /* Program the TCC */
) X) q' _3 w( \8 i2 Y/ U8 v                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);6 B4 D% B  t9 a. i; p  U
# B- |5 {0 B, r/ O) D
                /* Enable Intermediate & Final transfer completion interrupt */
6 w7 ]* W7 U+ a6 U' u) h/ U" u                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 W0 F7 b' e8 X
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
5 C7 Z" m1 b& W1 e) E2 o+ W0 ^3 U$ G, t' z9 m0 d0 z) `- t
                /* AB Sync Transfer Mode */
3 b" i* j2 u* {, f8 U                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" G% A7 Y+ y9 T1 f" y                , u9 x" Z5 m0 w
                /* Program the source and dest addresses for master DMA channel */
' m/ k9 b- d% ?) P9 p5 D                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 \! e( m* m1 Y4 F( R                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 R" D. k/ z0 N1 _' {3 ]5 [
! O- O4 P. O6 R9 z                /* Write to the master DMA channel first. */3 z  q3 C* E( q3 H7 g0 O, G6 V
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
; q; ^: W8 I7 Y# G$ v# M8 F    }      
& w, M+ a9 p; [" m3 p  ]$ b: B
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);! q6 H/ x- V/ V% q' s
       
0 z. N' ~) @, S    if(result == EDMA3_DRV_SOK)
3 s' A6 e* h. R. W9 U" Q    {
" M  u% |* |. ?$ @) A. h: J' z            print2arm("edma3 driver init success.",0);
. c6 `3 n8 z% U0 L+ \7 J  Q    }
* H8 b3 J6 [  C, H& ~}4 {9 C% g$ _0 d% \3 V$ g
# z+ ^$ l, w0 T; v! W/ u
8 D: Z- s0 n& J# x7 c) U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 e) S, }% X( T
+ j! m0 i$ V2 I8 {9 s1 Y9 @9 ]$ W2 C/ u+ K

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! Y1 g+ x1 g& o# A6 y+ Y0 ?+ r每次DMA传输完成后都要再次使能传输
3 \* K; V$ A& {  ]* l3 w# ~
原来是这样,我明天去试试,谢谢了!




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