嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: m8 D: Y. Y! G2 B) T6 j3 _8 }
#define  PING_PONG_ACNT          1: _) H6 C: H$ N, a% Y( [% F& b, q
#define  PING_PONG_BCNT          8*32*40 ( R, I0 o0 Y7 A* X
//#define  PING_PONG_BCNT       1   ?4 y  a  O" L3 L9 L/ D
#define  PING_PONG_CCNT          1# f1 R3 `% V/ ]/ e+ l' N
#define  MCASP_BASEADDR          0x01D00000
& N/ P& s, K2 O# j$ _) o/ |#define  Mcasp_RXEVENTQUE        (0u)
) a9 O$ X1 W/ Y
" R2 k1 S: g- S6 |& g/* OPT Field specific defines */
* V' _2 ]6 `0 y#define OPT_SYNCDIM_SHIFT                   (0x00000002u)$ ^% f2 C2 D5 F; E
#define OPT_TCC_MASK                        (0x0003F000u)2 j. h& S7 X. a6 r- O# P" O) R3 P! I
#define OPT_TCC_SHIFT                       (0x0000000Cu)
' i$ Y6 w  X4 H. M  |4 ^1 E#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
; f7 |) I9 W  y3 @5 x2 C, P( t#define OPT_TCINTEN_SHIFT                   (0x00000014u), @& a" A0 \& L, D" p4 |$ v( x

& C! f4 {  S6 V' ]0 I8 R! Ochar ping_buffer[PING_PONG_BCNT];* f4 L6 y/ y0 L0 F
char pong_buffer[PING_PONG_BCNT];/ u, M8 A; ^; ?. x7 Z8 L

4 V( D- N% K; E: z+ t
0 m. f  {- E9 P. u. i, W8 O& Y9 x
( x0 c# y5 D  u6 D
, O$ c* P- i- H. ustatic void ys_edma3_init()4 ^$ [7 s: w8 E8 M4 ]
{
# ]7 V( g; t$ H8 j' u4 P& m        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
9 m7 N! L: o* M. d& D" [        EDMA3_DRV_Result result = EDMA3_DRV_SOK;4 [/ D  V7 F* W8 h+ D3 a& w8 J! Q
        EDMA3_DRV_Handle hEdma;
( o% r3 o9 e3 K' c1 ?    uint32_t chId   = 0;
( k4 z. L$ F! [) S3 E    uint32_t tcc    = 0;
# }! ?! J) u" }( }9 e7 l  T8 E: n& \$ R# a, o# J) C) i
    print2arm("edma3 driver init...",0);
1 }7 N- v  P! k: N
- ~; R8 K: T* L9 _' b1 w        hEdma = edma3init(0,&result);
8 G5 V$ x+ x( C        if(hEdma)# T6 B% d  @) P, g9 [
        {2 t6 n8 X8 c! D3 ^1 r3 P
                print2arm("edma3init() Passed.",0);
6 [$ I& K, Q8 i2 l5 o2 Q0 y        }6 F$ k( C) G1 _, o
        else
- P  L. U! W& H2 b% f9 C        {3 X# l6 A9 B5 _' ]+ R0 R
                print2arm("edma3init() Failed.",0);
& \+ c0 C+ G. x& |        }
* _! j3 z" b% s          |: U5 s) f4 r! O# \
        if (result == EDMA3_DRV_SOK)
& \" k! @5 M6 x2 d( l2 O# h9 {    {
" J1 d& _3 L% }4 w$ Z' d5 r/ K                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,0 ]% x+ w5 B+ d4 `: R
                                                       (EDMA3_RM_EventQueue)0,: Y. F/ R% u9 V3 y/ L
                                                            &edma3_isr, NULL);
3 d9 |7 x: V2 [4 P/ V3 P0 X    }- f6 z) f0 j, W
          F# l+ E# Q+ r/ u8 f
        if(result == EDMA3_DRV_SOK)
5 H% [0 E; x# H/ _, v" u        {
1 Y- m2 S* L4 b1 N+ r3 `                paramSet.srcBIdx    = 0;4 a/ P' B' {+ I" e: \; w
                paramSet.destBIdx   = 1;& a2 }8 Z+ H1 W. O% Z. V# K/ K
                paramSet.srcCIdx    = 0;
" S$ e1 ?3 h5 j) M( t1 ]                paramSet.destCIdx   = 0;
: a) |( C6 O5 X                paramSet.aCnt       = PING_PONG_ACNT;" x8 @! `( W# J6 z0 @2 w  m
                paramSet.bCnt       = PING_PONG_BCNT;$ V' |7 Q8 s1 `
                paramSet.cCnt       = PING_PONG_CCNT;
) u8 z3 A' C. m0 A                0 B  O* F) r, Q* _% F' J$ {) o5 M, I( F
                /* For AB-synchronized transfers, BCNTRLD is not used. */0 i  _* L2 g" k, G! W6 G# o4 {4 Z6 ?
                paramSet.bCntReload = PING_PONG_BCNT;
/ a& Z; q8 j& Q) b+ V$ k, j& U& K2 _: ^
                /* Src in constant mode Dest in INCR modes */
3 c) S7 r' T2 z                paramSet.opt &= 0xFFFFFFFDu;
0 Z! H" Y* y0 h7 E                //paramSet.opt &= 0xFFFFFFFCu;: c' B3 X8 P& }7 t
               
! r/ K" ~2 V0 b. }                /* Program the TCC */4 L7 \  `7 {: b4 h& o' N
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 K+ v2 q, P4 q6 ~0 s. r' C# H( j# e$ d7 N% o9 ]3 m( t
                /* Enable Intermediate & Final transfer completion interrupt */
3 e1 u6 j+ [' C) ^; W1 ^                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
+ h" W4 Z0 s' w) E1 X8 `                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
8 {- U3 g* E/ ?% Q( K$ a# K
; ]7 M+ R# E1 G                /* AB Sync Transfer Mode */1 h; j9 h) E- h/ H8 y5 ~. p7 b- T1 _
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);0 p. m9 i2 U& E- q7 }* P$ v
                ) V  e+ |' F5 d5 d2 P& Y
                /* Program the source and dest addresses for master DMA channel */2 `( F# M5 u9 \! R& ~: K8 B7 ~
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
8 ?' h- i1 m, R                paramSet.destAddr   = (uint32_t)(ping_buffer);4 \6 q$ U6 h6 w( E) k

9 Z# o2 n, }& p" d# {9 t( V, A9 `& ^                /* Write to the master DMA channel first. */- X4 U. Q4 [7 `
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);9 P' B! m: r) Y- q- H& t0 K  d; \
    }      
( R8 H7 t5 u% c& _# ]. k! F+ F8 G! s: \7 B" G
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);4 }# V. X% G8 c6 x' z2 H0 w: w5 ~  G
       
' I! F7 \5 n5 x4 P! L0 V  X8 e. L; e  k    if(result == EDMA3_DRV_SOK)
, F) [, A7 i$ B  H5 ~    {" D) w! N4 k; j
            print2arm("edma3 driver init success.",0);
. _( N  N4 m. b$ P! B    } ; |. t/ ~8 Q. V, j" c0 J6 E
}
/ _' V. k" \& `, u3 h9 w- h0 H
' K) L2 b+ p  z2 F) S
& ^" ]# s7 S& i6 F- H* tEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& {8 i  Y+ @- W- O6 Z
) q( N2 J' [. ~$ e: B; _/ {6 d. {/ A" F% ^1 R! h" f

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47  C' \& @3 O% {+ R
每次DMA传输完成后都要再次使能传输
/ g) D) n+ V' V0 O
原来是这样,我明天去试试,谢谢了!




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