嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ d6 G' s' s1 Y' h$ N8 A/ s
#define  PING_PONG_ACNT          1
3 _% f' p: h, I$ j# ]; l* I#define  PING_PONG_BCNT          8*32*40 / q' L; Z2 V/ ]+ u" O
//#define  PING_PONG_BCNT       1 # D% `+ ]# a7 [" a
#define  PING_PONG_CCNT          18 P$ `9 t, o: X5 {8 \
#define  MCASP_BASEADDR          0x01D00000
6 @; p: q( N0 T# R; }7 O* k0 n#define  Mcasp_RXEVENTQUE        (0u)
4 t. K/ U" k1 O; I6 ~
: Z; U  H& Q6 t1 h* {- ~! t! A/* OPT Field specific defines */
3 b1 H' e4 Z& I2 x3 v+ c' T#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' K1 A1 h  T- u1 U5 b+ F#define OPT_TCC_MASK                        (0x0003F000u)
" \8 Z+ s9 g/ u#define OPT_TCC_SHIFT                       (0x0000000Cu)4 h% `0 k$ {; L9 X7 N# \  P$ P' I- [
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)$ T2 L+ q+ q9 U. h. \' b8 w
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ a  \5 P: }) u$ D( l: k( @& j2 s8 k; _0 e4 E6 w) M7 J7 J" h
char ping_buffer[PING_PONG_BCNT];
5 m  A% ]' Q, D; l" v7 j# J# rchar pong_buffer[PING_PONG_BCNT];
/ M+ \/ v3 R3 j3 Q+ [7 q1 l, R  i  F8 }

, B5 ?% g8 q1 H; D. H& |5 g# r- |$ B8 [: @" {$ K% i3 [

8 d; U6 b- r8 M) E- a( `static void ys_edma3_init()& J4 O) ~" ~2 Z7 C% l* v3 W
{0 m% g/ z/ o, E1 m  {: x
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! F6 P0 e, N( B
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 ~1 w8 Z; J3 B; N3 Z$ Y        EDMA3_DRV_Handle hEdma;
/ e8 s: A3 w) x* C4 e    uint32_t chId   = 0;9 n5 N/ u. M1 Z; y
    uint32_t tcc    = 0;! B7 b% ~& S; y. ?# j; E+ h- A

4 N' T; K1 r' F, E( a2 a    print2arm("edma3 driver init...",0);# I! z) S1 m6 I7 H& E' K
& M7 Q  P& W* _/ f4 Q, P1 P6 p
        hEdma = edma3init(0,&result);
' Q8 N* @6 g* Q& a, l9 U4 t) J        if(hEdma)# A' H, I" O3 `$ d8 e
        {
- C. |7 S* P' T' b                print2arm("edma3init() Passed.",0);
' \8 j( ~7 w. F9 b% S5 F1 V        }+ G$ I* O' T3 h
        else
% n/ I: z: K# O" r* c! d! S7 [4 N        {- E7 b5 G1 V+ A
                print2arm("edma3init() Failed.",0);
. `& z- O$ q) B; M1 ^2 L5 p        }
1 |& T- O0 D  {( O/ w# y* D  s4 I: A2 L        $ a2 I  H& u- l* S% Y
        if (result == EDMA3_DRV_SOK)
; @  l6 j' H8 d, y/ p- @    {
* N. m0 z4 @, X* e/ w- L% r                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,2 B2 [% Y* j" _) z3 N
                                                       (EDMA3_RM_EventQueue)0,6 C9 \( p6 Z$ [$ p& y0 L
                                                            &edma3_isr, NULL);
, J1 [7 |) F0 o$ ~: l3 L" q% D    }0 H: A  D4 Z; i  ]) B
        ) E% ]/ S  Y% b9 ~
        if(result == EDMA3_DRV_SOK)
! |) `/ y; \% N, x% V. p5 n6 x. z        {
% k" B' v' j- K: C/ G                paramSet.srcBIdx    = 0;
) L* l2 z+ C$ X. `  A                paramSet.destBIdx   = 1;
7 a; z5 _$ ~9 s  ~, H                paramSet.srcCIdx    = 0;
0 j+ e% U( j3 ^                paramSet.destCIdx   = 0;/ s& p8 m  J5 b4 J
                paramSet.aCnt       = PING_PONG_ACNT;
7 J6 M( u- }0 O* \; x                paramSet.bCnt       = PING_PONG_BCNT;
0 @, C% {9 d6 w- h) b$ F- M$ ^; {7 t                paramSet.cCnt       = PING_PONG_CCNT;1 C4 R  w/ I. @
               
5 g9 g3 M, j1 c  T                /* For AB-synchronized transfers, BCNTRLD is not used. */; D8 m% j( r9 s) \
                paramSet.bCntReload = PING_PONG_BCNT;
0 `1 S4 X2 L% q4 U+ q# ]4 l! j8 ?, {( H
                /* Src in constant mode Dest in INCR modes */* Z- z0 t: p+ G) r$ b4 m" H: N
                paramSet.opt &= 0xFFFFFFFDu;5 R. a4 Y. i! ~* W5 S# q3 m" @+ V4 g
                //paramSet.opt &= 0xFFFFFFFCu;
" b9 H; X9 ?% S+ P" X               
" A8 m6 [: G  S* c3 p                /* Program the TCC */( ?7 A& x2 \8 A: T4 E
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);5 n' _" K+ t( X* b6 ?% v# e
$ D' a4 N) _6 l% P. l. q8 D# `1 a
                /* Enable Intermediate & Final transfer completion interrupt */! m0 L' o; }2 e6 @: F
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);- a4 T' w0 a- H* n
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);; @; S' U4 Q/ B7 y( D
2 C2 B( q1 b* j" |+ X
                /* AB Sync Transfer Mode */
$ M& ~: N8 L. L$ j3 N- O0 l                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);% Y, j( X$ F  h  I5 I
               
. Q  m7 W% M$ O3 @2 ~1 |                /* Program the source and dest addresses for master DMA channel */
4 z* k9 o, `2 ?+ s' Y" F# e" n1 v                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; G2 u! z& g+ v# D4 D. X
                paramSet.destAddr   = (uint32_t)(ping_buffer);
6 N$ D& v! P1 A$ @  _1 J! V# G6 H: H. b) Y- Y8 u; G- s2 R0 ~; U
                /* Write to the master DMA channel first. */, u  d) M1 G& {! F
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);$ h! v( W: }* E- i* R% W& p* P# K
    }       / S" v% K3 z) h$ b- R
* p1 g7 b8 c; [; {
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
  p1 P% g  n* {; M8 w) l       
" f! s( Q& o, N5 A" P, B    if(result == EDMA3_DRV_SOK) 7 O) r- @# F' X+ |  k7 A
    {* J7 F7 Y! X. H
            print2arm("edma3 driver init success.",0);
: _* z, ]) [: m2 X, w& S7 ?    }
$ {% b" x, @7 `2 h2 _}
2 N9 u- K1 o# I' p9 ?5 _/ k1 i) C7 v+ Y& L- z- v3 n( h
* A+ o8 b$ `3 m; s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。  \$ N& o$ N9 C

! W+ T  P2 c% Y* R+ d4 S
! g# f, N& x5 w$ T: f4 [: e
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:471 i; Q' E$ C% m: \0 {
每次DMA传输完成后都要再次使能传输

8 p$ f" [2 |% H1 [6 H4 Y- r$ c, H/ d原来是这样,我明天去试试,谢谢了!




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