嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 `& H0 E* a* }* `#define  PING_PONG_ACNT          1
% z  [7 o3 j8 `#define  PING_PONG_BCNT          8*32*40
* h+ ?" b9 Q: v( n7 N//#define  PING_PONG_BCNT       1
. w  r! S8 I; H1 s$ a9 q- }+ h#define  PING_PONG_CCNT          1
. ~' M* |! Y5 o) Q9 ?' c#define  MCASP_BASEADDR          0x01D00000
8 m3 v" C! [7 U3 @1 W; {#define  Mcasp_RXEVENTQUE        (0u)7 a" c$ t8 W7 M# Y/ G
) ^5 n# z: e! e: w2 I$ ^
/* OPT Field specific defines */1 Y6 g1 D5 Y( [
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' ^' K, d" ]3 b0 G& T5 r2 x#define OPT_TCC_MASK                        (0x0003F000u)$ s* |# `1 W- e5 b% |) i
#define OPT_TCC_SHIFT                       (0x0000000Cu)
& X! O3 z$ a, K+ u9 {* n& R#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
  ]# z6 k  U9 A. ?7 h, q#define OPT_TCINTEN_SHIFT                   (0x00000014u)
6 Z3 R  _9 ?/ V$ d% Y0 P/ ^- [! F/ J& c8 m& L3 q$ ?# P
char ping_buffer[PING_PONG_BCNT];( f; |. `- k% G: z
char pong_buffer[PING_PONG_BCNT];2 O) w. A2 b* R* S

/ z" H0 F- ~) |& {$ R
7 K6 @$ y' m' J4 R+ I- c+ U
0 q; U4 c0 m) N3 Y- Z! }+ d# L0 h( o  S& c: @- g( j
static void ys_edma3_init()
) W5 b' M1 ?- l( ~* C  o{  M" Z# I/ H' c( q" f
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& P' {4 G0 f" l4 G0 D        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ C0 H* y' C9 L& I4 B5 z        EDMA3_DRV_Handle hEdma;- Z. U) G$ u& N$ a7 h
    uint32_t chId   = 0;4 C1 h. p9 C& p
    uint32_t tcc    = 0;, T5 Z" V7 Y$ m- ]) x9 x8 |
, U2 _6 p! u. x- I5 B
    print2arm("edma3 driver init...",0);
  A6 o, `: ]1 g9 s0 t) w  o$ s* x/ F
        hEdma = edma3init(0,&result);9 H, c' ]1 I7 X- ?# ?4 a( {* p7 F* ~
        if(hEdma)3 L% d' T2 K1 Q1 {
        {
2 |8 P! c% l# z( o$ r" i9 }                print2arm("edma3init() Passed.",0);
0 j$ O8 P: [  P5 ]! V8 W. \        }
9 B2 p6 j" k  Q/ `1 o8 _        else5 x' b; Q: n6 U9 Q
        {) K& g& v. x' u1 K: S5 }
                print2arm("edma3init() Failed.",0);
, q: @. r* B. U3 X- |5 f9 k8 `1 M        }
' S9 t! i6 Y3 ^' S       
" T9 F7 O& g8 H/ X+ Z. T        if (result == EDMA3_DRV_SOK)
( p% F' R1 c7 i- M- |0 l/ f7 t    {2 i* e9 v" W7 f3 d2 _) i
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% H+ s5 }% C# s3 K; W) i: R! N# B0 _
                                                       (EDMA3_RM_EventQueue)0,# e7 K; W; E9 i1 B3 a9 Q
                                                            &edma3_isr, NULL);2 X% m8 |( ~  W: |
    }$ T' K! O7 Y0 V+ v; f7 p* }/ x4 N1 _
       
: [* f  j7 k( }/ @8 x; H        if(result == EDMA3_DRV_SOK)
$ A8 W. C& ]+ M, n5 |6 X        {
$ v, m8 f) d1 f# i+ P( D1 b5 W( b                paramSet.srcBIdx    = 0;# x0 o2 s1 v. e; F, e  s, S
                paramSet.destBIdx   = 1;
6 ]. T1 s; N/ I1 e6 F  f# A                paramSet.srcCIdx    = 0;. a4 g7 U* o: _% n" @
                paramSet.destCIdx   = 0;
" Q3 L3 E; B6 i4 }3 D+ N                paramSet.aCnt       = PING_PONG_ACNT;% n6 ^* X' F0 P- V
                paramSet.bCnt       = PING_PONG_BCNT;1 \* n+ X; e: I# p! f
                paramSet.cCnt       = PING_PONG_CCNT;7 f9 N. ?  S+ ]( d. c# s" ?4 U
                / r5 u* k& F! p; Y4 `5 T* d/ r& f
                /* For AB-synchronized transfers, BCNTRLD is not used. */6 H3 c  L7 J) S7 ?! A) b
                paramSet.bCntReload = PING_PONG_BCNT;
% Y5 E! A0 w" m; c& `
0 K6 W. r% {# A1 [% [1 R: k                /* Src in constant mode Dest in INCR modes */' A0 Z, a9 H+ u& h& G5 Q. A+ E2 O
                paramSet.opt &= 0xFFFFFFFDu;5 d! q# m/ T8 ^* r  k
                //paramSet.opt &= 0xFFFFFFFCu;- ?- [' B& s/ ^2 ?5 g9 Y+ H/ o
               
3 l: u- X. w+ y+ l/ H" K: v                /* Program the TCC */
* A; b- V9 B% I0 X8 l' g                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);; O1 k0 e9 a9 R9 F8 S* r

' h' |& \7 f8 B% u4 `$ H                /* Enable Intermediate & Final transfer completion interrupt */& D# Z& E, j( J4 V
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' K* [3 B$ I6 g4 s% g# l/ ]8 u
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- O& X2 P+ q1 V

5 S, ?2 k0 z. S6 W2 k% R' e                /* AB Sync Transfer Mode */
5 O/ N8 W) Q7 R2 V                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 `& |7 ~. ]: O                $ l. S, k/ m/ I1 |; {- K
                /* Program the source and dest addresses for master DMA channel */4 n1 t0 Z- C# t, A: k% L0 |
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
- W0 j$ n1 M$ s; }+ t$ D                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 F$ S8 v8 A7 K" D; W. a, J! J* J0 k9 q4 ~/ P
                /* Write to the master DMA channel first. */; L6 ?0 O- g4 x5 u: N0 F/ h6 \/ q7 q
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
5 k0 I1 M. S2 R3 c    }      
2 z& h  T( y: D! G) ?
5 {" a2 P; v8 g$ M5 ]& N/ @/ b        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* o1 n" f7 t( _5 S0 K5 Q" g        ' }2 f- l6 P' s0 |7 U" n7 g! D4 q  X
    if(result == EDMA3_DRV_SOK) " ?" y: F& B% U* T
    {
9 k/ w! A3 q( O/ i* F: G            print2arm("edma3 driver init success.",0);
- k( [, d  k9 W3 }2 w    }
) i  k3 \% Q# Y}; V6 {7 x2 b, d/ v

8 A& L/ k- D9 ~& x# c, p( f
7 c( u# d: e) s  d" s7 M4 D& P" VEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 W6 b' }3 S8 j* [; P: d

6 O( u/ W" ^0 ?; U3 Q& G
  E/ K/ ~+ j: N$ D$ D2 \2 A
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47# C7 e% G  |6 P, W( r9 W# G
每次DMA传输完成后都要再次使能传输

/ O$ Y$ ^' d3 C3 h; |. J; Y原来是这样,我明天去试试,谢谢了!




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