嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 ]. A1 c5 @5 g) Q! K) ?3 B
#define  PING_PONG_ACNT          1
' K6 C, q- k: w- ?8 M#define  PING_PONG_BCNT          8*32*40 & \+ k+ E' ?. |! @: u0 w( q
//#define  PING_PONG_BCNT       1
2 K/ o( N" K: ?: Q* v& C0 S6 J  M#define  PING_PONG_CCNT          17 a# }/ _* G. ]; o
#define  MCASP_BASEADDR          0x01D00000
4 C, Y3 n7 h8 \6 S6 j#define  Mcasp_RXEVENTQUE        (0u)% H4 G+ h' k  u  \9 ~4 m. |
5 R# R0 P. s# _, Y
/* OPT Field specific defines */+ p! J6 L+ Q5 d% M! w7 y+ i
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, A( x7 a. d5 H  W1 B7 z#define OPT_TCC_MASK                        (0x0003F000u)/ h- A! T' ]; j) L; P& T8 R
#define OPT_TCC_SHIFT                       (0x0000000Cu)9 {7 m+ r! H5 V" X5 U# L
#define OPT_ITCINTEN_SHIFT                  (0x00000015u); G' s* C4 k2 x+ ^: z/ O( [9 w
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
& q. S( ?/ h4 T; l6 N7 i: h% i/ h7 U( Q
char ping_buffer[PING_PONG_BCNT];
/ q9 q1 r0 Z0 p* N( H7 k; R: O, g. v. Achar pong_buffer[PING_PONG_BCNT];
) o4 ^: h; b# _( Q2 a! n
* F0 F7 X# a. ], o; ]* h1 ?, i1 P# U) y
$ W1 b9 e" N$ B! ~
. A9 c( H  J, g+ t
static void ys_edma3_init()
5 y5 r* P' g$ ^7 k- H; ?{3 D9 x9 h0 p5 [
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
! o8 l! m: H( ^  d1 ]        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
5 [! @  |: w5 ~( k* C% g        EDMA3_DRV_Handle hEdma;  @* _6 G: o# [! o& {
    uint32_t chId   = 0;
/ f/ R) m5 a9 b% k    uint32_t tcc    = 0;, B" W( v( z/ \4 y5 q
0 n8 k+ p( X" ?! A9 O
    print2arm("edma3 driver init...",0);
8 d! I2 K; z; I' i! f9 C
5 [3 Z- K* K9 b/ m6 `5 @; |        hEdma = edma3init(0,&result);
0 Q  X' d% `5 p: h; d" K+ h: I        if(hEdma)1 Y7 e3 m. p& n5 x1 \$ k
        {
8 U8 Z6 {+ y+ X( `. U                print2arm("edma3init() Passed.",0);) M. M) B2 T7 J9 v
        }
  x2 t2 Q9 y8 F7 f2 [8 `8 J4 d        else) W5 v: @, u7 z( }
        {9 X% T) b- r' ^# b2 P
                print2arm("edma3init() Failed.",0);
; {: T. X, y/ C& h% A2 k        }
! b2 W  ]) e) B3 P1 ^8 s4 {8 F  C       
3 r9 i+ U8 |' y# O4 t        if (result == EDMA3_DRV_SOK)) Z( x9 H0 D1 a
    {
  C0 N8 C+ s$ h                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; v+ Z6 |( t, z# ]; b1 ]" i1 B
                                                       (EDMA3_RM_EventQueue)0,
5 ]& f/ o/ j# k4 W6 n' B                                                            &edma3_isr, NULL);
' u# ?2 c6 b: C7 `) I    }
/ k7 V- N/ O; `) R7 l/ m# _        * U+ y$ n$ w' r
        if(result == EDMA3_DRV_SOK)
8 k# p4 T/ d# W5 W- \        {
+ M1 h0 g) M4 N& O                paramSet.srcBIdx    = 0;
7 E: `& ~8 b0 n( X                paramSet.destBIdx   = 1;( X4 g3 z, l$ t! a% b+ S9 t
                paramSet.srcCIdx    = 0;
5 k" [( O" |* ^1 R) s" r                paramSet.destCIdx   = 0;& X" z8 t1 Z# _* r) s" l: i
                paramSet.aCnt       = PING_PONG_ACNT;
. I5 L. j. C+ K5 |                paramSet.bCnt       = PING_PONG_BCNT;9 l- c5 {6 y# N* Y( u  t& x$ p
                paramSet.cCnt       = PING_PONG_CCNT;
4 i1 [4 a  S9 Y) b0 {               
# h1 C$ \4 H; L& Z                /* For AB-synchronized transfers, BCNTRLD is not used. */
3 ~* G0 _( R" O5 p/ V* t                paramSet.bCntReload = PING_PONG_BCNT;
: z) ]! |6 J$ V# N& s
2 o# u/ {/ N/ A/ L* H+ i1 l. T! w. a, U; \0 _                /* Src in constant mode Dest in INCR modes */
* w& E- d* }* I                paramSet.opt &= 0xFFFFFFFDu;
2 {$ S5 ^4 D2 e7 r                //paramSet.opt &= 0xFFFFFFFCu;, ]) g: G3 y# J2 g
               
+ d  f# p2 N( l5 G" c                /* Program the TCC */
+ R, G  w9 y7 j: c# [" T3 E                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ w6 Y: O$ A# B0 T; S3 G. d3 @
. f8 }9 G/ T8 ?. Q& F- u
                /* Enable Intermediate & Final transfer completion interrupt */
5 {/ t# Z4 k3 a' \3 {' C8 N5 Z                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# j0 t2 f/ R  z8 C& ^1 B
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 }7 P, C2 L: o: E5 Q; F# ]7 j+ m: A; P* \; R, s% s9 n( }6 R
                /* AB Sync Transfer Mode */! x0 d9 `( V& s( X  P+ q7 E
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" h/ i0 Q% E6 N  D                2 t! x4 f6 c" p4 c; f& v
                /* Program the source and dest addresses for master DMA channel */
; j# V  g7 i# P1 t$ `9 `7 I                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);( U) h. P5 \5 N# }# y
                paramSet.destAddr   = (uint32_t)(ping_buffer);
' ~/ r5 @3 ]! X$ I$ z/ t2 o4 c* y/ C" |/ [
                /* Write to the master DMA channel first. */% T1 q- w! j+ s
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
. [2 \, e! d, B2 B    }      
; K  x: `& D7 o, y. |; b4 J3 I+ Z' b5 F$ I" Y
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ h6 r! L( M3 s  G0 J+ [       
3 `" y9 J9 P9 Q" R$ h0 Z    if(result == EDMA3_DRV_SOK)   k3 ^4 B# W8 l6 N1 N! i4 x# }
    {
0 L8 A, C  M2 E, |/ i. \/ v            print2arm("edma3 driver init success.",0);
7 |! ^$ D9 Y) `* t. s! U    } 6 a- t  u3 @- Z. a1 a+ f
}
* _, e/ k# i7 G7 s: g# A, P  W  O/ t( `) x/ {" O% T9 ]6 z( W
( c' D) d. g' y! }* U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。. X1 K' u4 W& r: d
- S3 _: @6 P; |. B
0 g. C6 m) s' K' w0 y5 i" w

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 H. C- J/ }: r% z  \每次DMA传输完成后都要再次使能传输
# z! G- E$ N& _4 r6 y( s3 R- b& t
原来是这样,我明天去试试,谢谢了!




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