嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:) I4 z' M. t/ x* [$ F, M
#define  PING_PONG_ACNT          1
! d6 m4 ]0 J1 @. Q/ A' y9 u4 ^#define  PING_PONG_BCNT          8*32*40 8 z8 d7 r( \5 K! F( j: T3 {
//#define  PING_PONG_BCNT       1 ( e1 o: p& U% |/ X
#define  PING_PONG_CCNT          19 R6 T# U; F4 I  f2 a  S* @
#define  MCASP_BASEADDR          0x01D00000. l! c2 _6 K1 ?* X% S" ~3 u
#define  Mcasp_RXEVENTQUE        (0u)
5 `6 {' K: i8 n9 Z! z+ R; S
/ X" p! Q( H$ J' k/* OPT Field specific defines */: d5 S$ A- s3 B0 [9 B/ w
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
$ N- f. }9 H/ i9 [. u/ R#define OPT_TCC_MASK                        (0x0003F000u)
& ^- }: G4 b# V* k& y8 V% c#define OPT_TCC_SHIFT                       (0x0000000Cu)% s. w' t6 R) j& Y' q$ I& v# P7 \
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 ^( H2 `3 }+ i# I7 s& ?
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
4 u' Y& A! y0 Z7 e' c
/ J/ R. N# X; }/ r* J+ Zchar ping_buffer[PING_PONG_BCNT];: T" K+ R  _1 Z4 [' M( N: n
char pong_buffer[PING_PONG_BCNT];4 W; E' J2 v* @- l

" o9 A& j) i% V9 v; V( e1 X/ L
7 i! D  z% i2 a8 Q+ ^5 M: j2 m" ^  e% p  a# F

# W5 H7 g( N, X- S! Tstatic void ys_edma3_init()
; k* v7 C7 k1 ]) K4 Z4 b{0 t7 M9 ?& O" c
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ B7 Z" X* ?; z- U# R) l4 ~        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 R1 z* b/ U" _, V( ^# P        EDMA3_DRV_Handle hEdma;
% {2 Y/ s  a& B    uint32_t chId   = 0;
; J" X5 f) r# g    uint32_t tcc    = 0;& U- M, P! K5 D/ I2 Q) M. h

6 d) r, q& {. a0 l( U    print2arm("edma3 driver init...",0);
. w/ \3 f! R5 v3 d7 u& L! L# O
  t9 Z5 w: L+ H        hEdma = edma3init(0,&result);
4 z- X5 Z9 d# w3 F; W6 U4 u* p        if(hEdma)
6 `5 m( N: y  ?% P, O        {
# ]. i3 U: }" V                print2arm("edma3init() Passed.",0);# y2 g: u" R5 Q, S1 [9 @  o
        }5 O3 N1 u! [7 s# r
        else( E* B$ L  y% q2 }* D. b0 V/ i$ {
        {" X- v) A! \7 A/ `  I
                print2arm("edma3init() Failed.",0);
/ t+ b0 ]* A6 M0 C2 A6 u0 j5 y        }
3 Q8 P7 u1 \2 }/ [; {. J3 Z+ [# l  ~       
6 P$ \& b: ~- C" q9 ~1 N        if (result == EDMA3_DRV_SOK)
& `- K# r/ f5 @1 H' Q3 c, l    {
6 L4 M. M! a+ \! R) R% T& T: Q* j                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 H$ U9 z% }5 u                                                       (EDMA3_RM_EventQueue)0,
! R; M; p6 Q( D* _, g1 K                                                            &edma3_isr, NULL);- P& J" H& ^" r. j; ~
    }) r. o8 Y  b  D0 c# E% G
       
" r8 E" s  m% b( X9 `; [- x! o0 S        if(result == EDMA3_DRV_SOK)4 E$ V$ m" Y& W+ U/ b, }5 r2 U  u
        {
8 l1 m; D! S# u! [# C9 p                paramSet.srcBIdx    = 0;6 N5 C& k5 b! t8 t' P
                paramSet.destBIdx   = 1;5 B7 ~  y# l7 z+ ]# |
                paramSet.srcCIdx    = 0;4 j+ F7 s1 |4 F& k2 _8 H
                paramSet.destCIdx   = 0;
; _+ A8 ^0 S2 y' u+ i                paramSet.aCnt       = PING_PONG_ACNT;0 n, Q2 H: e5 h2 X
                paramSet.bCnt       = PING_PONG_BCNT;
6 a7 P# Z4 e' l                paramSet.cCnt       = PING_PONG_CCNT;
9 c4 E% {3 A1 X( v( D, \               
. x& C+ O1 ^( c) A6 m                /* For AB-synchronized transfers, BCNTRLD is not used. */
3 l4 ?1 I/ O9 F( p* p6 @                paramSet.bCntReload = PING_PONG_BCNT;
0 k! r1 O7 L% A8 h# d" _. e; \, Y# @  a' z, p& W$ M
                /* Src in constant mode Dest in INCR modes */* f4 H7 U3 b3 N, c5 C0 K8 d
                paramSet.opt &= 0xFFFFFFFDu;
3 `/ @: h+ j( m3 }                //paramSet.opt &= 0xFFFFFFFCu;# T# n* U4 h1 W) Y: n& @
                ; j! ]1 b, L1 B* c# j8 o8 T/ z
                /* Program the TCC */4 s7 `( ^6 x, I' Q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. g. Z) Q5 q: c+ z: A% T. A& J5 H
- F0 w: D4 E4 Q2 Q' n" E
                /* Enable Intermediate & Final transfer completion interrupt */
4 T9 T- R% v5 m; [$ H4 q                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 G$ |7 }3 `, Y; U5 G$ Z" T( [7 q! @7 |
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 f2 z: [8 p& [/ y3 I; s! y7 T3 t0 Q3 {& Z& }; q+ H% u
                /* AB Sync Transfer Mode */" T5 b! z6 i$ n: ]
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ M) I% ?# i  T% H/ F2 l4 {               
9 L( Q9 a! _3 `- j" S/ E6 B( U                /* Program the source and dest addresses for master DMA channel */, a; X$ [  a6 z) o% M$ p7 ^
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; i1 _( w  q8 O" K/ d" y0 j$ f
                paramSet.destAddr   = (uint32_t)(ping_buffer);
- w7 h0 d# q$ u0 m9 F* j$ Q4 p
+ ?# u8 J) N6 c; n3 S9 w                /* Write to the master DMA channel first. */4 S4 M. |& S+ I+ b8 c1 X  g6 h' N
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);2 k$ o. \' r* g+ e5 \1 ~* w4 C1 l
    }       ) Z" ^, L8 m3 n: {& e' }+ |" q7 V5 n( b
+ B0 _. x. U6 k9 |; m7 J
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);, U5 m% N) {, [+ u+ e+ T- l3 T
       
: s0 {5 P# {7 f$ Q    if(result == EDMA3_DRV_SOK) 8 x6 F+ i. x0 Q) p
    {
) Z! g' A7 k. d4 f8 M            print2arm("edma3 driver init success.",0);1 e- c6 q$ |) C% }0 E) G
    } # q* q- }! V; E2 a6 K6 ^" x( M
}3 @2 k: r, t- l0 A/ P
4 K3 k1 |' l4 n* F- Z: K
- @8 V9 I% B. c1 ?7 f! V4 R% V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) i6 W6 |+ |0 ^" Q4 v+ ~
$ m7 X, t3 o- G0 J

* _$ Y# t) n4 f- @
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& j5 z, G9 J, Y* e每次DMA传输完成后都要再次使能传输
- I# W8 E+ a$ o  o$ A+ P& v6 r
原来是这样,我明天去试试,谢谢了!




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