嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:$ m( L9 |% j" o+ f
#define  PING_PONG_ACNT          1
2 V, A& h! X5 J+ Z! m" G# t9 B#define  PING_PONG_BCNT          8*32*40 ( ^( H7 c6 M0 O/ N9 ]( \
//#define  PING_PONG_BCNT       1 ( a6 A& V5 L5 \- N
#define  PING_PONG_CCNT          16 h& {" s9 i' A  C, J
#define  MCASP_BASEADDR          0x01D00000
- a: N" _- ]; O#define  Mcasp_RXEVENTQUE        (0u)5 X: R- q- g2 w, P8 c$ v8 Q

/ m% Q! M% A" v/* OPT Field specific defines */
7 c$ y( s/ X0 k9 i- V2 h#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
5 B* P( g1 ?* b9 F#define OPT_TCC_MASK                        (0x0003F000u)/ U! s) M7 o' q: p# y, V6 O
#define OPT_TCC_SHIFT                       (0x0000000Cu)
! L7 b; K3 D) ]: U7 `3 z$ I#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
. z4 p6 p/ I6 B- ~+ v' f  ]#define OPT_TCINTEN_SHIFT                   (0x00000014u)
3 X$ u2 r: a$ J. A( D" M- U6 E- B2 z, k' \
char ping_buffer[PING_PONG_BCNT];
( ]+ @# C$ |( Bchar pong_buffer[PING_PONG_BCNT];
- K6 p; I, B+ [- N+ P
# z8 a+ _) G( {( S- M- Z" f4 z, _: w5 g" j0 K
0 j( l) O2 l( B6 y7 _

( x0 Q3 F2 @" ]static void ys_edma3_init()- O; a/ y5 E0 u; y
{1 U5 ]2 v! ^) \4 M
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* i( @8 J1 h/ O) E9 L        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
& j# p1 y! H1 W9 `' i" q        EDMA3_DRV_Handle hEdma;
0 _+ I+ M$ a4 E) F7 y; I! l    uint32_t chId   = 0;
% l/ L! d  j8 {9 O+ P, K) }    uint32_t tcc    = 0;  w& M# v/ D" Z& |# r" w. b
" t. n5 L, I' j
    print2arm("edma3 driver init...",0);
5 q+ P" v$ S2 Z6 S& J
4 D1 F% A$ m& X' V" Y9 `1 ~( g        hEdma = edma3init(0,&result);( v8 E; g) X. N
        if(hEdma)
# a$ S8 M3 X4 w/ h8 {0 o" ?        {
3 w: H6 _. q. U0 r; \+ e4 `                print2arm("edma3init() Passed.",0);& _, V! R9 |7 n+ e8 d" x- {$ h, ]
        }8 p; i: D, e# T& R
        else
# F" @' T/ b; B7 m        {( d5 F0 |& R+ _) S7 G# {
                print2arm("edma3init() Failed.",0);
, E0 f+ Q' u0 y- }5 r        }/ I0 k0 ^) x8 J& t& |
        - A& l( J& n( q! |
        if (result == EDMA3_DRV_SOK)
" O- p+ v9 f0 V( ?* M    {
$ H- Y( K- N3 o7 p7 y6 K  q                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 [& G0 O3 k2 q0 S% H1 c
                                                       (EDMA3_RM_EventQueue)0,# X1 J7 W* B& U1 n3 A% i
                                                            &edma3_isr, NULL);! P/ y' E- a5 Z
    }0 K) f8 e1 h6 S4 V* x
        $ _0 o2 _2 U" K
        if(result == EDMA3_DRV_SOK)
& M+ ~/ U8 U; R        {
6 C. g$ j8 U7 q                paramSet.srcBIdx    = 0;
' H2 t& R8 s5 B" j$ ^' Y  ]* p3 v                paramSet.destBIdx   = 1;' h' r4 p  t" \: ~& G
                paramSet.srcCIdx    = 0;* x6 {- A" X+ N
                paramSet.destCIdx   = 0;
9 k; A1 _5 ]2 ~9 s" a1 K* J                paramSet.aCnt       = PING_PONG_ACNT;: e0 ~' D( {: m0 B/ ], d. @& |3 A
                paramSet.bCnt       = PING_PONG_BCNT;
, L+ [5 i+ k) H# A9 a2 V                paramSet.cCnt       = PING_PONG_CCNT;
2 c. I( n( \8 X2 v: d: ^                5 d! j, r- _' a* j6 n8 ]' \
                /* For AB-synchronized transfers, BCNTRLD is not used. */  [. A+ A/ p- C) G% @# o% `
                paramSet.bCntReload = PING_PONG_BCNT;( z- }# i2 @/ {) v+ y. J
$ q) E" w% K2 Z" G) L
                /* Src in constant mode Dest in INCR modes */
+ a) P) r* v& ^: \1 h                paramSet.opt &= 0xFFFFFFFDu;
2 O' C* G1 W, m# ^7 H4 t  e: v# f                //paramSet.opt &= 0xFFFFFFFCu;
& z: B3 s+ D  w0 h) r- Y  W                4 }; @0 C2 R9 Z3 e
                /* Program the TCC */6 g9 R& J! ^% a, }, ^
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
* t* r6 l1 `7 [% ^
7 M5 [% ^% j, o                /* Enable Intermediate & Final transfer completion interrupt */
" g: Q! y6 i6 j3 `( ?2 V2 l9 l                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% _+ }! r* g- r% _' B
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);: r$ S, ]% N# l$ j' L: e# k

. l" Y  h- U2 l1 K                /* AB Sync Transfer Mode */8 m0 T" |4 V' ?
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( ^1 ?; k5 q& X# I. ?               
$ B0 t3 O. N3 T3 B5 D6 C                /* Program the source and dest addresses for master DMA channel */
7 i1 Q, [1 m' @4 G  l( x                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
$ f% \2 G" G; m- f$ d                paramSet.destAddr   = (uint32_t)(ping_buffer);- ~# e3 `0 R) V& q2 {- h& d
" r0 ~  `. z/ h. G9 O3 h6 S
                /* Write to the master DMA channel first. */
; T. `4 L/ N' F$ |: {0 {                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% }7 R: C) a; y# x0 _7 i# E5 ?
    }      
' M1 U2 f- s; L8 \0 Q$ }& V0 z
. e$ D/ `5 g& A' s        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);; U: Q% p9 W2 f! F# e" d% L
       
7 Q, G5 {' w4 k    if(result == EDMA3_DRV_SOK)
1 L+ u5 z$ V% u  T2 `; g    {
6 y' b/ A. a! q, `7 L# B9 X2 h  L, T3 x            print2arm("edma3 driver init success.",0);
( Z" L. M3 ?8 n* ?& q& R, [1 ?4 D5 H) G    }
7 Z0 ~: q4 R% R- z}
( d. F/ H, g1 r) I6 |
: \5 K+ b8 X3 ]: B% c' y8 c) i' c+ w$ I9 ~# f9 S
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* i7 @2 U4 Z6 g4 F
+ u5 V4 k7 w# T# V; H# U
4 E5 w4 w9 P) c* H9 B
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47& {' z& C! K3 k, y: l+ e
每次DMA传输完成后都要再次使能传输
" H" h9 h0 `4 g* F- I3 H% r; ^
原来是这样,我明天去试试,谢谢了!




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