嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 D8 K, }* [: ?. M/ w6 ?
#define  PING_PONG_ACNT          1" c- k' c/ L8 ^: c7 ~) D4 b) G& G
#define  PING_PONG_BCNT          8*32*40 3 `! P! y" U4 j9 L; z
//#define  PING_PONG_BCNT       1 # G9 W! y  E% b' s4 o% B" D
#define  PING_PONG_CCNT          1$ W- @6 _3 b2 B" q
#define  MCASP_BASEADDR          0x01D00000
' M: r5 f' D9 O1 _# g1 G#define  Mcasp_RXEVENTQUE        (0u)
) k+ g' Q* I/ t/ K0 Z+ J! C$ l
2 l$ n+ ?( \% o5 |- W' [. J/* OPT Field specific defines */
, |. J9 v. A+ ^#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
) ]1 z& j( `+ ~! R# m& H5 L#define OPT_TCC_MASK                        (0x0003F000u)0 P) O7 s' i' P" C! y: i
#define OPT_TCC_SHIFT                       (0x0000000Cu)! y/ }+ m) Y, |
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
" h4 w, |! c! y, h) B& C' B#define OPT_TCINTEN_SHIFT                   (0x00000014u)
+ C# g" c5 y  T9 N4 I6 f* Q
& Q$ U1 O  l) e) n8 qchar ping_buffer[PING_PONG_BCNT];  B- E! }! I/ C& P) ]
char pong_buffer[PING_PONG_BCNT];
# L9 |- h7 {+ W; b1 G: S" w9 H) ]( X$ {+ h7 ]3 X+ q
; s  N# e& r1 S: Q2 u' x& N7 _

. n- ]3 X* E7 X  F7 @0 \' \# m: ^0 N" s+ H8 h& |& C9 i
static void ys_edma3_init()' e1 n5 a. {% G1 k6 C
{- v9 E( H# B/ l3 y
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 ~* S! _2 t7 w. E        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& l. H1 S% x& L' H1 ~        EDMA3_DRV_Handle hEdma;; r) }. j) e* d, P9 X
    uint32_t chId   = 0;. _& N- \. h- j4 t' w
    uint32_t tcc    = 0;
: I5 U' ~: [; j1 v6 E0 T+ z8 m* u! h- R, b. ^
    print2arm("edma3 driver init...",0);0 v4 u8 M: F! A9 G9 z+ [4 T& `3 v

' N9 i# |  T) Q5 k        hEdma = edma3init(0,&result);0 J3 m! d* y4 @) O4 l
        if(hEdma)( Q# n( Y/ d1 r% w3 Q* S! N
        {* u; s& N0 ~5 f3 K; B3 _
                print2arm("edma3init() Passed.",0);/ @; v% r- e. ~1 B
        }
$ i0 M. P) U* Y0 Q4 N        else; [: D$ U9 x4 I
        {
6 r$ h$ r  j5 ~0 z                print2arm("edma3init() Failed.",0);
' ?  g# w* \* A% }  l+ i* D        }
6 ~+ V- z7 ^- @' n- g! i       
0 s# ]5 v) F; T" v0 n2 }0 k        if (result == EDMA3_DRV_SOK)
% r3 p$ `' z7 h! a. w0 {) {7 l    {7 T9 B, Z& P# U4 K! Y8 R6 L
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 U8 M! o7 B6 a, a: H
                                                       (EDMA3_RM_EventQueue)0,  X. q2 e* O9 h# T9 q& p8 ]
                                                            &edma3_isr, NULL);" u6 k+ w8 s- R
    }
7 f  r' ?- m7 F- t       
. h  X  q) q5 `" _        if(result == EDMA3_DRV_SOK)
# H5 ^; O5 h9 y4 Q: E        {
, {7 d# h* _, V) ^- h1 J! G                paramSet.srcBIdx    = 0;1 u3 u7 q4 ~3 U4 z, v; x
                paramSet.destBIdx   = 1;+ U( H4 {- o" n6 a
                paramSet.srcCIdx    = 0;
, J8 y# l/ |1 q+ ]6 _6 l9 I  r1 L                paramSet.destCIdx   = 0;# T- r& S, b) ?4 t: o/ ?# p
                paramSet.aCnt       = PING_PONG_ACNT;0 n3 h: h, u  h
                paramSet.bCnt       = PING_PONG_BCNT;
% K# t* I. |! \5 Z8 e                paramSet.cCnt       = PING_PONG_CCNT;5 \6 L5 m3 ]! v) t0 p4 ?& B; l/ C
                ! d0 u! H- T" ~0 E
                /* For AB-synchronized transfers, BCNTRLD is not used. */
2 y, |' ^5 t: i7 b% B                paramSet.bCntReload = PING_PONG_BCNT;
# r" J  R- }9 Q# x' K2 N6 z) |* }4 E' E3 `# G5 W- a# `7 a- s
                /* Src in constant mode Dest in INCR modes */& M# n) Y& ~8 W! G3 x& L% G
                paramSet.opt &= 0xFFFFFFFDu;
# M* j( P/ a) W/ T! M% U; X                //paramSet.opt &= 0xFFFFFFFCu;
+ X* W4 q1 o, ^( f               
1 C- P" j8 p7 ]+ Y0 Y, L                /* Program the TCC */! G. \( F/ G. N0 m2 n9 U' s
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 u5 A" O  Z, V' {3 ~4 r8 L2 q$ k
, T2 \9 |$ \! `7 p- r                /* Enable Intermediate & Final transfer completion interrupt */
! u& p: k$ ^% T" n4 J; c/ O                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: [& k4 c' `* K. x  q& ~                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 ?' k' {$ _7 O; I
: R. P; _4 _4 y                /* AB Sync Transfer Mode */
  _5 c8 e. C2 X' _% I                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);! b1 w' x& T$ ^/ }0 s, Z
               
4 W& |2 u& i0 x( a) ~4 P$ J                /* Program the source and dest addresses for master DMA channel */& u. C! Z! [( s8 D- w: u5 c) t. o3 d
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
! W- s  X* i$ B" O# _1 `8 D" j1 |                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 j. t% ]# }, X( q8 k" s
' Q& f: y6 e' b( f& H' N                /* Write to the master DMA channel first. */- q( |/ F3 R; I
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 C  R5 ?) ~8 C    }       - ]- R2 o- I9 C: x' A; C& [8 e

' g3 V* j  l7 y. ~        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# r8 T) T* e+ N& f+ W& m
        8 Z% k# T8 ]4 V; C7 x: F/ n5 @- W
    if(result == EDMA3_DRV_SOK) : K6 ~1 v# q: D+ P) n
    {) x9 B/ g" e% _8 d
            print2arm("edma3 driver init success.",0);  _  r; ^2 s0 K. |) K4 n
    } : O" I2 K; Q) d2 ~6 i0 ?; g1 w- D' T
}1 |0 ?  ~0 g( Y& z. w* A( T
$ J/ ?. a' g+ |. e7 V4 n; }
+ X) \% A9 \  e6 v5 |! j
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。' c4 P! ^5 J$ M

3 _# b" J/ ~% G0 P' p+ E+ |6 n' a9 E2 N

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 }5 Q; j4 y" \- C7 C, O. ~每次DMA传输完成后都要再次使能传输
, I( p3 b: \" O' O( O/ t
原来是这样,我明天去试试,谢谢了!




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