嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% }! a* d; r% S% ^% [( {" }0 X
#define  PING_PONG_ACNT          1" G) d- y$ Q% u0 n# Y
#define  PING_PONG_BCNT          8*32*40
4 E! r9 t" b$ i; G/ l" g. z//#define  PING_PONG_BCNT       1 * z% ~' R! J& Z+ ^% R/ c7 j
#define  PING_PONG_CCNT          1( l- b, d: C$ i* S; W
#define  MCASP_BASEADDR          0x01D00000
7 V, y$ o- G* y1 ~: ]9 i#define  Mcasp_RXEVENTQUE        (0u)3 ^' I1 w8 e- e+ G( P# l
" D- s5 h1 m  e2 r+ l, g
/* OPT Field specific defines */  _) a+ \; I9 O6 L
#define OPT_SYNCDIM_SHIFT                   (0x00000002u): R! V" W) H- ~% K/ N
#define OPT_TCC_MASK                        (0x0003F000u)" Y+ S/ o1 e" z- i8 ~+ i6 r1 P
#define OPT_TCC_SHIFT                       (0x0000000Cu)
  n6 G9 q- e) k, P) Y" n/ [: q1 a4 I#define OPT_ITCINTEN_SHIFT                  (0x00000015u)' S! Z8 Z* Z  \# w
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
# H5 Z3 _( s2 g% @; A% t
. {( _( c) O: `1 Ychar ping_buffer[PING_PONG_BCNT];
8 j& x! T1 N- D8 H% L- h- H5 V3 I" Kchar pong_buffer[PING_PONG_BCNT];" I9 x! M9 j7 ?5 G+ m! i

- o" G# ^. H# u$ q- T6 D3 ^, b: w$ I- I

) n4 [% Z5 O/ @5 B0 W( R" E" m- u% Z* s
static void ys_edma3_init()
& l* L. d4 `, D0 G2 u{( [) b5 N0 [0 t" @# Y4 r% S
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 W; Y3 a9 v, d/ T) n) m
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;7 v# W1 O) Y, O  b
        EDMA3_DRV_Handle hEdma;
6 {7 ]' a. n, u# H; Y5 m    uint32_t chId   = 0;: k: i% i/ |/ h% t
    uint32_t tcc    = 0;) e' [  A2 K: b7 g+ ]9 E8 n2 g

+ D9 M) p( b% N" P) }- P: H! {    print2arm("edma3 driver init...",0);
1 x0 O1 o2 W4 ]. o. N' Y' L% c  I# J" D4 D9 e  K1 q  ]
        hEdma = edma3init(0,&result);, m) I. H, n; c0 w- J# w
        if(hEdma)
& t8 H( m- q7 z$ T* L% o        {
" b  j+ V0 F, C) ]2 Z. l                print2arm("edma3init() Passed.",0);, ~$ ?/ ?+ N, w+ h
        }) z3 D, w7 W/ P3 U7 ^1 O; f
        else
. l7 t, ?; Z2 c' j& a5 ?( S        {# O2 J* w3 b3 x7 `1 V0 R
                print2arm("edma3init() Failed.",0);
6 F, u( h' P/ h+ E: n$ c4 E        }# _$ [0 S) Q# d) H* ?
       
+ ~$ L1 ^6 O* }" a        if (result == EDMA3_DRV_SOK)
1 u, V% O/ l; j3 A! k: ^    {1 A  d3 F1 @# g8 @
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! c7 M( R: W( l" ~. r! W9 H                                                       (EDMA3_RM_EventQueue)0,. `5 U8 j: Z1 m* p2 _  {, Y
                                                            &edma3_isr, NULL);
0 Q( h; g1 |0 \! T- k    }2 p3 T. L1 _6 ~- J
        ) X% j  M. g( P2 n" _5 `
        if(result == EDMA3_DRV_SOK)
7 G( }; a( a1 B) R        {8 ^( K' N* V/ j" {- y# J
                paramSet.srcBIdx    = 0;
/ i6 O- A+ `. K( H5 H                paramSet.destBIdx   = 1;# l7 M4 }' n# o- \: q) B
                paramSet.srcCIdx    = 0;
( i  G9 A' j+ G$ H2 w' |( _                paramSet.destCIdx   = 0;
" o5 M* B6 c! p                paramSet.aCnt       = PING_PONG_ACNT;
9 \9 @6 G) O" B; A4 _                paramSet.bCnt       = PING_PONG_BCNT;
0 ?# Q4 _6 K$ N/ M2 g' m! l                paramSet.cCnt       = PING_PONG_CCNT;3 |5 G$ y/ q: z# _
               
, u* M6 B8 d- {% z$ ~2 U                /* For AB-synchronized transfers, BCNTRLD is not used. */
  I0 R% R  Q4 ^% |' Z8 `7 u- w                paramSet.bCntReload = PING_PONG_BCNT;
( s1 p3 z: t! W- G! X" j
/ g! @( i9 ?  g9 F& A8 w: R" o, w                /* Src in constant mode Dest in INCR modes */$ l; v. Z1 N: U1 w! W8 f# p+ A
                paramSet.opt &= 0xFFFFFFFDu;
8 f/ r( |! o; j+ O                //paramSet.opt &= 0xFFFFFFFCu;$ L" L. w. n* n7 j$ f$ p
               
' H* B) [) q! V: o' Z                /* Program the TCC */
% l" I# M0 y" C2 N  _                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 j1 [; j  {7 [; Z- N

2 X: A+ Q( F8 |4 o2 Q                /* Enable Intermediate & Final transfer completion interrupt */- A3 `/ J9 e; P" w9 |- O: T
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% k$ r0 s' G" Z2 O# c* x
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 O6 r6 `3 x1 B. p+ }9 c1 B8 O: O- T! J1 h+ E: n6 g* F4 \6 T" h
                /* AB Sync Transfer Mode */
: ~) }, x: O9 c$ C: F                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 i2 Y, o# O" R- Z- R5 {- l3 j
               
( S) M% m: w1 G% U/ }                /* Program the source and dest addresses for master DMA channel */
/ z6 Z( _3 T, Y9 X                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);6 H! N% W% ~( Y- S0 E' r
                paramSet.destAddr   = (uint32_t)(ping_buffer);
( M# S; y0 i0 |$ |% d/ T. z6 l- d% j/ f7 D: `
                /* Write to the master DMA channel first. */$ J# j8 q7 m; ?% N5 d5 ]
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
4 o' q) O! x0 p/ J    }       : j' P& a$ k1 q% {" z- z3 S# B
; W: l: p. r( ]: k1 `
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 a7 x( V) g9 K1 a9 m        ; U* Q8 ^, T) o' I1 x% b: J% s
    if(result == EDMA3_DRV_SOK) ( ]) f) P% ~5 T
    {: j. E) w0 Z" l. {  S
            print2arm("edma3 driver init success.",0);4 A7 j8 r* \! H  O$ u+ c
    }
( R3 Z9 Z8 a) Q}
. }+ n! V: }+ D  z3 }1 c& N" s5 B7 O; Q" s. X$ }! K

( v/ M' y: f1 [9 jEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。7 J5 ~8 r5 @- q* x& k) Y+ I% j4 A
8 u" ~4 r( f3 O5 j: O, o, r) X
, q, X! i. `7 P# \- E+ \+ ~& ?

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
$ M0 Z# }; E* f3 q% M, ^( z每次DMA传输完成后都要再次使能传输

$ L; M$ i5 Y# Z* }原来是这样,我明天去试试,谢谢了!




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