嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 L% ]) b- @# j+ A5 h$ E( X
#define  PING_PONG_ACNT          1
% o; u1 _. U7 D( |# f0 a#define  PING_PONG_BCNT          8*32*40
9 C8 H3 l' @0 y' N( d//#define  PING_PONG_BCNT       1 7 K: o* e* F" y5 k0 ^# l
#define  PING_PONG_CCNT          1: ~7 ]- ~$ T% A7 e5 E6 o
#define  MCASP_BASEADDR          0x01D00000
# Q  a$ G* T- E/ [' S. b#define  Mcasp_RXEVENTQUE        (0u)
4 ?1 `1 L+ [7 R& x" u( R  F4 }& g5 }) l' @+ |* D  x
/* OPT Field specific defines */2 d4 y) [+ X2 o/ d/ N% g" L9 {1 y
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
; z6 |6 E8 L& t: R# F0 E% \2 ?#define OPT_TCC_MASK                        (0x0003F000u)
/ Y" x- @$ s* x- q; E1 E3 W3 K#define OPT_TCC_SHIFT                       (0x0000000Cu)1 Y& d  F0 b9 L* f+ q
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)# s9 }; J- ~3 N2 C- }6 v5 P3 a1 [: m
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
1 E2 T6 h, e/ t1 p# C, D; W; t
1 s& c: N1 i$ `! V! ~3 ~char ping_buffer[PING_PONG_BCNT];4 q# h) A3 d  i
char pong_buffer[PING_PONG_BCNT];
- R- @  P4 \5 [# i) [
. W! s( n4 z; ^' t- `4 l
) ], {  H9 m% G+ w" C7 |9 z, S6 Y$ K$ c$ a$ x, o( w
& K0 ?, h; a: f
static void ys_edma3_init()( Q3 L& H! Z9 C; ]: s2 [
{
2 S0 A  P, T) v# t        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% ~' o. A+ n) F. m' V        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' P" X0 L. A. ?# q: v        EDMA3_DRV_Handle hEdma;; W: z1 b- {8 [+ e% ^
    uint32_t chId   = 0;  _" Z% @. ~  `, G
    uint32_t tcc    = 0;0 T9 Y4 o. ^% P2 f  y

& M7 d0 ^$ f0 k, ?; s    print2arm("edma3 driver init...",0);) S& b, H( u* k

4 M+ S- P0 w: R. n        hEdma = edma3init(0,&result);* ~& X2 ~4 P# h  c6 f! A5 {
        if(hEdma)
2 s3 o* {7 l6 w# i0 d        {
0 _0 U2 z: b3 W                print2arm("edma3init() Passed.",0);
1 z2 G8 H7 i+ z/ o; B- K- }; z        }
6 Z: q$ V3 d+ M# T; D        else- r8 R6 n  @: Z4 {4 c" }1 Y
        {9 B, Q" F0 u4 \9 N- x* q1 u
                print2arm("edma3init() Failed.",0);: p, n4 y0 X& j
        }% |% L7 v  w/ C. P# y& {8 K. z
        * x% d7 a" X( x+ e# [
        if (result == EDMA3_DRV_SOK)
0 V  K& d- |$ T9 v    {
$ y/ j9 m* B0 t6 q" J6 B; I9 T; K                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 \# b/ r9 Q3 w+ Y0 j4 H& V                                                       (EDMA3_RM_EventQueue)0,/ v5 Q" J9 [" M
                                                            &edma3_isr, NULL);
  {% u1 Y9 X7 v& u& }8 u% p( y    }
  h# H) {- e6 h+ u       
$ P4 I2 P1 A3 G        if(result == EDMA3_DRV_SOK)
- U& B9 f. M+ A3 u+ g        {
7 Q4 V1 p% c) K* j2 S- f                paramSet.srcBIdx    = 0;
' H7 U5 P  o/ m/ j! a! H9 f. G9 L                paramSet.destBIdx   = 1;9 n' f7 A9 S# V8 M
                paramSet.srcCIdx    = 0;8 u, O6 ]5 V3 }- Y# }3 w8 u
                paramSet.destCIdx   = 0;7 A- _6 ^7 Y) T- p% {) J
                paramSet.aCnt       = PING_PONG_ACNT;
/ X  T% \$ v7 s! G1 E/ Z# m# Z& ]                paramSet.bCnt       = PING_PONG_BCNT;
+ h: E+ X5 e  O/ d/ m5 {! Y3 `                paramSet.cCnt       = PING_PONG_CCNT;
9 i+ c8 S+ H6 e3 }' B                ' Y2 }9 W  j5 G3 V* u
                /* For AB-synchronized transfers, BCNTRLD is not used. */
3 v2 w$ a5 r! H3 h6 Z) a4 ~) y                paramSet.bCntReload = PING_PONG_BCNT;8 k3 j" v; X, m+ c( Q
, K' L2 e* V6 d: j  B# n8 \
                /* Src in constant mode Dest in INCR modes */# h" F$ X- @$ @, C* H
                paramSet.opt &= 0xFFFFFFFDu;
1 w( k+ Y" {* ~; ^0 b. F; c/ Y                //paramSet.opt &= 0xFFFFFFFCu;. U# \) j7 X9 \2 a7 A) {# Z& n
               
3 m2 r* v& t* h' X. d                /* Program the TCC */' e6 r  F: ^# v# a
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 D& Q. e$ X8 x# }: e( f
7 T" O. E5 o- V: d+ {
                /* Enable Intermediate & Final transfer completion interrupt */
/ }0 l( X1 j( A3 _( U# g" F                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 d- y8 |; u5 I& R9 m: O$ x" A
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ |+ c- w# K  w; o# m5 t2 D
+ n) K% w" h; \" m; e' D                /* AB Sync Transfer Mode */5 V# _' |2 p# I# ]; ]' {) x
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ m( B, ~" G! H# \                8 s7 t6 e, X5 `# r- }
                /* Program the source and dest addresses for master DMA channel */: m# ^% q  s5 M
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
' _* u- b0 N( u- _  f+ P/ y                paramSet.destAddr   = (uint32_t)(ping_buffer);" x2 T& [% \; B* q

) X% ]# v6 ^8 u0 Y                /* Write to the master DMA channel first. */& w. A  A( J5 T8 k8 e3 J
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
" I  G+ u' [. c/ b    }      
* g# f+ C3 P' C4 Y6 O4 Q" p, C# {" v  u" a* P, `+ I
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ K' h$ L: a3 m7 \4 ~       
" ?: z+ Z6 t* j    if(result == EDMA3_DRV_SOK)
$ Z4 t# s2 Q5 f! q    {
8 R1 n( t5 x/ P            print2arm("edma3 driver init success.",0);
# z5 I; ^5 G# o! P) |3 C    } 0 U* V* q) s2 b; R
}
& R! A3 R& Q) l4 M; \4 e* P: |6 y& h5 h  T1 G

6 T3 s' o  x6 Q9 d" uEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
  |! m; q$ M9 E4 j/ C* i3 F  E1 C3 v9 I/ a2 O: u8 q

# {7 [2 Q0 d2 `- M% Z: |% S' c
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ h1 l7 M* Z/ S7 u& i, ^6 b
每次DMA传输完成后都要再次使能传输
8 s! T3 I/ E8 |4 N/ ]) e# |
原来是这样,我明天去试试,谢谢了!




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