嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:% C  `5 }8 a) t2 y* F: n: L
#define  PING_PONG_ACNT          1
9 R6 P; E* H6 @" v#define  PING_PONG_BCNT          8*32*40 3 s2 V$ C* h- r. `+ j
//#define  PING_PONG_BCNT       1 7 w7 d+ c0 e- T0 v) b& F% m1 @& M$ _
#define  PING_PONG_CCNT          1
) p1 w2 m. }; M- b% e: X! v#define  MCASP_BASEADDR          0x01D00000. X- C4 S7 t* M
#define  Mcasp_RXEVENTQUE        (0u)9 Z6 l: D) @8 @

& S$ p1 N3 X3 _. y$ G0 G/* OPT Field specific defines */
& |' C  o( c/ i8 R5 R+ O5 n0 s#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
* g6 v/ e' Y/ q. Z#define OPT_TCC_MASK                        (0x0003F000u)% C. w' Y8 \& A" m( M
#define OPT_TCC_SHIFT                       (0x0000000Cu)
, Y7 t3 e4 ?# Z6 X% Z* Q#define OPT_ITCINTEN_SHIFT                  (0x00000015u)8 D5 `4 Q, b8 \
#define OPT_TCINTEN_SHIFT                   (0x00000014u)  }" W9 O. Y3 l& r+ v8 G9 Y# E7 E
5 r* x& @+ m1 I) l& }
char ping_buffer[PING_PONG_BCNT];
2 t$ U8 h* B) ^5 w+ P* y7 w5 _/ Jchar pong_buffer[PING_PONG_BCNT];$ x9 i4 m* ]  i; ~

  S% q( I+ u8 e! C
; `" ^) l% Y' t+ y
! J; ^9 f4 N9 a) F4 J) m  L& X$ G, w" z8 A/ ?' B: T2 v. s3 \
static void ys_edma3_init()% M6 [7 h  F7 j% [
{! s8 I( W8 h* y% b; L% _( T% Z
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- y2 U8 W" j. {2 C' u2 W
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ Q' @( }3 j6 c! D- t# X- U        EDMA3_DRV_Handle hEdma;( M! |% P; C3 y5 v6 f: b5 E( @- I
    uint32_t chId   = 0;: [; G, O# W/ m) T
    uint32_t tcc    = 0;
: B3 G* L# b! ?* U: s& Z# g" @; F: F9 I. ^: I. S5 `  x
    print2arm("edma3 driver init...",0);; Z2 T5 m/ B* x( j3 x  d+ y3 k
$ I4 o# e+ B# s& y2 C6 k$ x
        hEdma = edma3init(0,&result);
' g' O" h/ W3 z        if(hEdma)
9 j3 G9 V+ s! L2 {        {
# _. K" `# h3 i, c: _                print2arm("edma3init() Passed.",0);
+ T0 n2 K& `3 j; ^. n3 @! N2 {        }8 o! E4 X6 y3 C3 r* [; W+ N
        else6 K- D/ S) @7 U0 |6 D
        {
* ?$ t2 ]1 ?& Q# V                print2arm("edma3init() Failed.",0);4 D! Z+ T( P! }0 H% C- X' w
        }+ i3 N( \, E. C* K/ P
        & @5 m* p2 F% A$ L6 W
        if (result == EDMA3_DRV_SOK)" Z$ z  i8 N; E! N( Z0 P. a
    {7 L- {: ^7 q/ E- N" l
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% ~6 S4 r' [" z5 U/ p) v
                                                       (EDMA3_RM_EventQueue)0,
! s% c( U( s" k# l  F                                                            &edma3_isr, NULL);
7 l/ }" e8 [4 v/ R( N9 N9 A% E! H' B, d    }; C. b- e0 N( ~+ o4 j% h
        0 p  T3 s: B: w* ?0 D
        if(result == EDMA3_DRV_SOK)9 h3 C* w8 |2 C. b6 h# c: ?$ M
        {
# y) B9 p7 K( R, m                paramSet.srcBIdx    = 0;
5 d' y5 m& h- F' X; a" t0 W% j                paramSet.destBIdx   = 1;; ^  b4 s4 K7 G, j
                paramSet.srcCIdx    = 0;
  A' k- _0 g' F: ~3 ^4 _                paramSet.destCIdx   = 0;, N7 I9 P# J- q
                paramSet.aCnt       = PING_PONG_ACNT;. K" q9 e" r7 p8 T5 ]
                paramSet.bCnt       = PING_PONG_BCNT;( `& A/ l8 a. v9 I& O5 o2 s  S; x
                paramSet.cCnt       = PING_PONG_CCNT;6 U, y* C; `1 G% h8 f4 Z/ n
                ) u# U. g6 C  c( Y2 Q
                /* For AB-synchronized transfers, BCNTRLD is not used. */5 i: |2 R! `# V# z8 ?* o* f) v+ S2 g
                paramSet.bCntReload = PING_PONG_BCNT;
3 w/ C+ a# l7 |/ f
- N& G5 s9 s# l) j& W! N! }% K3 H6 Z                /* Src in constant mode Dest in INCR modes */
1 V# c- h+ g- U0 v                paramSet.opt &= 0xFFFFFFFDu;
0 _# ~$ F# Z6 _. i# z1 K                //paramSet.opt &= 0xFFFFFFFCu;
5 J+ N& ~; P) n               
* B4 A; P& |+ Q+ L8 t8 V% F                /* Program the TCC */
. S9 ~) A: T0 w: m+ e                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);' ]- d, {) O8 n) w+ @5 O( |

4 x* e: @+ [, y1 \# M- p                /* Enable Intermediate & Final transfer completion interrupt */! t6 J1 d8 d9 |& e) P2 @' a7 H
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
( p# d4 z2 {0 P# w. m                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);3 ^* C% |; S% @* g, U) U- [9 R! A6 ]
" U4 O4 v  t% [# ]; V# v; w
                /* AB Sync Transfer Mode */
- ]6 p% w: L. B5 o8 r                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ ^5 R! X6 \; W2 V( D& ~               
0 \, s/ b4 u8 o                /* Program the source and dest addresses for master DMA channel */
! {7 ^5 H& G3 w, V: b% X                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
9 I  c& K- {/ [1 c+ E" l                paramSet.destAddr   = (uint32_t)(ping_buffer);
. K+ ]3 B& ]. ^5 p. L
) t% y( W9 Y7 N8 G6 F: t" L8 [1 T                /* Write to the master DMA channel first. */1 ~# y' |' v6 p0 x" t* Z2 c9 y
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
0 t2 S0 [! G: t( ?3 p& u6 j2 t    }       0 |+ D& B! n. ~6 i7 c) C9 `" T; o2 L

2 `! N- B9 a1 c9 @$ l0 m        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. ~: ^! }, \: W8 l4 W       
* g( F  [) Z& I9 k. h. F    if(result == EDMA3_DRV_SOK) 4 B' y8 |" N% }3 b% p# p$ Q  a$ @" o) J
    {+ X1 \- Q% \- ?& t% K. g1 w/ }0 I' [  A
            print2arm("edma3 driver init success.",0);
& B3 j; L9 g: h7 ?* h3 O3 k$ \. b    }
# |8 X- c( z. d/ |5 y! O5 H}. @$ q9 p9 E. T, M5 G; {; q* }2 {

/ h  V% H! [" h# P
$ {) x8 y6 a' _* f: W' j5 WEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。2 p# L& `7 j3 j6 r

* k; z5 r: c! [5 d% c  A0 D6 O) F, m, Z+ \2 h) J

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- v) |! C; Y8 B0 u每次DMA传输完成后都要再次使能传输
" C5 {+ e: t, ]! @. X, Y. m) r
原来是这样,我明天去试试,谢谢了!




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