嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
% M  g# f, m. }! j0 f0 W& m" j#define  PING_PONG_ACNT          1
  N/ n) n7 ]3 ~#define  PING_PONG_BCNT          8*32*40 ' d6 E* Q6 L$ V( J
//#define  PING_PONG_BCNT       1
- z5 }/ e, r: e& |#define  PING_PONG_CCNT          1* u' i  P6 Z2 Z4 d+ f0 |
#define  MCASP_BASEADDR          0x01D00000
' ~* L  G9 j; f. m#define  Mcasp_RXEVENTQUE        (0u)( J; i* l+ [% t

& l# y" @- ?. U7 \/* OPT Field specific defines */
7 L% o5 s9 Z5 V6 y2 B#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
0 M& \' Y; F7 a4 }" W+ S#define OPT_TCC_MASK                        (0x0003F000u)* i; f2 O: n( _2 D3 v' T( M
#define OPT_TCC_SHIFT                       (0x0000000Cu)
& q" `; `+ L. Y( f( C#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
/ J, f6 |0 A8 Y, Q#define OPT_TCINTEN_SHIFT                   (0x00000014u)$ C( n  t$ @6 ]! x0 \4 l3 a

/ n. J- \  u- c) \; F' l4 qchar ping_buffer[PING_PONG_BCNT];7 H$ `2 i8 _6 }9 Q6 ^
char pong_buffer[PING_PONG_BCNT];+ R! d3 L, A/ X- @. s" x* ^

+ c& ^/ g2 }7 S9 J0 u7 l
  O7 }' K. q. t( S  X
4 v6 ?% X* e/ L0 d/ ^  h3 F( v! b; d. N. Z* X6 l- s
static void ys_edma3_init()
; K! u3 W1 n7 s9 @! \" _# c! A7 _{8 `6 t7 r" e! t  O+ J
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};1 G$ r: ^) W" ~4 b# y1 {% g% P' n# s
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ l' A% ]& f2 a: E4 I- r( z$ h
        EDMA3_DRV_Handle hEdma;5 ?6 k, T) g1 I8 ~4 H  D1 y1 [
    uint32_t chId   = 0;
, }: G) O/ ~0 D3 c& H    uint32_t tcc    = 0;# S- W- c/ @& K! F
7 D7 P  u" g3 ?# ]: t0 K
    print2arm("edma3 driver init...",0);
1 h8 {+ d- w' B; L
9 h* R& ]9 u) |4 @( C+ Y  _7 K; u3 n        hEdma = edma3init(0,&result);
/ e5 m: Z# {7 Y# M1 s$ x4 M- T* q9 H        if(hEdma)! f, ?* J# [. I
        {) q! \6 g" T- O: n. U9 y
                print2arm("edma3init() Passed.",0);4 y* e1 d$ r, j  n+ @1 A
        }
% W. P# \+ u- N  r* @5 |        else* ^7 Q& X0 ~9 a
        {
0 r8 }2 U" `  y$ h) }$ A9 Z                print2arm("edma3init() Failed.",0);
- l- C/ I' K( W8 I* t- _. M! r        }
1 p* E; e% z8 r5 @       
! h: D; G' ^) o8 j  c        if (result == EDMA3_DRV_SOK)6 t$ K! X1 Q( L' Q$ ^
    {
2 f# V) q. n$ [7 O                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& B- l; O- W8 j                                                       (EDMA3_RM_EventQueue)0,
* J, F8 p" A/ }6 t( F) W+ ~; F                                                            &edma3_isr, NULL);" G; w( G3 {: q. d- o6 U/ E2 y
    }) M% P) O: v; f9 ~7 R
       
( w! u7 I; k: E1 T9 J- g        if(result == EDMA3_DRV_SOK)* L, O7 K! V+ j5 C6 v" d
        {
& s. }5 ?" Z& |" q/ M$ t2 S% C8 V                paramSet.srcBIdx    = 0;2 S0 ~5 U9 T) a6 q: U+ s! y+ y9 n
                paramSet.destBIdx   = 1;* W! d1 i3 L0 \. ]% Q! {
                paramSet.srcCIdx    = 0;1 \( i2 q" J% Z. K6 x
                paramSet.destCIdx   = 0;8 S) b2 ~/ |' [. q) T3 B
                paramSet.aCnt       = PING_PONG_ACNT;  l& |0 \9 l6 C3 T- o3 L$ F( g
                paramSet.bCnt       = PING_PONG_BCNT;, |  B$ m; U. \
                paramSet.cCnt       = PING_PONG_CCNT;
( p( R0 |0 f! T6 g0 _4 j1 m                1 d& s$ G" \1 T
                /* For AB-synchronized transfers, BCNTRLD is not used. */; u- C4 @4 b  E+ p
                paramSet.bCntReload = PING_PONG_BCNT;
$ {6 |/ I6 K* l- D/ S9 k" W4 P- F
                /* Src in constant mode Dest in INCR modes */6 ?7 O" N) W, B
                paramSet.opt &= 0xFFFFFFFDu;
/ l' G( O; `- {, u$ e                //paramSet.opt &= 0xFFFFFFFCu;: e6 x! x) I* Y% O1 G+ [4 ?: r
                & ^3 d, [! }+ p! x; U
                /* Program the TCC */
' t# J9 ?8 I4 z% Q2 A                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 e5 E9 r, `8 C7 i
8 V# F9 {4 m4 s; R+ z+ f1 |
                /* Enable Intermediate & Final transfer completion interrupt */
4 T9 e0 t/ c) n% o4 \                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# y! Q( J0 {0 J
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, ~" C" m9 E7 X# I+ Z; W7 G* d6 ^, K) D7 C8 H  |0 w
                /* AB Sync Transfer Mode */
1 t& C  Z6 }( ^# {% Q% c# M( R, u8 @! U                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
' j# u$ Y8 N% b7 [& F+ x0 g% Y( S               
4 v& [4 n! `. }- e# k                /* Program the source and dest addresses for master DMA channel */
3 K( X2 [; `8 x! a' T8 u+ G                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% c+ k6 h# M' i6 I( H
                paramSet.destAddr   = (uint32_t)(ping_buffer);
: b- ?( {3 t! O1 f3 G! ^2 w2 A/ }9 i
                /* Write to the master DMA channel first. */$ W& ]; `7 O( s! J  c4 u% G! U7 b
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 J; n) t+ v, S4 ]' ?+ y$ q1 A" r    }      
! _3 o* l/ ^9 F* D- r6 |
" J5 R; d' q- ]1 x        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% C6 c5 c* F* v  o       
: T5 S. {) x! Z) v5 l  o    if(result == EDMA3_DRV_SOK) 5 ^) y0 E; R, ~/ z
    {
# O/ u2 X# }& O2 P            print2arm("edma3 driver init success.",0);% _% k. J# a( R) G) }" @& m  D
    }
1 T: J) \5 y2 ^4 m' Q}# L" \, C& H" e6 e8 o
8 B% A! @/ I. {6 Y) M& m

' E# l3 i1 o2 _7 V( w- k1 LEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。- E) k) [3 t. r% m+ i

# c3 G# O- n1 `
& u5 ~2 u- H0 P- k: t4 k! ~, B
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:475 a$ H1 _) K" j- J* A
每次DMA传输完成后都要再次使能传输

/ u+ V/ _# F" x2 U原来是这样,我明天去试试,谢谢了!




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