嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* g0 f. O7 ?( A8 D+ g; W4 y
#define  PING_PONG_ACNT          1
# h1 w  N! n( i- P% Y#define  PING_PONG_BCNT          8*32*40
* E/ K( J& E5 o4 \2 @. y//#define  PING_PONG_BCNT       1 ) N0 P# ^; ?5 M- |2 p  N" @/ j
#define  PING_PONG_CCNT          1" x  [. z6 ^6 D/ }6 m& c! \4 A% Z
#define  MCASP_BASEADDR          0x01D00000
: |# M/ X0 C- s7 y2 C1 H5 K#define  Mcasp_RXEVENTQUE        (0u)% E6 ^. O) {6 Z0 {' n
) r. H7 L4 E. e  q; K4 H
/* OPT Field specific defines */
9 d4 [: c, N+ y7 o#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" L: W. J+ v+ r( W#define OPT_TCC_MASK                        (0x0003F000u)
# U/ S( F3 W  j3 W) E# f4 I#define OPT_TCC_SHIFT                       (0x0000000Cu): f9 S" }% q, l
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
0 k( n8 z9 R, @0 a. l#define OPT_TCINTEN_SHIFT                   (0x00000014u)% C$ j/ a3 n+ ], [: o& `

- ^& N; U9 {5 cchar ping_buffer[PING_PONG_BCNT];
( T2 |. t4 h5 R$ kchar pong_buffer[PING_PONG_BCNT];
' u) T6 C2 o8 U- B7 {- ?! Z
; }3 ]. ], ?) q2 {  n3 c
1 b; H5 P1 }$ @( m5 O6 W6 B7 k  X2 Z. A7 h6 h
6 n# B' B& w' n8 q
static void ys_edma3_init()
& p6 N) a9 N7 A# N  p" ^2 d{& `+ C( U- k& K: @
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, Q5 r6 a7 ]) Y7 h* I+ u3 z
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;# T+ u4 B- e/ Q& W& r, d
        EDMA3_DRV_Handle hEdma;. u2 ~8 `9 o! Z9 \) q. }
    uint32_t chId   = 0;' @' k) ~2 j& _
    uint32_t tcc    = 0;
/ K/ `' O* c4 e) m& v+ I" K& f+ `( P% i) I5 B2 v: T% Q, [
    print2arm("edma3 driver init...",0);( g0 i" ~* x- o# ^# {% N

7 K: j, T" Z, n# L7 k0 }        hEdma = edma3init(0,&result);
; W, e; C( ^# u+ x+ U9 }        if(hEdma)
& A6 k9 Y" v( d0 a+ Z. P+ g$ d        {
7 D+ o7 ^* M) A4 u9 Z                print2arm("edma3init() Passed.",0);
; y* U: S1 W9 M" a, v8 H" Y$ d        }, U& I$ \0 o' k. B& q8 T
        else
& r3 Q" A9 P* c& S$ F) i* u        {( c/ Y% e2 D) E. ]- `  K
                print2arm("edma3init() Failed.",0);
4 Q; ~6 @" [* y. G, `& b8 p        }' F: K' T  i( S' N6 J' G% n5 J
       
; w0 y% v. q; `* ]# ^  U+ N        if (result == EDMA3_DRV_SOK)
+ {% s, h: o7 H9 ^    {& V) h2 y" S& @; f
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% Y3 j3 y4 D0 U: J* }8 P- c, [
                                                       (EDMA3_RM_EventQueue)0,
4 V9 C' u6 O/ L; P: e- e/ ^                                                            &edma3_isr, NULL);$ p# X3 T& r# U# S' Y) e
    }; a# j+ V8 b- k8 ?4 E1 {3 G
        ( l: V% `+ r3 ?8 Q
        if(result == EDMA3_DRV_SOK)
. B0 u# |& C$ P0 \        {  O7 C, r* j9 _
                paramSet.srcBIdx    = 0;
+ l- n9 y9 Y" D6 j8 ~; R                paramSet.destBIdx   = 1;  v, s; ~! p/ p7 E/ A
                paramSet.srcCIdx    = 0;
5 V3 [: w" V$ M; H9 R                paramSet.destCIdx   = 0;
/ ~3 r6 X0 h. w% _$ [+ b: A8 T                paramSet.aCnt       = PING_PONG_ACNT;1 c* Q. h' L% d8 {
                paramSet.bCnt       = PING_PONG_BCNT;6 I6 ~8 V& {7 [& y- f1 k0 _1 V! M
                paramSet.cCnt       = PING_PONG_CCNT;
$ G  G+ G2 _: Z0 [                * g' Q7 ~. ~+ A2 X& c7 w
                /* For AB-synchronized transfers, BCNTRLD is not used. */
' Z; h! e( G; F                paramSet.bCntReload = PING_PONG_BCNT;: \8 ~: k9 c( J$ U

* I4 Y7 d" p2 `* C                /* Src in constant mode Dest in INCR modes */
& j& j8 ^# f0 t. y                paramSet.opt &= 0xFFFFFFFDu;
' A5 j- j5 _7 v/ f9 I$ @. T                //paramSet.opt &= 0xFFFFFFFCu;
# l! O5 S" ?# x               
3 K/ Q' F, i' d8 f' r1 U5 H                /* Program the TCC */: L2 y  N2 x% B& W. R( S9 u, i8 M
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 N: x9 X% D, c& |

& `0 v. J* d0 ^1 V1 Z1 L5 X$ x                /* Enable Intermediate & Final transfer completion interrupt */
( S/ c) U+ h8 x                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ I. m; t$ \4 q
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( t2 a9 k% V- @2 q9 ^
! v8 q3 z6 X1 U) u. V                /* AB Sync Transfer Mode */
" X1 A8 e7 v- J/ [                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' q' @- ]  q, z( f& A. |/ \- z
               
4 _/ \5 l1 l# |3 ^) a3 P9 C" [                /* Program the source and dest addresses for master DMA channel */
4 ~* T' I. s# Z& z* \) ^' b                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);1 K: U8 ^  x8 i3 ?; ]1 u" G5 L" P7 V
                paramSet.destAddr   = (uint32_t)(ping_buffer);6 v! v% v5 K5 O5 }: p- q% n

. p+ K5 Z2 W4 t+ Z, S/ T' R                /* Write to the master DMA channel first. */
& _0 f! o+ C6 f% Z# H9 ]: \                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 D+ F. Q$ o0 P* W. r/ l: i    }       $ L* C: }  A" x2 @0 @# p" p

- `0 @( n" a( [        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ y3 q/ B& i' t) }  Q
       
( b% U# S$ p/ T6 K' O    if(result == EDMA3_DRV_SOK)
7 U. O1 Y. S! p- U0 h4 u" S; Q8 ^    {0 m2 X7 X7 s$ }. W& o1 |7 g3 R
            print2arm("edma3 driver init success.",0);
' ^) ], r2 E! a, [4 Q' s2 w    }
* I7 H/ n+ K7 ?4 [% h}
4 m' D; R; Y0 V/ R0 P; A* y' |6 [' L) l. a& g; {

* Y8 u  r+ S9 `2 ZEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。8 C$ k7 ~2 U  Z( f; S2 [! Y9 _2 n
; E; u, d/ P: [- q/ @

( V1 B" Y6 ^& h( o' z" H% ~: B' i0 @
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* ~  W! [$ I- ?( B' b% Z
每次DMA传输完成后都要再次使能传输

3 M% ^+ }# g) D8 t7 C原来是这样,我明天去试试,谢谢了!




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