嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) s+ F& e, T$ L9 X) I( }7 C1 f: b#define  PING_PONG_ACNT          1
; I* `7 [' P; f# O#define  PING_PONG_BCNT          8*32*40 7 A4 K; R0 P, w0 P  T1 U
//#define  PING_PONG_BCNT       1
0 ?' X7 Q4 }0 g! `' T6 r#define  PING_PONG_CCNT          1& N6 F8 D) G! ^9 e
#define  MCASP_BASEADDR          0x01D00000; a, x" @0 S4 m( h8 j0 _! c6 m
#define  Mcasp_RXEVENTQUE        (0u)
  p1 a4 ]: h% J# Z) X% u9 \6 @% a* ]( \  T9 ]0 b, J( r
/* OPT Field specific defines */
0 O# p' T* m7 T% y3 Y0 E) \" a#define OPT_SYNCDIM_SHIFT                   (0x00000002u)' e+ O, H8 ]6 |- y' V
#define OPT_TCC_MASK                        (0x0003F000u)
9 {5 z# X& |" d#define OPT_TCC_SHIFT                       (0x0000000Cu), {5 E& _# m/ n& f# l
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
) G1 R+ j2 m1 v5 j#define OPT_TCINTEN_SHIFT                   (0x00000014u)
9 N& e6 S% V  b" s/ k4 e$ b  V5 N" S- u+ ~6 l
char ping_buffer[PING_PONG_BCNT];
& W% C4 A1 Y( E7 F7 w8 i& ychar pong_buffer[PING_PONG_BCNT];
1 A. C1 p  b9 j7 f* S; u
# ]  n' i& O; J: L2 P2 ~1 P- u( k( }7 j

; \% ]! t* k8 {) K4 Y- N6 O1 F4 Y2 D; }! @; h
static void ys_edma3_init()9 I* C2 S  ]: _# Q
{
/ `8 ~9 N- T5 p2 S& [* c- ~; E5 Y        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& M2 d+ ^' m, V/ \3 s( N5 I; z
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. u; ]. v0 h) }; J        EDMA3_DRV_Handle hEdma;
; {6 [; {1 N# s, O    uint32_t chId   = 0;7 s1 ]  C+ ~0 t7 @% `
    uint32_t tcc    = 0;
! W6 G& P; Q; T# D; R# g1 t4 o7 ?/ U& P3 m7 R; X9 H
    print2arm("edma3 driver init...",0);3 O' M5 v. D8 T5 p7 q

# |7 g3 @/ ]  }) ~& W        hEdma = edma3init(0,&result);: D' b5 F) j% |* h" p5 p
        if(hEdma)
+ h, ?# {; E' _) M# J' C- |        {8 d9 F1 Q1 j7 l: Q0 R+ @5 E
                print2arm("edma3init() Passed.",0);5 g* u& k' N* }+ U8 ~1 j8 C- J
        }% O& v1 \5 Y& h+ D/ ~/ p
        else
5 z4 `& c) J. q6 p6 X        {7 L" R4 j- d% Y. A4 P
                print2arm("edma3init() Failed.",0);
; U+ @2 f( E' c& y! M/ `! g        }
5 x5 N) ^0 D; m7 |- {       
+ S: {+ q9 c" T% J: D- F        if (result == EDMA3_DRV_SOK)
/ t3 ]0 I2 A, E    {
. j; h' M0 G3 b( Q# w5 M                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! G9 U* V' g2 ]                                                       (EDMA3_RM_EventQueue)0,
' K! A/ E  b4 t, W2 l5 p1 Q                                                            &edma3_isr, NULL);6 q2 `2 i- `' c
    }! x9 S+ |) n: j/ o, k/ p
       
3 R+ w2 t3 ~- ~, f/ \7 C- `$ z        if(result == EDMA3_DRV_SOK); I3 ~5 y# \" \6 {% g* ?9 u) w
        {3 K" d6 s% T7 ~1 e
                paramSet.srcBIdx    = 0;) [5 f( V' C9 U% {' \1 R' n
                paramSet.destBIdx   = 1;
  v  l' z1 _) u2 [                paramSet.srcCIdx    = 0;
$ n; M* X, P. _                paramSet.destCIdx   = 0;
9 h' p7 i  |$ ~" {9 L4 ^1 i8 a                paramSet.aCnt       = PING_PONG_ACNT;7 X/ M9 T* N# ~+ Z8 ?! a
                paramSet.bCnt       = PING_PONG_BCNT;* t. O* p* b4 t
                paramSet.cCnt       = PING_PONG_CCNT;& O6 ]* L5 O" |* r2 ^. V! u
               
# {& }$ D5 J' }; T" @( }* Z5 Q                /* For AB-synchronized transfers, BCNTRLD is not used. */
! _8 \' ?9 ]8 b2 n7 Q                paramSet.bCntReload = PING_PONG_BCNT;
+ h1 t8 N- W& L' E) t3 e- \; b. R( C. J2 J2 ]/ L
                /* Src in constant mode Dest in INCR modes */) u- l" }8 ~1 V7 w0 a
                paramSet.opt &= 0xFFFFFFFDu;
( y! p) t2 j! K0 p. d1 B2 P                //paramSet.opt &= 0xFFFFFFFCu;4 F0 [0 k- |% r/ W
               
, K9 }7 l  O# W" Q6 z& `- e2 C6 [                /* Program the TCC */
' s. u3 |7 o3 ~( g! X4 B4 b, r4 n                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);$ @! U4 G1 s+ Z- `1 d: G
% u! B$ w/ f: H! N
                /* Enable Intermediate & Final transfer completion interrupt */9 P0 p. @" G. g% t0 P( `6 F: B  C( S
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 V. q5 }# V7 m  H: h0 `9 v. b                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, ^3 G% F( D2 [6 B' Q- @! ~( m! L/ u1 m0 V  r% M
                /* AB Sync Transfer Mode */
7 A4 E. o# r+ d9 O                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 l% o' b* F* Q5 {6 V
                / c# S% G; S$ N. {8 C
                /* Program the source and dest addresses for master DMA channel */
" {, H1 C1 a/ [4 ^1 [! k$ S0 s                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);. T- J- a; f) }/ j6 X3 v
                paramSet.destAddr   = (uint32_t)(ping_buffer);0 d  r( g7 g; ]4 ?4 i# D: O8 y
5 z8 S+ ~7 k6 T/ c) |# k0 \
                /* Write to the master DMA channel first. */, `& ]. B8 ]& V- L# i6 r# d
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 i' R  }7 E7 n3 i# k& k. P    }      
8 l0 G5 Q" Y9 {$ f$ Z  D  p
- R$ F& R0 S3 V- E* o5 J+ t% a2 \# G% m        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ ^4 A' Y3 y" T$ T# k8 T4 b
       
/ v4 v3 Q/ G# b& ^9 q    if(result == EDMA3_DRV_SOK) 0 x; w0 ]4 C, O8 R
    {
; A: ^0 [0 C" r            print2arm("edma3 driver init success.",0);
- o: I6 {; E8 [; Z    } ; P' O2 ^6 o$ f% Z! b9 R
}. i0 {0 H3 f& B0 |1 G9 J) F( [" F

, D9 m# S- A2 j/ e2 I1 j- d  D8 v
& B4 j; p7 _; @3 L, MEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' a. M$ k2 x9 k* Y5 x8 s2 p6 l5 \7 R6 @, {4 D! E0 C2 ~1 ?3 n' i

9 ]) S2 G# M: G  K# I
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. v- r  h9 ~$ ?6 n2 Y0 n1 I* x每次DMA传输完成后都要再次使能传输
* y3 \' ~* ~# G  f& b! T
原来是这样,我明天去试试,谢谢了!




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