嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 c/ z! J1 [1 V  U3 r/ m& [0 d#define  PING_PONG_ACNT          1! p( I5 l) A" q1 [# \
#define  PING_PONG_BCNT          8*32*40
9 y  f, h7 X# y. B7 o: i//#define  PING_PONG_BCNT       1
1 k, P  `9 U6 i7 X#define  PING_PONG_CCNT          1
& U9 O9 S5 J& s/ w& R- R* y* W#define  MCASP_BASEADDR          0x01D00000
) M9 }. e/ f  Q, k7 W& j& c5 W3 h#define  Mcasp_RXEVENTQUE        (0u)7 p* b1 ^: c$ x; h  G/ J
/ Q. Y: E4 E# b
/* OPT Field specific defines */
% _/ G; b, ^& _0 ?7 [* f# l  T) b1 S#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& d, K/ I; h) W3 s' \3 n& l+ L
#define OPT_TCC_MASK                        (0x0003F000u)
. e, u3 J6 C9 C& f. E& u9 I#define OPT_TCC_SHIFT                       (0x0000000Cu)0 F% Q2 ~2 d  I
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
1 y, o- z4 t( \. B4 X, o#define OPT_TCINTEN_SHIFT                   (0x00000014u)
( s) ^5 e: i5 M' C8 Y0 b" M" c5 h! m% `  Z( m- H
char ping_buffer[PING_PONG_BCNT];$ V* G0 `2 p! @# x8 c  w+ q* G
char pong_buffer[PING_PONG_BCNT];; p$ P. H, a. c' J* U
2 F! [. }# }; h2 S
( H3 y; _) s# M: X9 P7 @/ S

! q( `) t4 s% \$ \+ k: _
) F$ ^. H$ y& O  j+ g" o7 f/ Ustatic void ys_edma3_init()4 }4 Y# ~* F8 p9 U
{; d& W1 v" [# |! y8 ?$ `& l8 l
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};: `& d4 ?. T% ^
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 ^  A  a$ u; ^4 v: m+ \        EDMA3_DRV_Handle hEdma;8 h, p4 K! a6 x  G4 Q
    uint32_t chId   = 0;0 k- X- a1 H: ]# s' S
    uint32_t tcc    = 0;% R1 i( e5 h8 R+ O

8 Z- h3 A$ _4 _% p    print2arm("edma3 driver init...",0);
& W" N+ v  e% d( y0 ?% b7 E9 g! z3 r
        hEdma = edma3init(0,&result);
- `9 M  B( [# e0 @" Z- A' S        if(hEdma)& Y  f* W$ x8 M& i2 s  j/ e* P
        {, D$ {3 ?2 D% E% ?! ?  v
                print2arm("edma3init() Passed.",0);
/ C4 @7 u, }+ J5 i        }
; O2 t3 X. B. X) B" S        else0 t, y% N  {8 }  s
        {) T9 Y9 c. t* j* x1 Y( d
                print2arm("edma3init() Failed.",0);( v- i% }3 }$ b  s, U0 n. r" R
        }
; U! T# k* [' G        7 A& L9 ~. N- J
        if (result == EDMA3_DRV_SOK)
! J) B! O; |8 Z' u1 V6 ^* y" n9 @    {' \  \) r5 l5 C% p3 M
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) c, `0 ~: a. \3 y                                                       (EDMA3_RM_EventQueue)0,4 A/ C# {2 |- s9 ?
                                                            &edma3_isr, NULL);5 K0 Q+ b+ q- Q' s$ k0 j" {
    }0 I9 g& y9 S2 g1 ~( L8 ?  `
        ' L7 x  }1 A6 g5 \
        if(result == EDMA3_DRV_SOK)- M/ h  j; s5 N' g
        {
0 Z6 r9 Q. S- R/ n. @: `                paramSet.srcBIdx    = 0;
0 E# K/ n- |/ Z0 g. w- y                paramSet.destBIdx   = 1;6 B. F8 I0 J$ J0 l" q
                paramSet.srcCIdx    = 0;  o  p4 B# z* a( `8 `8 a' L, d
                paramSet.destCIdx   = 0;
, M8 B/ `7 ?/ V* q                paramSet.aCnt       = PING_PONG_ACNT;
2 E& D$ w# E, P5 C1 _% n6 a                paramSet.bCnt       = PING_PONG_BCNT;
6 i& V3 q, l9 M5 l                paramSet.cCnt       = PING_PONG_CCNT;
* {; C8 R' C! t  t1 g5 D               
  r, ^. O  K6 C/ h                /* For AB-synchronized transfers, BCNTRLD is not used. */* ~# o  u1 R. Q
                paramSet.bCntReload = PING_PONG_BCNT;: e; b3 C+ o( v% s0 A; S( ~8 J

+ i. \9 q; Q9 \- \                /* Src in constant mode Dest in INCR modes */
" [" {* c: w. O* j; ^                paramSet.opt &= 0xFFFFFFFDu;& x4 a5 O  y! i# R
                //paramSet.opt &= 0xFFFFFFFCu;
, a$ V3 @9 [6 v) T; D1 U- k               
9 u- d) D4 W3 v0 \+ e. d                /* Program the TCC */% e1 y, ^% q5 D, U* A
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) _; K2 u) f" j3 o* `( y2 Y' x
) a/ c0 v1 G1 y6 S. @! v! J
                /* Enable Intermediate & Final transfer completion interrupt */3 K' s* l& [& h1 E# k3 \7 q- Q7 v8 |
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 X$ \* g0 a$ l) L. O. o. |: M- V                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' z: t' N. x8 d# D7 t
. Y/ h) H+ p0 C$ U5 I                /* AB Sync Transfer Mode */( X1 W7 r. J* I0 B4 o3 U
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 b" B! a4 ], E: ?9 m' C                6 i6 u  T; q8 }6 K7 _" b' M3 U/ f. w
                /* Program the source and dest addresses for master DMA channel */
" v7 [. H7 M, k; f& c' x  E. u+ X                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- `9 E$ I7 p% W3 v( H
                paramSet.destAddr   = (uint32_t)(ping_buffer);
* C/ [5 E* q3 V9 {3 B% B5 M6 Y
                /* Write to the master DMA channel first. */. I$ R' j( [: ^: i6 R, N1 i
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);! d! J  p3 L5 O3 B' I" x
    }      
9 c; e( u' K5 j/ `6 B7 y7 e& f; ]4 {, @9 U( C
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% v. J3 J6 P5 z% {; S7 }
        9 y) p: s0 m& X: Z; ~, X
    if(result == EDMA3_DRV_SOK)
& w# a7 q2 p! {( k( z    {
3 M8 y! B$ W- n! r1 R: y: w. q            print2arm("edma3 driver init success.",0);
/ I! k3 @4 r- V6 d0 b; \" t1 K    } + k- j, J6 z* t$ I% j0 N
}
" F/ v  o0 b+ _; r0 n- U5 p, `- B* u6 X( X
5 P) Z& `. E) Q, A, j
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 O4 f9 [- {, X+ f3 n7 T5 H! S6 q4 N) d

: O" E2 M( x2 }  v4 w% J
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ {1 {  S6 B1 B) K  F2 x& [) r
每次DMA传输完成后都要再次使能传输

* J; n: q: K0 B/ u! D5 l& ]原来是这样,我明天去试试,谢谢了!




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