嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ K+ I" [  B' R3 Z; J5 i#define  PING_PONG_ACNT          1) }8 j  `, f3 m
#define  PING_PONG_BCNT          8*32*40
3 I) ?( N+ X/ B1 A//#define  PING_PONG_BCNT       1
% N0 I" Z: ]+ V! J( ]#define  PING_PONG_CCNT          11 b( U" K4 n" D# [6 b% z+ U
#define  MCASP_BASEADDR          0x01D000008 a) x% t3 L( z( O
#define  Mcasp_RXEVENTQUE        (0u)4 S0 x9 o. l$ i) X7 i

1 n# N! X8 b; U, @: p/* OPT Field specific defines */# m: e, q6 i/ f
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
5 X$ P2 t# ]% u* [; L#define OPT_TCC_MASK                        (0x0003F000u)3 {: X% l- _' Z/ ~6 T! w1 t; ?
#define OPT_TCC_SHIFT                       (0x0000000Cu)
2 m! w( S, G! }" a) D% Z#define OPT_ITCINTEN_SHIFT                  (0x00000015u)+ E% v) H8 f" d0 |+ W
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
: M, x5 w$ R9 w, Q- `, R
* w, K* O) [0 kchar ping_buffer[PING_PONG_BCNT];' O$ e  X  ]6 Z4 V
char pong_buffer[PING_PONG_BCNT];
' Y- \" D! ?( s* V0 {' {4 i# \; m5 G
6 _1 b$ M: }4 _& a" ?1 q, N9 \/ L" i: o- r- T

$ z) ]9 w) U' I1 Z; h- ^
; B% E2 _. I% F7 jstatic void ys_edma3_init()5 O  J4 D5 h' N' [# ^
{$ E/ G7 [& o0 Q9 m% o/ t- U, Z
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};0 v2 L6 o: k$ `8 d$ h
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 X2 |" Z# u8 R& _/ ^& M        EDMA3_DRV_Handle hEdma;& S- c7 g* I: ~" C2 J& e) n
    uint32_t chId   = 0;3 p3 x! [3 m% n# x
    uint32_t tcc    = 0;2 o* V- Z2 a- N$ ~& m

3 V- s3 ?7 r- t7 x+ p- [; _    print2arm("edma3 driver init...",0);  p, a# N9 W# I- A4 [3 ]5 p. y

1 h3 g8 J+ W' ~* `- ?8 e( l  v        hEdma = edma3init(0,&result);3 w( R6 |4 N) y# n  Z
        if(hEdma)1 V; q5 _8 D/ q# Z5 f
        {
3 ?( {- }6 Q' W                print2arm("edma3init() Passed.",0);
5 v" K' Q7 U  i4 l( t        }. {* M+ @' c, G( O% A! [- k" S1 G
        else
- Q1 E) `' l" K' m  W& n( @        {
4 `. a* L* j' F# s; E                print2arm("edma3init() Failed.",0);
4 H) F3 U9 ]- M, d        }7 W8 }, z9 v# l$ A
        8 ]4 Y1 j3 |( @1 B/ |% Z: |3 e# r
        if (result == EDMA3_DRV_SOK)2 T5 k$ o$ Q3 K
    {; c1 O1 G. V$ l) N
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," ?% |9 l8 r) D+ F# u
                                                       (EDMA3_RM_EventQueue)0,
4 d, J3 ?' ^: ^  f$ f/ [                                                            &edma3_isr, NULL);8 z' m; J3 g+ h: U- F2 b/ A% K
    }
+ M. J% l- A" O- b5 |  D        / o4 {% K+ c+ D" h
        if(result == EDMA3_DRV_SOK)
3 x* ~" I  K( d+ |$ N        {
: m, E' g0 B0 W: I                paramSet.srcBIdx    = 0;
% P0 K. T8 J* Z# }                paramSet.destBIdx   = 1;$ T1 m, _3 H& X% v
                paramSet.srcCIdx    = 0;
  g* y, L  E: h4 o                paramSet.destCIdx   = 0;
: h9 `% f+ O; Q                paramSet.aCnt       = PING_PONG_ACNT;$ B/ X( y; P) b8 J5 K+ g
                paramSet.bCnt       = PING_PONG_BCNT;- u2 P6 z! O- ?$ K$ ]6 K3 O2 w
                paramSet.cCnt       = PING_PONG_CCNT;# N9 O' a8 R0 ~  f& s  y4 \
                : S* F. e# Y5 e( {; t( [1 {
                /* For AB-synchronized transfers, BCNTRLD is not used. */
/ b+ l0 l/ `2 D6 |                paramSet.bCntReload = PING_PONG_BCNT;
6 f7 `, }, P' ~, `5 C2 |! |3 V& U& z" S8 |1 Y
                /* Src in constant mode Dest in INCR modes */8 S8 U" O1 \  t" s
                paramSet.opt &= 0xFFFFFFFDu;" o7 }3 C6 N3 L* r
                //paramSet.opt &= 0xFFFFFFFCu;  u' o  M7 b& ]. @9 z* M8 f6 k
                " w  l5 b- k& y$ X( C( }+ x2 z0 S& q6 d
                /* Program the TCC */
9 w' f1 H0 ^: J9 L2 q- {6 \# k                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);6 x% {: a- }. ]4 k: P
, l* H' d2 B0 v7 o# L! Z+ J: j0 H
                /* Enable Intermediate & Final transfer completion interrupt */
  H4 V5 s+ x, }+ ]: f9 q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 Q# q0 M; c! f; S3 N4 A' @  ~( ^                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) a, r% j9 c, a4 Z' w7 }5 s4 X5 J% |

1 c2 @% s! k2 x8 P                /* AB Sync Transfer Mode */
5 @9 n; f: X! U& {; ]- b                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  {3 v) Z' N* X2 |( _5 R/ r% q* e& [8 M               
' l$ q8 z& p8 m6 l4 z0 z( A                /* Program the source and dest addresses for master DMA channel */
& m$ F' _6 s1 R. r8 t, [5 k7 o                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);2 P" f8 o; w; @$ n0 y! A. ^
                paramSet.destAddr   = (uint32_t)(ping_buffer);
( \" y1 q  T# F& [8 m
* D+ f" j  ^2 L& e+ `                /* Write to the master DMA channel first. */
. K% o6 d) P4 ^3 d' R) q                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
" i/ a1 B0 W: l5 r7 a3 J+ Z    }      
& U# s& h% \$ c" e: U- d  Y8 K  f- R1 @6 F. w* h
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% Z# J* u* U5 i& X, ~& V% u3 r        ( q) u1 n5 V2 M7 \5 ~& q8 a9 c& J
    if(result == EDMA3_DRV_SOK) ' {0 P! v% q/ ]! o0 ~# r. F, E
    {
, i" C& q% a4 J6 v% V            print2arm("edma3 driver init success.",0);
) H+ N2 E9 s# g! j# r, t/ [/ R    } 5 w# j5 X8 F: D: s4 @
}
; g' f& h0 N9 L: J- n0 s
, r! ?. T4 ^  j. r7 v
5 X, Q' l) N" a0 ZEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* j) I& E. l* Q' t5 }

4 u4 k5 d+ V% \2 w/ n$ [- c4 b' B, T

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:478 N; [7 o- M' @  n
每次DMA传输完成后都要再次使能传输
# I! W" {% T, @3 E7 U
原来是这样,我明天去试试,谢谢了!




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