嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% z7 J, u4 _' Q8 Y& p
#define  PING_PONG_ACNT          1
+ a/ t# `. ]! m#define  PING_PONG_BCNT          8*32*40 + m6 ^. k$ {! j6 X% ]# u  C
//#define  PING_PONG_BCNT       1
$ m' H3 ~# N, M  w% Y. t: {- x#define  PING_PONG_CCNT          1
& d7 x7 U( e1 h/ u#define  MCASP_BASEADDR          0x01D00000
4 v' i1 P$ P% G4 @; Q6 ]#define  Mcasp_RXEVENTQUE        (0u)
# V; c" o, v/ [/ x$ q- ]) s" \- O* H1 i  i/ i) R, Q" Y
/* OPT Field specific defines */
5 h: l7 @' q5 i, \- t# q#define OPT_SYNCDIM_SHIFT                   (0x00000002u)' g! z: N* U/ F, X( O- J
#define OPT_TCC_MASK                        (0x0003F000u)" x0 |! C; L6 S5 ?3 r9 H
#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 `6 k0 P( m4 v# x6 n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
1 K# x" N3 b- ~( t#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 D: P& o: R& I! T' E7 ~
  k! [4 ]9 X; q# v: T
char ping_buffer[PING_PONG_BCNT];4 v, i" V( E- J) r. A# T4 O! |1 k
char pong_buffer[PING_PONG_BCNT];
; N0 e+ v5 n7 N8 Y, E* ?, n9 A  o7 A# h* @( F

3 E# F+ _# J  [
- t2 J) f9 u. X  i
+ A& v9 ^9 @0 E7 Tstatic void ys_edma3_init(). `, [3 T9 Z. e4 w% a' w; W" }
{4 z2 C# Z0 T' T4 T* h( v0 ^9 |9 m
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
  x3 H8 U  W; [        EDMA3_DRV_Result result = EDMA3_DRV_SOK;; P. j4 Z% G' U3 ^+ ~9 U
        EDMA3_DRV_Handle hEdma;
( p) [2 T' B5 t8 E3 {. Y; X- k    uint32_t chId   = 0;1 I- y: }& x& m9 w' q2 x
    uint32_t tcc    = 0;
2 F# [! \" N1 E; z0 K5 |% s6 [) u' |% P* L$ J8 l
    print2arm("edma3 driver init...",0);
5 w6 ~( p! Z6 d! s: ]
1 v0 X1 U+ W/ W$ D        hEdma = edma3init(0,&result);
; |9 |( B$ `- l- ]5 z; k        if(hEdma)
* T4 G9 I" v1 }( O        {
* W: K' Z1 ^# [. w7 h, x                print2arm("edma3init() Passed.",0);
- ~. R* V# C& v4 g  ^" O# s% Z        }
' r0 J7 V0 L% n$ ]1 D        else
" `8 h8 @% E7 r6 M9 ?% I        {
2 u/ b, D2 b4 m) U7 }, ~! [                print2arm("edma3init() Failed.",0);
- K+ j  k* [4 ]$ P" \; K        }
0 |6 S) f2 e3 n& y& u8 o& S        0 ]0 {) _! u/ ~+ @: o  f
        if (result == EDMA3_DRV_SOK)
! W+ f, w5 k! L% u    {* e* u' i3 y" Z3 ]
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,( P2 J7 j+ Y& b6 ?$ s7 w
                                                       (EDMA3_RM_EventQueue)0,
/ f1 l9 @" I9 e/ V% t                                                            &edma3_isr, NULL);. c3 X1 l% v( Y: w+ L1 i, {; ^
    }
1 ^& h3 w8 L" e4 J        : G0 y7 J/ z0 e. d
        if(result == EDMA3_DRV_SOK)
4 [2 x2 [$ m8 Y# {+ |0 S0 `" Q6 n        {/ x: K' k- T& I4 c0 {/ n& R- N5 |
                paramSet.srcBIdx    = 0;
$ T  z' o4 ]6 h! v9 p" l                paramSet.destBIdx   = 1;* t" ^7 G$ b) O
                paramSet.srcCIdx    = 0;! K  b* n- q. j5 Q
                paramSet.destCIdx   = 0;8 p7 @1 G; V5 n/ Z. c0 A) ?
                paramSet.aCnt       = PING_PONG_ACNT;8 g% T7 y+ N2 [) U
                paramSet.bCnt       = PING_PONG_BCNT;: C% h7 D$ q1 @2 a
                paramSet.cCnt       = PING_PONG_CCNT;
' I) y$ l1 L1 F6 }                1 m2 [) I# b/ `
                /* For AB-synchronized transfers, BCNTRLD is not used. */# `; |  p0 z" ?* V
                paramSet.bCntReload = PING_PONG_BCNT;6 ~0 ]$ Y7 I+ @: C  \' k: _& [5 ]
8 `. t/ r1 z7 R$ j8 o
                /* Src in constant mode Dest in INCR modes */3 \; O* t8 N! Y3 _% Y
                paramSet.opt &= 0xFFFFFFFDu;
# z# d+ |/ t: o7 u  M4 V                //paramSet.opt &= 0xFFFFFFFCu;
5 Y5 J8 q3 h- p8 K3 I& z3 }                ' M0 j/ U$ V! \' f- \
                /* Program the TCC */
- i+ s, K$ g2 f) ~& L+ T                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
+ t4 L3 O5 q1 q7 A% J
) [8 I/ h5 z) E3 R7 ?" F2 j                /* Enable Intermediate & Final transfer completion interrupt */' |, `: I4 ?) M
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, F4 J+ S& Q# N8 z5 O( C# k
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& O  }- s0 U: V& R+ R4 v* @- @1 a

8 G7 }- n/ m- X% k                /* AB Sync Transfer Mode */
# ?1 K6 v* Z: `7 R  r4 D, [                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. w8 y% t( L" y$ p/ E; L# E               
/ G% H. L* K; }4 w( ]                /* Program the source and dest addresses for master DMA channel */  S) g3 Q6 l$ a1 _3 T
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);( g2 c- \4 T4 S2 `2 T3 }! O
                paramSet.destAddr   = (uint32_t)(ping_buffer);
$ j  D8 Y8 M1 i1 x% R; o* T
; R1 V$ r# y! {3 `* @                /* Write to the master DMA channel first. */( B+ Z$ X0 D4 {: t( d
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);& P' k) H6 n0 A" P  }# B
    }      
' z; z: `( Z' I: V( o* J4 V9 {. X9 [1 a* V
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. K) U$ {6 ~! O* U* u: i        5 X0 ~- N; X/ O8 d6 t5 m
    if(result == EDMA3_DRV_SOK) # n. u! a; ~# m% ]! M* g" i
    {& k+ Q( k% y6 ^! d% V. T
            print2arm("edma3 driver init success.",0);
1 j+ Q  |# c' b) D9 y    } 2 y4 q# ~4 T8 n
}
/ C0 ?# l1 f9 S7 F) k0 K$ B1 B! b* u+ O
# f/ v' ?: E" d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 }- ~, N7 P; T2 X6 `9 C" n, j/ l# Y3 _  Q# ]# _2 j

0 H! r) ~% h& u7 f& S' C" Y+ T
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47/ B* J4 }3 c$ Y1 N  S  G
每次DMA传输完成后都要再次使能传输

( @& Z. A, Z8 e2 v# \: T% O8 J原来是这样,我明天去试试,谢谢了!




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