嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 @% |9 c& ?/ y1 Q#define  PING_PONG_ACNT          1
7 e- |$ g1 _8 H1 L5 N7 B: l- Q#define  PING_PONG_BCNT          8*32*40 ' P0 P4 {, L  ~9 ]5 q/ k/ W) t
//#define  PING_PONG_BCNT       1
( N$ Y4 X4 a6 F( Y% j9 k#define  PING_PONG_CCNT          1/ k5 Q& O% f2 q" i0 c
#define  MCASP_BASEADDR          0x01D00000
/ z: c; j/ f9 `. {+ i4 X2 Y' v#define  Mcasp_RXEVENTQUE        (0u)
: C: B2 V' G# c4 x  V( y. [; p' J' A
/* OPT Field specific defines */8 r; h$ B) _. \% {0 J# ^3 O$ L
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& h4 g1 I/ D% @0 w+ _2 x
#define OPT_TCC_MASK                        (0x0003F000u)! ?& \  a; ^) ~3 {6 R  a
#define OPT_TCC_SHIFT                       (0x0000000Cu)5 W. g0 Y. Q) M3 g/ ~+ A6 [* V
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
2 n, H* r! C2 {" |#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) ?# K5 z( q: N' b3 p  l/ k" S$ J9 ]( k( M$ Q, ^
char ping_buffer[PING_PONG_BCNT];% f1 m3 r7 O/ K3 K1 U
char pong_buffer[PING_PONG_BCNT];/ g. n: J8 \" a0 t' @  X" x7 S+ K
5 j0 X; n2 A' o# e
6 b1 G& ~$ v+ g# Y, `: X
; X6 T9 |! _+ J" Y* }. w" w

. J( G5 u5 Q+ g% p1 i7 a" x$ Bstatic void ys_edma3_init()% l% l- n: {: I% L# U. E2 B
{" I4 n! F" o+ M
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! s" \! ?8 V+ k* }! K4 R" R
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' L5 ~! E$ W1 `& G        EDMA3_DRV_Handle hEdma;
: b+ Z/ J0 h3 f% o; U! M8 W7 n    uint32_t chId   = 0;9 Z1 ]8 Z: H  ^9 v  P# \# r
    uint32_t tcc    = 0;7 b3 o& r+ T, l7 n# q4 p
: `8 h7 h/ W! f. y+ j* h
    print2arm("edma3 driver init...",0);
( p) P% [: h% W" I
3 }) x2 f7 a3 k        hEdma = edma3init(0,&result);. l' p# W# d$ Z8 o6 m5 \
        if(hEdma)
) [" G" }. R& e/ ^5 d# G* J; x        {
. |- f; [9 m# m" c8 O                print2arm("edma3init() Passed.",0);
/ S* a7 \+ Q- P' q+ \        }+ H8 M6 w; h3 n5 T' {0 \
        else1 m2 i3 x; k% @* I" J5 f
        {
- C6 y' L# |% |! O                print2arm("edma3init() Failed.",0);
& n, w( l6 {- n0 w2 y2 ?# {2 i        }
4 V+ f8 o* S/ z& B/ g; p* u        5 y7 @- T9 ~/ ]) K3 H
        if (result == EDMA3_DRV_SOK)  J0 }+ X/ a! G
    {
6 `  p4 Q$ ^4 N( b/ ^: a                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,' I, H0 X8 G& F# m0 X) t( R
                                                       (EDMA3_RM_EventQueue)0,9 Y+ }8 ^9 p6 }2 X( y0 `( J$ P
                                                            &edma3_isr, NULL);4 H  z! v. D/ }' |% x& @
    }" G# B( Z9 x# I0 x4 c5 s8 G
       
5 L& ?& i& \" o* W% F( M7 G        if(result == EDMA3_DRV_SOK)
& W7 H' ?6 u/ I& I        {
& T. y9 j" F" b8 S                paramSet.srcBIdx    = 0;
" m: x' x/ x0 i4 \: B3 B( R                paramSet.destBIdx   = 1;
! V& v2 v, w. U4 ?) Y+ e                paramSet.srcCIdx    = 0;
1 l) A2 A5 O5 p" O                paramSet.destCIdx   = 0;. \% y0 j0 x! s8 I
                paramSet.aCnt       = PING_PONG_ACNT;/ E8 O$ K% g/ r4 M
                paramSet.bCnt       = PING_PONG_BCNT;" J# [0 y! G6 e! m
                paramSet.cCnt       = PING_PONG_CCNT;
' h, b7 a( |* h- ?  `                  G$ p3 t' k, G8 L3 h
                /* For AB-synchronized transfers, BCNTRLD is not used. */
$ U& L" [' v1 N/ g6 a                paramSet.bCntReload = PING_PONG_BCNT;
, s  V; m" X' ^. [; D
8 w8 X) z# y. Y7 r4 t2 w                /* Src in constant mode Dest in INCR modes */( N/ f7 I# I; _, B' k
                paramSet.opt &= 0xFFFFFFFDu;
; V* L7 _6 ^6 j8 M- h                //paramSet.opt &= 0xFFFFFFFCu;
' L% z5 |- U0 W9 v; p( \3 j' d: b  g               
$ g3 U2 y! ~' @  |! z, @                /* Program the TCC */* \5 ]3 t# C+ C- G) L0 X8 a- `
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! k" w: M9 R- S. ?* ]

5 L0 V% ^- S; ~  }  [" e                /* Enable Intermediate & Final transfer completion interrupt */! q- \% P0 Q' }
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 w( s7 t2 N8 |1 o9 E' g% ~3 j                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ r# F) L6 B7 O( ~; s# [+ e( k0 O8 Q
                /* AB Sync Transfer Mode */3 F8 `2 V: U7 _; j# l+ e( e
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);- \- E* A& r9 X' `; P4 J4 Y) W' v5 e
               
% N# C  L2 z- w7 A2 y* P: h                /* Program the source and dest addresses for master DMA channel */
6 U5 I$ v6 D) w2 G, @                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 w* t7 x( R* n1 D                paramSet.destAddr   = (uint32_t)(ping_buffer);5 S% }% H0 P/ Z$ R
& j, E4 f$ O9 N4 |8 p
                /* Write to the master DMA channel first. */- M( T8 q; N2 Z/ E, q/ p
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
& T/ H% |& m4 M7 y# H0 T% W( A    }      
+ c+ M" n* g) }/ y/ n+ `
9 l! H0 V2 C- i. D9 t        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- k; O$ T. E+ }; l0 J% J" U        " [  e9 d8 W! z, o+ o- D% |6 B! V
    if(result == EDMA3_DRV_SOK) ( {' S$ D3 J# ]6 D% _+ C
    {
3 ]. w, k; `! N2 `            print2arm("edma3 driver init success.",0);- @( D3 H4 B, U4 k% K
    } * t7 ]) |* N8 k
}3 u4 o9 X1 n4 U! ^7 e& m( @

' \# E1 D' Z, i' l. w0 r5 T# L  X) e8 T$ Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! i: S' }9 W. H, h
$ {" R) p+ ?& M% U6 s3 K2 E$ \
6 `9 _0 z# m" U& V, n' N
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
6 f& |) e/ H  m/ o0 O8 K1 t每次DMA传输完成后都要再次使能传输
8 L! M3 I$ `: {: K4 X, p5 [
原来是这样,我明天去试试,谢谢了!




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