嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% |3 h. R- @% ?! m. c; x5 j. @6 p
#define  PING_PONG_ACNT          15 i9 H& V8 P/ [4 V# x( `% m
#define  PING_PONG_BCNT          8*32*40
" |( u0 E1 H+ a  Y9 O//#define  PING_PONG_BCNT       1 / c/ N0 H- ^- |5 m$ R
#define  PING_PONG_CCNT          1
/ {1 h6 p! `+ z+ m+ E; q4 C/ U6 K#define  MCASP_BASEADDR          0x01D00000+ {5 {) @3 b* D4 r: h/ ]: ]
#define  Mcasp_RXEVENTQUE        (0u)
5 `) R' I3 i7 n6 G" t/ P& X! e
- [' \$ q2 Q* w/* OPT Field specific defines */3 _0 ^5 g2 e& @
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)9 J" V' }; P, t  S7 O: q+ }
#define OPT_TCC_MASK                        (0x0003F000u)
& G% Q: ^& }6 W! [% i0 D! q' @#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 b- z' q: T3 k  N6 r#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& n* p8 |: o' q4 V2 p: a! E# J
#define OPT_TCINTEN_SHIFT                   (0x00000014u)5 E2 R) S, }, i
' N2 ^: V# h/ R2 ?
char ping_buffer[PING_PONG_BCNT];
5 ^# H8 v+ B4 Mchar pong_buffer[PING_PONG_BCNT];6 D0 @& R* ^. C/ o

& K' K3 q+ e1 L2 l8 W1 I* {0 w
3 w5 Z; Y5 X1 b9 t* e2 o# {3 v
* n) `# q, ^, X8 T1 u- U; Q1 a
1 `4 T# a5 z8 k& xstatic void ys_edma3_init()
- x6 S, A' ~, u" H9 I0 A{  H. X3 s' N. m( N! b! M
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
6 j: u  l* V& G6 H0 n6 R* ^7 W, F- {        EDMA3_DRV_Result result = EDMA3_DRV_SOK;) i0 T( y0 h$ c) N- w, b) |2 h  s
        EDMA3_DRV_Handle hEdma;) y/ f7 ~) l+ \2 Y
    uint32_t chId   = 0;
. U5 v* H: n$ O" b    uint32_t tcc    = 0;
* F6 L, [: r8 x( t  z0 v# ?* [$ X! M
    print2arm("edma3 driver init...",0);
, V$ e% a* F$ s" _% p. y/ r0 f% B6 m5 B! S% K1 m, E+ A' l
        hEdma = edma3init(0,&result);% q0 {( {" H/ C+ M/ ?7 }# S8 _
        if(hEdma)( l& ]" P, y! [2 H8 N, ?& K5 L; y$ c+ K
        {4 Q4 c, v2 j: s! L2 E
                print2arm("edma3init() Passed.",0);* Z2 k& S* r! y$ j! ]
        }
, ^# T/ ~- K* ?% R) V7 z3 @! Q        else0 W' M: A, p6 Y) \. H3 N. b
        {, r/ m* H5 l4 O3 R6 w
                print2arm("edma3init() Failed.",0);
" ^0 J, P4 ?! I& _: q9 g5 ~        }8 m7 n5 A6 L) c' [$ [( W
        ' G8 I9 l, F4 \& ~
        if (result == EDMA3_DRV_SOK)$ t0 W3 `" K- H4 J! [
    {- d* S# h' e! }+ ?
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 v# g- ?% X. F8 t. }* m# p, U" S                                                       (EDMA3_RM_EventQueue)0,
7 `! f8 X$ A# D9 U! Q, L+ B                                                            &edma3_isr, NULL);6 _0 }6 k5 C; U, }
    }
" E) x/ q* F9 e1 a        + \8 X0 b; z: O" m  I
        if(result == EDMA3_DRV_SOK)
* f" J, }- n5 s5 U2 W# w% [, h        {
  m: s! `# _8 h- c" Z5 A; g                paramSet.srcBIdx    = 0;* ?# _, l1 H; Z# F' i3 ?5 Z
                paramSet.destBIdx   = 1;
7 ]  Z) }' O- m7 v                paramSet.srcCIdx    = 0;
8 Y! Y. z+ c5 Z, L, t; K! C                paramSet.destCIdx   = 0;
$ Y( y4 Y; A, M' z                paramSet.aCnt       = PING_PONG_ACNT;) m2 T% }* R; `+ d
                paramSet.bCnt       = PING_PONG_BCNT;; q  i. `  m: @: u. f, d
                paramSet.cCnt       = PING_PONG_CCNT;
, ~. q: {  i, R$ n4 w4 [7 z& G+ O( R* w               
' L# S2 `+ f/ ~  C7 V- V9 y: Z                /* For AB-synchronized transfers, BCNTRLD is not used. */9 a4 `- }+ `! V8 n3 Z5 W8 y
                paramSet.bCntReload = PING_PONG_BCNT;
& {/ R$ i, G, t
6 F/ \- Z, {/ ]6 d# K: Z' _                /* Src in constant mode Dest in INCR modes */
8 R8 ?/ X& h& @7 `! M                paramSet.opt &= 0xFFFFFFFDu;
) g2 Y" ]& R! D5 P* b4 J2 t* M                //paramSet.opt &= 0xFFFFFFFCu;: n' k  @2 w7 g. O  I
               
- T  X9 M$ O7 i6 l2 H7 R6 i6 V                /* Program the TCC */
( y( J2 J' t2 Y% L5 A                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);& J; M7 B" g+ ^4 e$ {

. {. K0 J/ z# h' K2 c! {2 g                /* Enable Intermediate & Final transfer completion interrupt */# |* f/ z6 r" P8 O- s$ ]
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 s# L* K+ i6 M                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: j) b- ~1 k4 n% f4 j" N: l$ v
3 C& B  W2 U' [- A2 `$ ]3 u                /* AB Sync Transfer Mode */
6 {5 I, C3 B$ S9 v9 L; Z                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" ^4 L" R5 P- Y) v
               
/ m$ V6 A& q, C) z3 R( X                /* Program the source and dest addresses for master DMA channel */
: \+ F+ A2 O% s( o+ {* V( D                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);. k& U" H4 C) s0 ~* I9 G
                paramSet.destAddr   = (uint32_t)(ping_buffer);. p% }" l& c2 M: ]9 O! v& K: ^
* c1 M# _' z# e( @
                /* Write to the master DMA channel first. */; b; j/ R' k, j. B  {4 Y4 L7 t# D
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);) ~8 ?& @# J! A, I6 q/ Q: i. \
    }       " m: c9 I" _. B8 i# I' T* K( W2 N  [

9 P" L9 \& }7 M1 `* }8 }6 [        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ w, ?3 T& l' D* _$ g& J       
! ~* s  J7 |% u% p/ s$ y/ Y& i    if(result == EDMA3_DRV_SOK)
+ O( d! Y5 w9 l( M# F. _    {
2 e2 l* l: D( U% h0 s% B# f            print2arm("edma3 driver init success.",0);  b# k3 K" L! K: I% ]& `8 @
    }
+ H6 x! a* o7 P% ^}
- u: V2 c7 z8 H2 j- `& `- h: v$ D# [  x* Y+ _. m7 C$ t

) U5 q0 C5 `- d/ E6 N: {EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 ^. B8 U5 p3 q, g) Y
( c- x. z3 |: e% X3 U
5 @* Q5 Z( D+ R% q/ M9 q( R
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:472 ?& G9 q' v% H/ ?, m, z) x0 {
每次DMA传输完成后都要再次使能传输

, V: H2 g% l1 L  Q- b9 T9 b* U1 C2 \原来是这样,我明天去试试,谢谢了!




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