嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 n: |/ Y5 c# B7 c; p* k& x
#define  PING_PONG_ACNT          1
7 a0 P% S- S+ _$ P9 H#define  PING_PONG_BCNT          8*32*40 2 a$ A% V, e  ?4 O: `; E
//#define  PING_PONG_BCNT       1 # R: X' Q! A! B
#define  PING_PONG_CCNT          1
7 o3 z7 U! ~6 u3 X1 o#define  MCASP_BASEADDR          0x01D00000) G7 p/ e& o3 G" j1 t2 [; C
#define  Mcasp_RXEVENTQUE        (0u)
8 y, a8 s, |& O9 I+ e7 ~: d
" j  J+ D* o  E( i4 m. I/* OPT Field specific defines */
4 c8 p4 o' f( O! O#define OPT_SYNCDIM_SHIFT                   (0x00000002u)$ K& M) a" ~6 N! \
#define OPT_TCC_MASK                        (0x0003F000u)
! z2 q- v2 I& K9 m8 B6 M% m#define OPT_TCC_SHIFT                       (0x0000000Cu)
) i( z  R# `% C1 X  q#define OPT_ITCINTEN_SHIFT                  (0x00000015u): X$ D5 t" o1 O2 i3 s' G* H  k0 U
#define OPT_TCINTEN_SHIFT                   (0x00000014u)) v+ A/ u9 X  S. U
9 h: L) \3 c! K0 B+ I  m% P! u' K
char ping_buffer[PING_PONG_BCNT];
4 Y& K9 b4 D6 `" gchar pong_buffer[PING_PONG_BCNT];
8 K6 {* @% q9 C' m! U1 f$ F4 M9 A- m0 m2 Q( @7 m
: ~- P1 i% u& }
0 _; \9 d; ]. M, `- g
" z( }5 U! ]% ~* v1 L- B
static void ys_edma3_init()1 f) D: d! X% D/ F
{5 u, }, O% G) `
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};2 _1 [0 O4 q# o, N( \" K# f
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 h2 U) h# V. u1 k! z( k1 I        EDMA3_DRV_Handle hEdma;
' Q5 d3 `" w; K2 @, J1 x    uint32_t chId   = 0;; Y2 F0 T# Q; j1 G9 z' s! [3 V
    uint32_t tcc    = 0;/ C  Q& S8 N; f& o: |" p

3 {( X0 `7 q& E4 b/ j    print2arm("edma3 driver init...",0);5 ]  t( D: T: o) \
8 Z: }% ^/ o3 r/ q
        hEdma = edma3init(0,&result);
7 a  D0 o6 R' E& Z        if(hEdma)
% k. V: S3 J- w% r8 m        {
' t, H0 m* t1 M9 x                print2arm("edma3init() Passed.",0);
0 q1 s& V$ r. v2 [& U  y( a        }
3 p3 y6 U+ M" }& C4 t! P! T; [        else
. P, C* A" G$ ~; Y        {- A- i' f0 G7 y2 x
                print2arm("edma3init() Failed.",0);
  k3 M! u# Z9 W0 Y; w) X) l- O, U        }
; M- O7 Q5 X) Z  s5 v( j, Q        $ Q2 |" G1 [2 y  n7 [9 A6 K3 {5 {8 I  C
        if (result == EDMA3_DRV_SOK)
4 ]8 `+ ]% Q5 l/ U; u) j% Q    {/ g: L; v  M/ l" a
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,' n3 ~+ z, k. ~( H8 m
                                                       (EDMA3_RM_EventQueue)0,
& x& X# h' B* b6 Q$ Q0 |9 ?5 ]7 Z' [                                                            &edma3_isr, NULL);2 V! ]+ {4 L/ j
    }
) u$ {  S& r; B0 C: k" y' P: F7 H& B       
5 Q( r# C4 d3 ^        if(result == EDMA3_DRV_SOK)
5 C* D( g& C! O. o- ^        {
+ ?) T" L# y; ^" x# X& U1 Q                paramSet.srcBIdx    = 0;
5 A9 t' F% p1 x) F' r                paramSet.destBIdx   = 1;& e" }* R1 J" r6 F1 K0 l
                paramSet.srcCIdx    = 0;
' E; h2 r, k! H* o                paramSet.destCIdx   = 0;9 p+ F  [+ \3 V
                paramSet.aCnt       = PING_PONG_ACNT;) C( }5 M9 ^, Q
                paramSet.bCnt       = PING_PONG_BCNT;$ E$ D4 ~7 ^+ K* v% C0 t
                paramSet.cCnt       = PING_PONG_CCNT;
+ M+ n# u& g+ J" W2 i                - v+ }3 E  F) k
                /* For AB-synchronized transfers, BCNTRLD is not used. */5 O; i' x1 u. E; b. C
                paramSet.bCntReload = PING_PONG_BCNT;, H( n" g% z+ v- ~

* H# {" T; u8 A3 {0 U" V                /* Src in constant mode Dest in INCR modes */
6 A3 c0 A- A2 q                paramSet.opt &= 0xFFFFFFFDu;7 s( J$ i5 K/ u9 j
                //paramSet.opt &= 0xFFFFFFFCu;
9 x  y: j  @6 _3 W- q# I- D               
& ^2 B( d& R& C9 J0 H, @+ [                /* Program the TCC */4 v1 A- A9 h9 z0 z$ O( t- u% u
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ z3 ~/ V3 d1 ]) x. k( h: @/ @; I" {7 B& z4 l
                /* Enable Intermediate & Final transfer completion interrupt */6 ^0 I: U) @  w9 P. ?3 M% W
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 n2 @# j4 z  t' m1 s, D                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);2 V: Z9 S1 t0 o1 y% U( a" I4 b

- J! i) f& J: i: P! {2 i! g                /* AB Sync Transfer Mode */
1 G* K5 B: U0 `( R3 S                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);  X5 @. _6 M' @
                ( J% Y3 M% p0 q+ @( `% r+ C. a
                /* Program the source and dest addresses for master DMA channel */
6 \5 c, T, [' a: w8 y                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
. H( w% ^7 H! x5 G                paramSet.destAddr   = (uint32_t)(ping_buffer);
! ?6 B- n' y" u) s& [7 w# n7 O4 _/ i: B: v* i
                /* Write to the master DMA channel first. */! z5 d" t7 K# q, s, A0 }& K' P
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
" j9 D+ N0 D, a! W$ M- a    }       1 T5 F8 B2 u9 r- {  t7 j9 i" T

1 ~4 X& J8 m4 j9 i        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);$ Z' }. ?! b" g9 n- \
       
* n; s$ I  G2 o- h( R: O    if(result == EDMA3_DRV_SOK) * n: e, M9 i) ^9 |: D5 X2 j
    {
, g+ M" ?' U3 j8 k! A; l            print2arm("edma3 driver init success.",0);9 f  w6 a" a' X/ g0 ?
    } & o6 F) ]4 }4 V5 N3 x4 {
}$ d8 ]3 t' V. D* @! V
$ E1 k$ ]% I- w" R4 A) M6 O

+ ]0 |( g. n: C! J2 ?1 Q% XEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) ~- A* Z/ k$ c& Z: d- U% X- e

& v( F% n) s( S, s# x2 H, t2 B7 _+ h/ P6 y  h5 T1 l2 f2 X% ~: ?# B

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% z9 `6 C9 [) ]7 T! k0 K2 g每次DMA传输完成后都要再次使能传输

8 E' R5 m3 @: V& i& E" ?/ N原来是这样,我明天去试试,谢谢了!




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