嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* J' X# F% P& @" m7 t3 m
#define  PING_PONG_ACNT          1% S) T8 S6 q6 m6 E
#define  PING_PONG_BCNT          8*32*40
8 f/ G: g! s2 a! E/ C//#define  PING_PONG_BCNT       1 7 ]4 [- P! u8 L% I) }; V+ S
#define  PING_PONG_CCNT          1
( }4 v( o/ J& F# m; e#define  MCASP_BASEADDR          0x01D000009 h/ b3 y/ O' V! ~' a
#define  Mcasp_RXEVENTQUE        (0u)
) r$ K# s7 u5 \% c. e: f8 g. ^, q& d5 V$ N' {
/* OPT Field specific defines */
( J8 r7 a% c, Z& e#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
0 m2 O8 Y% ^, ]$ t1 {#define OPT_TCC_MASK                        (0x0003F000u)
1 e3 e( T$ h& ]! W#define OPT_TCC_SHIFT                       (0x0000000Cu)
6 C; P6 Z+ n3 i3 i#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ ~- w+ l2 @) [
#define OPT_TCINTEN_SHIFT                   (0x00000014u)' w& T! ^2 r* c9 e1 i

" T8 T' E# z# X2 U: Rchar ping_buffer[PING_PONG_BCNT];
/ {; ~* v' N! tchar pong_buffer[PING_PONG_BCNT];+ }/ O- ^4 A, l5 M
; T/ n( p, a, R

& N! N9 }! f1 @) o: p; x5 ]( F2 m5 i9 ]9 ~4 v
7 g% j9 O3 U! L9 j0 W6 W& y. l$ o% p% F' J
static void ys_edma3_init()
, ]% J$ \5 t: l$ e$ `: w& |{
$ t5 K+ e7 u) b9 F        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' ^. a& x( Q% e: S" H$ D, B
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 F6 v' D) {- X$ K
        EDMA3_DRV_Handle hEdma;' N/ u. o$ g1 t/ ]9 K: _! Y
    uint32_t chId   = 0;/ P% M8 j+ ]% o" t& H
    uint32_t tcc    = 0;/ T9 _$ V. a! u
0 x2 |1 d! Y- Q
    print2arm("edma3 driver init...",0);
7 f, K1 Q0 c: P- P, S5 v9 W$ _8 W
# n3 d7 B7 n% g# g6 i* S        hEdma = edma3init(0,&result);6 n5 m2 R* W# T( T3 z3 K6 @4 P
        if(hEdma)
% r6 m6 L3 ?8 t        {
' D1 a( v: p0 H; q- H7 ?                print2arm("edma3init() Passed.",0);/ L; q5 Z% b3 I1 k8 K0 r& j
        }; k6 C5 k4 c5 P5 V5 W6 w
        else5 N! x$ ?# v1 o5 W" m
        {
0 g4 ]5 d; o# b" @6 s6 j                print2arm("edma3init() Failed.",0);
2 r4 p% v5 y! J3 B1 r        }
, S" t2 F6 P, S. q. X' `- y* g0 Q2 r        7 V2 |% @0 M, ]- Q3 b
        if (result == EDMA3_DRV_SOK)
0 X$ s/ @& s5 ^3 F    {+ I; s' Q% z" ?" R
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( H% e9 R/ F' P  k                                                       (EDMA3_RM_EventQueue)0,
1 h$ S( p/ w% f/ N% F' G1 _8 e3 Y                                                            &edma3_isr, NULL);
$ Y$ _+ i  {0 A. l6 O, u& I    }. y" Q: \- h* w' @& W
       
: J" p" G0 W$ p0 V: c        if(result == EDMA3_DRV_SOK)
1 S7 K0 T; m5 A: o0 q. l* l5 a        {
! v$ A% v* y7 N3 t                paramSet.srcBIdx    = 0;( h3 A9 z9 O5 x9 ^0 b# N( c
                paramSet.destBIdx   = 1;8 x6 S- d( m' j, l
                paramSet.srcCIdx    = 0;
- {1 u- p, ~5 a$ {  |: l. I                paramSet.destCIdx   = 0;6 \3 I: C( i3 c% o' @. h5 l
                paramSet.aCnt       = PING_PONG_ACNT;
6 d7 s' x( ]2 Q: B/ V& b                paramSet.bCnt       = PING_PONG_BCNT;% H$ K& ~$ x+ y. U7 O* W* f* p
                paramSet.cCnt       = PING_PONG_CCNT;7 w% C3 K! y* `! y1 P
                9 H: w! f  J$ j. {* T8 h0 `4 e0 C: P; w
                /* For AB-synchronized transfers, BCNTRLD is not used. */. \- a0 N" ^8 X# y9 X
                paramSet.bCntReload = PING_PONG_BCNT;
" t3 N' [2 T! f& z' L1 K5 g; f- ?8 K) H, p& B9 P7 P& Z' p
                /* Src in constant mode Dest in INCR modes */
- H* M. x  O& g; y: ~, h! \5 P                paramSet.opt &= 0xFFFFFFFDu;: O4 U* z+ l3 H, w# }; B
                //paramSet.opt &= 0xFFFFFFFCu;$ @3 g0 D( E/ ~. d5 [
               
% w6 ]% o9 V* j" i$ E8 @                /* Program the TCC */
( G3 y! ^2 I  y& W* E: q2 I+ k                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 |! S, B; |  Z* O
- N# U6 I( h; T: d* A! L# b
                /* Enable Intermediate & Final transfer completion interrupt */
# p" S2 q* n  L9 T# t                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);3 V1 }4 l" a6 M
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
/ [/ b! C! Z1 X+ O* i: b4 F
% l0 T3 }. G8 ^. _1 y+ ]" F3 R3 e                /* AB Sync Transfer Mode */
  ]6 m9 {( f4 u- F+ l- M0 ~1 y                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);& F0 V4 f! W+ q8 U0 ~, F
               
5 J8 p9 F7 c5 e2 y( m                /* Program the source and dest addresses for master DMA channel */0 `  g0 @- ]" M
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
( D" r5 ]/ U( F                paramSet.destAddr   = (uint32_t)(ping_buffer);" V: Y6 A! L; s$ L) u9 A- [1 d
3 J7 p+ x! n5 e/ A/ C% q
                /* Write to the master DMA channel first. */. q, \& P( [# D' Q) H0 S2 W, E) _
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
" O* q  ~/ W2 R& t! _    }         e; N% n& ]; u3 H# v7 L  R, H
# i: u- u0 X; I9 r
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) `! |" i4 C6 w( R
        5 n7 R( r( n6 n9 |1 F  w4 N
    if(result == EDMA3_DRV_SOK) " w/ D4 \' i* ?) t! I7 k/ a
    {
& o! `7 Q2 n- U! Z9 J- G            print2arm("edma3 driver init success.",0);0 ~) y9 Q" H- ]- Y
    } " d! V1 |. V9 U+ _3 y+ \; h9 _
}; D2 Z% t, \- Y6 F) ?! C! }5 P
5 ]# l9 f+ R" y: u. }! E9 ?
1 f) A9 M" Q6 }# ^. Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* ]; f+ \/ t  A9 S. C0 g  }5 I& z) M3 E! O5 Z

3 t! l( e2 ^) n4 D9 _0 v0 E8 t
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* `- u. M' g# ]( K3 r) `每次DMA传输完成后都要再次使能传输

- X3 i  C$ r7 L5 J! j原来是这样,我明天去试试,谢谢了!




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