嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:' P, R2 N7 h( q% n$ S9 h5 h
#define  PING_PONG_ACNT          1# O# F: ]7 c: e7 Z
#define  PING_PONG_BCNT          8*32*40 9 |& v, y1 `! t4 I/ p) Z) n
//#define  PING_PONG_BCNT       1
6 ~1 W0 ?( G& T: G#define  PING_PONG_CCNT          1
. |+ ~. z# Q+ A' J6 F3 l#define  MCASP_BASEADDR          0x01D000004 c  ~8 z+ A, Y2 n" e4 s' ^' x8 l
#define  Mcasp_RXEVENTQUE        (0u)
: J/ v+ }( m$ h: r. [) z; u' Z$ }, T
1 n, |$ Q# k! e+ L: z3 |  C/* OPT Field specific defines */5 h- f! h7 q. t& G) O& b3 @
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)3 z8 N7 s- Q9 v4 b
#define OPT_TCC_MASK                        (0x0003F000u)
- Y* @" O5 g  [5 e0 S#define OPT_TCC_SHIFT                       (0x0000000Cu)/ v5 l2 M% U' x$ H; Q
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 r" ~/ c* _$ A1 |4 j
#define OPT_TCINTEN_SHIFT                   (0x00000014u)7 d4 X6 U2 N9 ?  D  `
! V- B, o/ W* M6 ?
char ping_buffer[PING_PONG_BCNT];. C3 f( ^' |) l. k
char pong_buffer[PING_PONG_BCNT];
* c: n. [  G3 V; `
+ c  N7 ~* S  S4 u; U1 W; W3 E% s! Z7 O* b1 t& J7 @4 Z2 }" l

. N. Y# k. V5 I! W8 P
9 z2 m; i/ R4 L( r2 V( j6 h  `static void ys_edma3_init()& Q' T) `  [" H. Q( w
{4 p* }- h3 y% V* t. x) m4 ]
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- d8 {# \  T8 a4 C5 s! n8 {
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 b; C" q: x! I0 T8 F3 K
        EDMA3_DRV_Handle hEdma;0 e8 ~* P% H+ [* ]) M1 |% j
    uint32_t chId   = 0;: a! Y+ f- `) T9 q
    uint32_t tcc    = 0;
5 R& y- [3 r5 m
8 m) M% t) I% g" O$ v8 U# \% W  g8 }    print2arm("edma3 driver init...",0);7 j  F5 L9 q  |( Z! C; |, o

& b( d- f% w% y$ F% C        hEdma = edma3init(0,&result);* P* m0 D1 ~. [( d
        if(hEdma)7 S6 V0 U5 I6 l3 a2 c$ ?3 c# v
        {  c& v4 P) `/ P4 r; H
                print2arm("edma3init() Passed.",0);
7 t5 O- q) b- ]        }
7 x% F! t( r' ?: z        else
9 u' }. z( U5 ~) b, S        {6 R' t/ [: z; [) W5 i7 r4 u
                print2arm("edma3init() Failed.",0);+ a0 M: a  _  ]6 n8 y
        }
$ L& S7 B9 g+ L. W2 O# s- c       
2 K! V0 r5 \% c        if (result == EDMA3_DRV_SOK)$ z/ o& u: J- A* _5 c( ~; ^
    {
7 t* O4 K9 W9 u" a# b; m# K                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,/ y3 I8 I* }- O
                                                       (EDMA3_RM_EventQueue)0,' v4 G  a& A3 a4 o5 j9 l; u3 K0 G! }
                                                            &edma3_isr, NULL);
/ _; [0 w, V/ I$ A( j7 a    }
) A3 d% @" l" N( C; T        3 Z/ q: Y7 X2 p$ n
        if(result == EDMA3_DRV_SOK)4 X1 n8 R+ ?% F' e* i+ o2 `! }
        {) f/ [- a3 s4 ]) B
                paramSet.srcBIdx    = 0;
% p% M7 q9 }$ p2 R$ R: L0 R                paramSet.destBIdx   = 1;& M$ `) T7 t2 Y# e" _$ X
                paramSet.srcCIdx    = 0;
  j7 E/ T) O) @2 V6 o                paramSet.destCIdx   = 0;
) |8 c. D8 f. f  f$ j                paramSet.aCnt       = PING_PONG_ACNT;' i/ q( {! y! L3 [' d- a
                paramSet.bCnt       = PING_PONG_BCNT;
- W8 M+ }5 c" T& M% D                paramSet.cCnt       = PING_PONG_CCNT;6 q% f4 O7 m* a
                7 [4 A  J; F$ H6 G
                /* For AB-synchronized transfers, BCNTRLD is not used. */2 P! q- u/ ?! Q. |9 r- p- u
                paramSet.bCntReload = PING_PONG_BCNT;
) U, k% q& B$ b' W) I: y7 O( T# u! G& ?
                /* Src in constant mode Dest in INCR modes */
" t% n" d% K+ y, h; ?! U* |1 {                paramSet.opt &= 0xFFFFFFFDu;2 @, n5 z% n4 p3 X, O
                //paramSet.opt &= 0xFFFFFFFCu;
# D1 A3 C9 t( y                7 L4 E8 C2 i$ h2 N/ O. T) v
                /* Program the TCC */" t/ h  p" L5 {1 o
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 ?( K& n& Y( |2 O5 ^3 @5 I
3 X8 _" k- z0 x                /* Enable Intermediate & Final transfer completion interrupt */" q  k1 I5 J2 |6 r0 w& m
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" `* T3 U9 a# ^; g. G. y- }7 a                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- g5 J0 c1 j% ?0 f# y% b. }! k" N/ |* Q
                /* AB Sync Transfer Mode */8 d* }5 C, R, p: Q4 z  P1 M7 y
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ A1 k7 F: P- b
               
" H; v) u* R% m9 L                /* Program the source and dest addresses for master DMA channel */
6 d: Q  w2 t/ q                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- N: T& r& n5 w3 }9 k6 E
                paramSet.destAddr   = (uint32_t)(ping_buffer);
# [8 Y9 T7 }0 d( O9 Q: y
  j, x" |( x1 @9 Y! `                /* Write to the master DMA channel first. */3 h! r) \3 O1 r9 h+ ~  L
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);; Z5 h4 T2 Y( F2 }5 X
    }       $ C) f! H2 e% S. T& B! o/ B

) r+ h6 z9 a0 @: W3 o        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* r7 W. \  a1 F7 D( I! ~' d        4 m/ [" l- B# I
    if(result == EDMA3_DRV_SOK) ! K! k: R8 J6 K  w& d
    {4 `" u9 k6 {- m: @7 s) k
            print2arm("edma3 driver init success.",0);  z2 q0 h$ X0 B  M
    }
/ \& \- D' I- T# F8 T}
$ i* _0 ]- t. a" w! }* x/ C8 J6 c/ v* O( b/ ?

( o! N* D, ]9 o% b$ ]; C, PEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" m6 k; G* H+ o0 j9 l- X* r( N
) N0 P6 ?. L4 E& F* N& Q5 q
; W  s8 j5 l) p5 l5 W4 k. W
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 u/ y  W) u/ U" `$ y2 `3 y5 C0 v  t每次DMA传输完成后都要再次使能传输

0 S1 S3 @8 p1 F4 i: T原来是这样,我明天去试试,谢谢了!




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