嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:# f  _$ K5 J/ V* I- ~
#define  PING_PONG_ACNT          1
! C. c0 [9 d  |6 H+ r1 @3 R+ M3 P* e#define  PING_PONG_BCNT          8*32*40
1 O' ~# A+ O) ]& s2 m//#define  PING_PONG_BCNT       1 + e& _3 B  X! `! _' N, N7 I
#define  PING_PONG_CCNT          14 ]& F6 n: w" T$ l) A/ ~
#define  MCASP_BASEADDR          0x01D00000) z$ O! a' R) }+ D
#define  Mcasp_RXEVENTQUE        (0u). C8 Z+ \3 F) U+ L
, g, Y6 j/ ], e! _) x) T
/* OPT Field specific defines */
5 ^9 ~: o( M5 X$ }; b8 ~#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, P( g& m/ ?; X4 ~. ]  L/ k& ^5 Q#define OPT_TCC_MASK                        (0x0003F000u)+ e+ F0 T* X& Q5 v2 j8 \* h0 Q+ H
#define OPT_TCC_SHIFT                       (0x0000000Cu)- j) c, N" _' d0 h' p0 h! F
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
  c' D) Z- C, Y9 Z# T2 J#define OPT_TCINTEN_SHIFT                   (0x00000014u); l5 R7 R2 F1 x: w7 b( E

& L1 ~2 {. n" L3 ]char ping_buffer[PING_PONG_BCNT];
( Z) J, @; s8 O, Ochar pong_buffer[PING_PONG_BCNT];! F# e  P- z" a" j$ }( J6 K

0 S/ s' R7 b1 L" h" b9 u
! S) Q! W) J6 s( v  g' h" M  J7 H, J( d# \8 c% F* _+ v

1 i, J8 ?- d5 q9 l# tstatic void ys_edma3_init()
# z# g% H( E- U2 K- D{2 P7 B; q0 Y' F5 a- [' E8 d
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 _/ y1 B0 h7 ~6 W7 ]4 y        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
: i% a2 b( v- i3 B3 i# G        EDMA3_DRV_Handle hEdma;
, W. T3 t8 S$ z3 Q    uint32_t chId   = 0;+ `+ Q5 D2 l8 [9 T
    uint32_t tcc    = 0;* \8 s  Q5 F: V( {4 m7 Q4 y

8 s$ W& E! L0 u3 |1 W/ z    print2arm("edma3 driver init...",0);
# Y$ E, z. U- ~8 L
4 l0 m: a* `+ q1 Q( Z        hEdma = edma3init(0,&result);" P( ^: U/ ?/ u' s: p& i
        if(hEdma)) I3 L3 `1 a: K
        {
: ]+ V/ p+ `: J+ d5 P  v! l! Z                print2arm("edma3init() Passed.",0);
5 r3 q# p' U& `9 W" G        }# x/ \7 [' i2 v2 e7 M8 [" A6 K" t4 U
        else: c  h' i# {+ L5 \- E, j" X0 ]
        {  G6 M: x6 u$ ?% X) d/ n4 R/ k
                print2arm("edma3init() Failed.",0);
5 ~: j; ~/ ~! l; A  g( c        }. a" D# |; b% x6 ^
       
+ |, a/ t6 H& g/ U- N* S; X3 G        if (result == EDMA3_DRV_SOK)
; N$ c, w7 Q( j3 t    {# @% O: O( D+ q" ]: [8 W" g! @
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! c% q4 M2 o8 {( ^% t                                                       (EDMA3_RM_EventQueue)0,
0 e2 Z, U" ~7 R2 T$ i6 H                                                            &edma3_isr, NULL);
3 K6 j3 p9 I# H* X# @/ W    }
6 c) H7 q: U) J' Z" A        , D3 P8 [4 T# |9 D
        if(result == EDMA3_DRV_SOK)& q$ J/ e0 W2 E  |" B1 t4 r' `
        {' [1 J& B6 {# L" v1 B
                paramSet.srcBIdx    = 0;' B$ ?. P6 }. h/ B* V
                paramSet.destBIdx   = 1;
$ n5 Q8 Q1 s8 X3 J3 R9 r& c5 n                paramSet.srcCIdx    = 0;: i6 Z9 ?) a7 X( ]
                paramSet.destCIdx   = 0;
$ n' ?3 E0 h* A# h9 |                paramSet.aCnt       = PING_PONG_ACNT;
; N9 O# S9 Q7 W# w( O                paramSet.bCnt       = PING_PONG_BCNT;
8 g. k2 F5 c% r                paramSet.cCnt       = PING_PONG_CCNT;
4 V7 g7 x+ k1 W, u/ v- R2 h               
' p: w; S2 F- D, a$ f7 M                /* For AB-synchronized transfers, BCNTRLD is not used. */
) L+ `& q, |' e' w5 A7 _& ?- |: P+ {                paramSet.bCntReload = PING_PONG_BCNT;" p4 y& T: z9 T8 n0 P% \
& }9 \; }/ A2 W1 O
                /* Src in constant mode Dest in INCR modes */
/ u4 ?' E" P+ S9 S" ?! Z                paramSet.opt &= 0xFFFFFFFDu;; H, D/ o( v! j( v, a" k
                //paramSet.opt &= 0xFFFFFFFCu;6 l6 _7 @" S9 j& R" [
               
- L! a7 g3 Q+ y/ B5 m2 t                /* Program the TCC */, U3 {  C$ _  v4 r6 J7 }
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; Z' l9 V" G+ V" ^

; E  b, h2 M" I+ S% K4 O- |                /* Enable Intermediate & Final transfer completion interrupt */
8 W' ^5 q! Z7 ]3 `                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' r7 Y# Q5 X; @! G
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 ?: ^( ~' L/ V* W! i( z
0 N& W/ X  H( R$ Q
                /* AB Sync Transfer Mode */
4 @4 _: p' Y+ V8 }' a! g! N                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);( ^7 B! O' M8 \/ h% [! a
                $ p4 F8 {' a; w8 X
                /* Program the source and dest addresses for master DMA channel */
' z  F( j4 f5 `9 s# b/ X                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
$ r$ R( _1 g8 H4 G$ d& j                paramSet.destAddr   = (uint32_t)(ping_buffer);
% x/ a: I9 n5 Q. H( e
( \: P& [! w7 m; g5 K% p8 h                /* Write to the master DMA channel first. */
- _# t) W7 N2 ~, r2 m) q& X                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' J( ]5 y' J* Y, ]2 ^" v    }      
1 Z6 m& w! m. T  i; }' k7 Z& O! x! ]( |% a
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% C0 q- H" N2 A% @       
% n# Z* o6 g; Z4 D) M+ ^2 C* c9 g    if(result == EDMA3_DRV_SOK)
6 m- K" _; R' y7 h    {: Z* x5 s' b7 F2 v
            print2arm("edma3 driver init success.",0);/ X' t% s6 T) u; p8 D4 s- R
    }
$ ^, e9 T  [3 Z& @}# k/ u/ ~" P0 b2 A/ ]# H$ l" u
" U9 H9 M; _6 C2 _7 @: N1 U
$ [* X) @9 ~& g6 L3 r* p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。# j+ s6 F( x: N
! F1 d1 ]/ \1 {5 T/ a( j/ ?! Q  M

0 x, r; ~! ]2 _8 h, \
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( N) ]  y3 {" H; }& W每次DMA传输完成后都要再次使能传输
/ q0 W/ |# i7 y3 N' J0 a; J8 o
原来是这样,我明天去试试,谢谢了!




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