嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:  ]2 j% |1 n( i& l, A! R: r
#define  PING_PONG_ACNT          1* y0 M$ @8 K7 f/ A( j; d
#define  PING_PONG_BCNT          8*32*40
; G, y0 k+ M3 l/ ?//#define  PING_PONG_BCNT       1
' ~  @6 q* k& n9 c# l4 L#define  PING_PONG_CCNT          1
9 Q5 B2 ^5 {$ x! y2 h0 ]#define  MCASP_BASEADDR          0x01D00000" O. U6 x! h, @3 [# P
#define  Mcasp_RXEVENTQUE        (0u)
* P1 A8 e) w: k: o; Q: N) H6 x5 J% D2 H1 Z" j- u
/* OPT Field specific defines */
  U' K5 ]' x' ?#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
# ?) h) a' b; \#define OPT_TCC_MASK                        (0x0003F000u)
# g$ h: ]6 K8 E) e' O7 C3 ^#define OPT_TCC_SHIFT                       (0x0000000Cu)
4 F; O4 q6 ]+ H4 W) g% z: w2 g#define OPT_ITCINTEN_SHIFT                  (0x00000015u)) ~* o2 Q, d1 s$ D2 F6 l' |) p
#define OPT_TCINTEN_SHIFT                   (0x00000014u)( z7 ~3 r5 |3 k9 o" G) W/ v2 n

0 n4 h# f# f- H1 w  F" D6 \* Wchar ping_buffer[PING_PONG_BCNT];6 ~; Y# E. K; Q
char pong_buffer[PING_PONG_BCNT];
" S9 O6 |/ i* \0 x* X
+ }: B: _& o" B6 s7 ~
4 j8 v) B  L9 c  O5 i" F5 w
3 y% c: K" Q) V* g, j0 u3 i
& G  ~# r. c% T) ^3 Lstatic void ys_edma3_init()
$ |0 P2 ]9 q  i& Q' \- B{3 I+ f5 e' m9 |4 a9 b) D/ Y& d
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};1 r$ R5 P  y$ \8 _5 S9 A- ]
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 H/ U; ~" ]) j" y        EDMA3_DRV_Handle hEdma;% o1 v5 I  T& @4 f& J
    uint32_t chId   = 0;
0 u$ `/ `: m+ {6 W8 u    uint32_t tcc    = 0;
2 h9 t" j( Z: |, ]  d1 w- L7 L1 O: o
    print2arm("edma3 driver init...",0);
1 h7 I, i: n, y2 x( q1 x: ]0 L
        hEdma = edma3init(0,&result);9 q' n# C( |/ ~+ t! E% [9 T3 v
        if(hEdma)
$ U0 s/ t' Y6 t$ A$ }' ]( g8 N        {/ J) T1 B! a1 b
                print2arm("edma3init() Passed.",0);
& ^9 ~1 T+ {4 a4 V& x5 M        }3 l/ o  ^) l4 Y- d% J' A
        else: E- _. ^9 a- G" J# N
        {
2 I0 g' e: ~; p                print2arm("edma3init() Failed.",0);3 Z2 j% D- `; I+ ?# V
        }
" H6 T* u$ |0 `- S7 }7 V       
5 B6 z  S+ S+ j# c; o, I        if (result == EDMA3_DRV_SOK)
* Q# @+ d  D2 M7 t3 T8 }0 s" b    {
  `- ~" x! t8 l                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 j4 x1 D, B: r8 \& B/ ~. H' N                                                       (EDMA3_RM_EventQueue)0,
$ |% E  T# [8 G1 t                                                            &edma3_isr, NULL);
+ P% i7 ^) X5 w& |; U    }
7 ~- p. }4 {8 {3 \       
4 K4 }. F% v% b4 m( L        if(result == EDMA3_DRV_SOK)/ z8 N! n9 f1 }7 l* D" F
        {
5 U; u+ m. w$ k+ p                paramSet.srcBIdx    = 0;9 {: Q/ [. Z  s0 t' N" c) t
                paramSet.destBIdx   = 1;. u' z, {! ]& |5 A; g, E; k- Q
                paramSet.srcCIdx    = 0;- C3 T* Z; H2 d* C' n- o" b) M; `! T
                paramSet.destCIdx   = 0;
, B4 \; b4 {5 U9 S                paramSet.aCnt       = PING_PONG_ACNT;3 o! r7 f# Y* q: @2 D' s9 a
                paramSet.bCnt       = PING_PONG_BCNT;
6 `% F1 |9 [& O+ H% q" F$ F                paramSet.cCnt       = PING_PONG_CCNT;0 a7 L, ], |6 k' I# _3 n( i2 l
               
) z7 s. ?* @& ]! K                /* For AB-synchronized transfers, BCNTRLD is not used. */
. u8 z& d# Q/ e4 h- a) Q                paramSet.bCntReload = PING_PONG_BCNT;
& N- A6 O8 w+ V# X9 b7 U3 |+ v
2 [. R* J5 t5 k6 ?8 e2 b8 t                /* Src in constant mode Dest in INCR modes */
" u8 R, }, V: o7 I' ~                paramSet.opt &= 0xFFFFFFFDu;) B. V' H. G+ i6 p6 N1 t
                //paramSet.opt &= 0xFFFFFFFCu;- U7 w; {" {* y" C" k8 {5 @
                3 _3 J3 j; D/ b8 W4 e
                /* Program the TCC */
9 [9 g; r/ e* N8 \- |6 L                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 T6 Q* T1 Q8 N/ W& `

$ G" y( n8 }' @/ p* t  q                /* Enable Intermediate & Final transfer completion interrupt */( t5 l: |7 Z5 ^" l: L) [6 z9 S
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. Z/ L& d* W/ v' C; {
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ {: z$ w! Q7 l. S
; g% H5 V% D+ {4 e# a" e                /* AB Sync Transfer Mode */
" X: i0 P+ o, g% V2 }2 q2 @. A                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 [8 N# {4 P( |               
( T2 R4 Z9 l/ P& _! D. o. `                /* Program the source and dest addresses for master DMA channel */
. A2 _; m6 t) E3 Z4 [* x! T: G                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
$ @; b# _5 P7 W+ a) _2 x                paramSet.destAddr   = (uint32_t)(ping_buffer);9 u( j* y, s3 [! x: ]: M& r

+ ^% W, J# @& ]                /* Write to the master DMA channel first. */
& |8 D; n5 P4 \4 s0 i                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
1 R8 v1 P# N, @, V0 U    }      
! o+ S6 i( [# N7 S2 q1 f. a0 C, {) W( J7 \7 P
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
; _( {9 g1 k0 {; g4 V% [        8 l& m& y; I7 ~' P) ~5 r% w# D8 a
    if(result == EDMA3_DRV_SOK)   g5 o6 p4 h! N+ ]$ i) ?
    {
% {7 j; \# ?' Z6 a  k            print2arm("edma3 driver init success.",0);8 `# u) G3 r" F6 M) N
    } 8 ]3 Z# s! f+ @2 Y0 h( n7 C- D
}9 r2 X4 A; K1 u1 {" ~

2 A9 X% R+ j- \5 ?1 o3 D; C: f) n0 T3 m9 [' K
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. R# C9 E3 q1 D0 g7 L# ~. T4 B* j4 p! o) @7 `# Y+ ?, e/ F

3 ?& I( W* Q. n8 H
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 ~/ z# ^8 ^' Q每次DMA传输完成后都要再次使能传输
( F& ^' ]. v8 K5 [! O# O9 H  E
原来是这样,我明天去试试,谢谢了!




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