嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
; {; O/ r" g- J/ \6 i, J$ }& r#define  PING_PONG_ACNT          1% B; G) ^; n5 |8 b/ s
#define  PING_PONG_BCNT          8*32*40
- p- V+ I" C2 s: I9 z; R//#define  PING_PONG_BCNT       1 4 z; ~! i0 l/ M( O
#define  PING_PONG_CCNT          1$ i2 `$ V7 y2 F* w6 H; N' z
#define  MCASP_BASEADDR          0x01D00000, ?: s: G7 o$ k4 o" w6 s" [" W
#define  Mcasp_RXEVENTQUE        (0u)* Z- M! A; b) P; v: k9 l4 ?  A

' n3 k: D/ d( O: y$ X; a# C; R/* OPT Field specific defines */, j+ W: ?6 z; Z0 @& w( ?
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)! w! V3 w5 p$ r) c% E( k
#define OPT_TCC_MASK                        (0x0003F000u)
% H* v) F0 l; I+ M+ t#define OPT_TCC_SHIFT                       (0x0000000Cu)
+ Y+ g, B9 C  N% @#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
8 R& d6 \; k7 ^* U; u, K#define OPT_TCINTEN_SHIFT                   (0x00000014u)
4 U% u9 d: g, m$ P2 D9 l
% i, ~3 d7 D/ h6 w7 U' r- g: \  H7 Pchar ping_buffer[PING_PONG_BCNT];( Q: x6 N' y- V3 D* B4 F" t; T" m
char pong_buffer[PING_PONG_BCNT];5 r: F- t, Y/ c7 h) `' b
1 K" u1 i& a* y0 R. z: r
$ c  D  M) A% o

; l$ @3 E- Q) y- ]/ t4 C6 A; r+ t7 Q# k
% e/ p8 E& F! v% W; `1 m" L& Ystatic void ys_edma3_init()/ r+ ~) T! g: c( I
{
+ f9 |( H6 K' N4 d        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
  |# o2 ~0 G1 I! b6 P: _7 C( H, R        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- n1 y, x! |) {, i/ z  d# f  q" n        EDMA3_DRV_Handle hEdma;
/ M6 ^% Z9 A2 C* V6 ^( j4 ]    uint32_t chId   = 0;
- [( y' H" l: \    uint32_t tcc    = 0;9 V* O7 @) l6 Z6 c

9 _# {9 s: K: [( Q) h: m# j    print2arm("edma3 driver init...",0);
* N( h. V* o4 i% v8 b# k8 m6 D6 q, Y8 V+ w0 J
        hEdma = edma3init(0,&result);5 U8 U  ^  P) g: N7 G
        if(hEdma)- P+ P3 R8 h* x
        {; m2 H, p$ w: w3 [. C$ c9 I; R
                print2arm("edma3init() Passed.",0);2 `7 }. A0 m3 f  D- S& L0 ^
        }" V1 }& X( x/ R& A) z" E
        else
+ E# L" [" X+ \, a        {2 N3 x3 r5 M3 q5 n# ~$ U) c
                print2arm("edma3init() Failed.",0);' {* l0 f4 N% @9 z0 }! s$ _8 C
        }" b2 t& }5 M- L# H2 s. E
       
! d8 m6 O" `" ], }. o  H$ a        if (result == EDMA3_DRV_SOK)8 C1 s9 W* f5 F% [' v
    {  g( a+ @$ {  r" Y
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' ?6 U( \' C- g# [0 P8 X                                                       (EDMA3_RM_EventQueue)0,7 N% P$ n4 M# k" v9 q; ~$ X
                                                            &edma3_isr, NULL);
7 q/ A  M# J! o7 S6 K9 Q. M9 N    }
- r$ [- `! C9 f$ k' o3 `, A( @        ' y. _' q! ^) A: [: M; x
        if(result == EDMA3_DRV_SOK)+ y, a$ m# Y; i6 d0 M* V
        {$ R- x/ [0 R. j2 B( Y' B
                paramSet.srcBIdx    = 0;
8 D7 S& x9 w2 F/ j: |                paramSet.destBIdx   = 1;
  l  i, Y4 w: |                paramSet.srcCIdx    = 0;& z5 F9 j% i* ^4 @8 w0 Y* h
                paramSet.destCIdx   = 0;4 m; q$ P* H# ]5 H0 I8 j+ t
                paramSet.aCnt       = PING_PONG_ACNT;
/ C$ K6 J* O& U: b1 j3 z3 R                paramSet.bCnt       = PING_PONG_BCNT;8 [$ B5 H; P7 d9 b) @1 G5 @
                paramSet.cCnt       = PING_PONG_CCNT;9 d, C+ {- |- c7 P# {$ ]
               
/ M' B. U; x6 B8 ?0 @                /* For AB-synchronized transfers, BCNTRLD is not used. */
3 b  U( d- ?3 z                paramSet.bCntReload = PING_PONG_BCNT;5 T7 e% m( Q$ o$ y) z4 w9 G

0 i0 h7 a3 V7 h                /* Src in constant mode Dest in INCR modes */( P/ ?" X8 n" g; P& \
                paramSet.opt &= 0xFFFFFFFDu;0 X: @2 j6 U$ ~7 U
                //paramSet.opt &= 0xFFFFFFFCu;
" R" p7 E9 R+ o4 L9 U" T               
( ^# B- G5 p1 v# }' y6 p' a                /* Program the TCC */
3 O( L* q6 F$ \                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);  L9 n! I; ^2 |  ~$ l- [
* k9 Q9 x2 b8 H& G
                /* Enable Intermediate & Final transfer completion interrupt */1 U- g+ }) P0 H* `; v
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* D& `3 H; m$ }3 L                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
3 l5 a; |& w- ^! K% A, Z" X4 P3 s4 S
                /* AB Sync Transfer Mode */
4 h: |) o  T2 p/ c$ ]! }, c                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. y$ ~* `  l/ W% u" U3 J8 l. f                * X( m# N+ \' l4 n( O: v  v9 z( N
                /* Program the source and dest addresses for master DMA channel */2 ~/ m9 k' z! E$ l, h
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- E) k5 I4 K& n8 Y  _$ a$ `$ d
                paramSet.destAddr   = (uint32_t)(ping_buffer);
8 f& F2 ~  B0 l3 b$ X2 ?. j2 [* K$ p, D- ~# L& |% _3 e
                /* Write to the master DMA channel first. */# M( J3 C3 T; E' B
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);' C' i9 r7 d& D( P' Y# l3 Y/ p% H
    }       ( m5 q0 h% w1 P# s4 T
) g  _" p: W+ ^) k, J
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
  [: p8 f9 f7 m5 [8 b) J6 S        : F# ~: c7 c& K1 A2 a  h# _0 x
    if(result == EDMA3_DRV_SOK)
+ a) K" A( \8 s2 I    {' r( S+ W% z; ]; k; S) j
            print2arm("edma3 driver init success.",0);
/ N' p+ X+ U( v4 u4 Z" q    } 6 A/ l; ]# J* c/ H/ d0 ]. H
}4 n! W  X: i: B0 I

5 C5 U+ ?4 U- \
% H( r0 ~/ r# W: H6 k1 _  k( XEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- K) R) |7 u" X* O" a1 {
0 P# F" n5 R* a5 G" Y% A, R, u7 E. H$ o. U

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 h3 j3 c8 ^* T! ]1 d每次DMA传输完成后都要再次使能传输
5 {1 I, p' B3 m9 n' N  v5 a
原来是这样,我明天去试试,谢谢了!




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