嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, F+ l% @; u& h#define  PING_PONG_ACNT          1
# @7 B% z  v+ S#define  PING_PONG_BCNT          8*32*40 0 E% T- K$ o) l4 X5 D% U! Z
//#define  PING_PONG_BCNT       1
2 N' g6 S& \/ L  g#define  PING_PONG_CCNT          1* x% _, a, I5 E5 s- v1 D
#define  MCASP_BASEADDR          0x01D000000 }) M: L4 P$ t; w$ e7 n
#define  Mcasp_RXEVENTQUE        (0u)+ Y0 e" K' X4 |

" }/ i. l9 s* @4 Z* a/* OPT Field specific defines */, _$ w4 Q7 b5 {" K4 n% j
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
( [: S0 R3 x; n; }/ \#define OPT_TCC_MASK                        (0x0003F000u)4 b1 J9 L% `( X  k% M
#define OPT_TCC_SHIFT                       (0x0000000Cu)' F+ G8 C1 F; i! e* J7 o& a1 }$ ?% N
#define OPT_ITCINTEN_SHIFT                  (0x00000015u), S& F. t, B8 s
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
; H+ H. Z( [/ b4 |! G7 m- s( X2 E: e$ C. N$ V9 f# i2 c
char ping_buffer[PING_PONG_BCNT];
! E& Z1 n1 @; U6 ?  \  schar pong_buffer[PING_PONG_BCNT];
" Z7 J# D' x/ g# i  P# q; g4 X2 x* ^

" t6 \  x% I0 S: g1 W( X2 `; o7 k" E8 B# O* Q5 p6 M- K

6 P6 `6 T$ [4 t' z2 fstatic void ys_edma3_init()
5 Y" N, _/ y8 M! o+ {% U9 x$ |0 r{
0 z" O8 y: ]( o1 A- f0 A8 M; ?        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 }8 z" R3 Z7 J2 B
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ e' P4 m7 u, h4 r0 D* h2 F. g0 H6 b        EDMA3_DRV_Handle hEdma;
) b' u. ?: c( P6 N7 c) [) _    uint32_t chId   = 0;
& X0 t+ ~2 x3 o4 O" ]    uint32_t tcc    = 0;; ^. d5 O! b3 F$ P' ~6 Y3 u* X, B$ h
" e' T0 j4 c# W, J2 F
    print2arm("edma3 driver init...",0);5 m2 x0 o1 ~8 U

" y: z4 q) l+ y6 Z+ {0 [2 S        hEdma = edma3init(0,&result);
/ r. d0 D) H/ I3 m% _0 c+ x        if(hEdma)
* Y2 y1 u, q9 @4 i5 p2 Z  r        {; X" g  ~" X$ W7 ]  d( U
                print2arm("edma3init() Passed.",0);0 A* T: s% V# L& c
        }5 S! b: U8 K' l* S( ?# e0 j1 k
        else' V( p; s* U% f, e( J% g( ^
        {, |" \! K5 d4 N2 _4 S- C" y
                print2arm("edma3init() Failed.",0);
1 U3 j3 z+ v0 {5 q        }* ?* \1 S1 F0 ]
       
, K  W. f: i+ e) t/ e$ P; V        if (result == EDMA3_DRV_SOK)
3 J( `! _) u2 f% s% x8 |    {
& s, W' h' H% U7 @                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 M9 F: \  V5 x
                                                       (EDMA3_RM_EventQueue)0,
; I* }8 I+ P# {; L2 `                                                            &edma3_isr, NULL);1 ~0 g" R  Q. J2 e) d
    }5 C' \0 m" y7 a9 w0 t- x8 s+ F- q( z0 }
       
  h- A0 n3 j. W" ^7 S        if(result == EDMA3_DRV_SOK)
9 A8 H6 @) o. R; }        {
7 ?9 n4 O$ k- n. B" u! V                paramSet.srcBIdx    = 0;0 A3 T6 M3 H& S
                paramSet.destBIdx   = 1;2 I% G4 N" y$ H) E
                paramSet.srcCIdx    = 0;
$ B2 f8 e5 Y) {: ^" F  d                paramSet.destCIdx   = 0;
* B& I/ B3 e6 e4 _+ X( R, l                paramSet.aCnt       = PING_PONG_ACNT;0 O8 w3 f3 _1 W8 p% k0 Y
                paramSet.bCnt       = PING_PONG_BCNT;
3 x4 }% C- w4 o+ Y* C                paramSet.cCnt       = PING_PONG_CCNT;
7 Y' `) b6 v1 W. ~" `# {; U5 N                5 \  D# R* W0 c9 T! p2 [4 z. I
                /* For AB-synchronized transfers, BCNTRLD is not used. */- f! K2 Y. C& }- q
                paramSet.bCntReload = PING_PONG_BCNT;/ k; }* _2 ]+ \& `

. l  c$ j, c0 e. ^                /* Src in constant mode Dest in INCR modes */6 |6 H* n+ `2 u) I7 l2 W2 I3 L
                paramSet.opt &= 0xFFFFFFFDu;
5 T4 n$ h9 b, d8 f: B                //paramSet.opt &= 0xFFFFFFFCu;
8 P9 P0 R; H' E& h7 G               
" \! V7 d, ]3 E( U6 A                /* Program the TCC */
' z% p3 b0 q* M' w; L( g, M. U% k                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ k. `7 ^  {" B2 |* N# Q" n
+ f8 C# d: E) r                /* Enable Intermediate & Final transfer completion interrupt */
; _$ p& c# m- l) K0 d/ j                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& I7 N$ O7 {. P- s4 U, O                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 F5 ]3 f; x8 z7 q$ e7 Q. Y  R$ W
  l, Q) G5 h* {% V/ b- W8 ~
                /* AB Sync Transfer Mode */' U: E+ r# T/ P$ _; g& `5 T
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 L+ o/ o1 x" ~, S3 v               
2 S$ x1 K0 b) O* R/ M* z6 O                /* Program the source and dest addresses for master DMA channel */
: x: }, J8 @$ T) T( W0 L) T                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
) W! l* F& U, t+ n" @% x                paramSet.destAddr   = (uint32_t)(ping_buffer);& ?( k0 K* e+ l$ M* k
6 l( r" [& I/ f& C3 K$ c' Y! ~
                /* Write to the master DMA channel first. */' ]5 i% R% u$ e/ y! M  R
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- m5 ~* c" _8 `' N* R
    }      
9 i# J8 h  }* N  k$ O  \' V" Z' ]  B( K0 a$ E9 {3 e- p
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' z( }9 U6 Y- @& `# ]       
( ]# H9 S) a* L, }    if(result == EDMA3_DRV_SOK)
" p3 L; Y4 d1 N3 M    {( q$ n4 c7 ]( F6 g- b0 L" M
            print2arm("edma3 driver init success.",0);
! k) `, o6 E- S    } 7 _3 S+ E* x! B5 i" @# k% q2 X
}4 `7 k9 k2 x7 f. _
: H5 H7 ?% f/ N% o  r1 Q) J9 z' x: p
5 w! c  X8 A" C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: p  Z$ m9 |/ f7 D6 A4 i- x2 W: g+ [" _: R

( J$ i# f; A5 h* O
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 S8 e0 R1 E2 z' ^4 J( P* r& Z每次DMA传输完成后都要再次使能传输
" [* Z6 H' o. y
原来是这样,我明天去试试,谢谢了!




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