嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: G4 c$ d$ e. M$ |/ b4 e' e- C#define  PING_PONG_ACNT          1& _, j7 `( f: `) q' ^& g
#define  PING_PONG_BCNT          8*32*40
/ g& F1 H4 U, C  I2 v. B9 I8 B//#define  PING_PONG_BCNT       1 ' J* }+ q5 D  {9 i+ X# ^* h
#define  PING_PONG_CCNT          1" x* A9 i5 q$ r
#define  MCASP_BASEADDR          0x01D00000- {* h! N  i& n/ d
#define  Mcasp_RXEVENTQUE        (0u)8 y  d& {( b9 V
. T: [9 S6 @4 o- f
/* OPT Field specific defines */
4 F# E- H! c" n+ ~) E, N#define OPT_SYNCDIM_SHIFT                   (0x00000002u)) `  N9 {; G) }1 w, F4 Z; v  @
#define OPT_TCC_MASK                        (0x0003F000u)
. B# @6 _- M2 {#define OPT_TCC_SHIFT                       (0x0000000Cu)
- T3 F! E0 D% [9 ^1 B& n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
/ O( M" z, E- E5 z( z#define OPT_TCINTEN_SHIFT                   (0x00000014u)
2 u( u, w6 ~* K$ ^, [4 ~/ u1 n1 w8 l8 x2 o9 Y- g+ O+ d2 ^
char ping_buffer[PING_PONG_BCNT];; W6 n5 K  l! i. [3 V0 s! U
char pong_buffer[PING_PONG_BCNT];
1 t: z" a6 I1 s6 n' ^( P
9 k0 q5 q$ h6 ]+ D! S$ u1 J# s
2 q) O, L& Q: C2 M! A  B4 F0 b  u% E8 C* C( ?
- u) u) ]  n* ?# i9 O
static void ys_edma3_init()1 I( g+ q$ }+ @- f5 O
{
! e( M. q! @3 m  D  Y        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};# I8 `, \. t0 @
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 j# h' _; s5 Q, K
        EDMA3_DRV_Handle hEdma;
8 d. K& v" O, G- z    uint32_t chId   = 0;9 T+ x, \+ ?2 V% j8 w
    uint32_t tcc    = 0;
( s- N$ l6 X5 @3 n" T: @$ [- ?  C' }6 b$ D% E
    print2arm("edma3 driver init...",0);7 N. ~. A9 B( `8 q7 ~

0 [* E" J* |! k7 E        hEdma = edma3init(0,&result);: @# R* ~. [3 \! v
        if(hEdma), f, l- I. E' a( y3 k3 z5 C! W/ D
        {
! O: d9 t! p, V' `                print2arm("edma3init() Passed.",0);
) h4 V# a, R  h# L        }
+ n! o8 p" t1 v+ h0 h5 W        else$ ?4 h' n( K1 V
        {7 q: c+ f: o6 Z4 z
                print2arm("edma3init() Failed.",0);
8 C1 y$ M1 ~5 ~2 z- r6 |        }
. Z' w3 c: ]$ z' ^8 O        + o, [- G2 a/ t" Y) ]1 r
        if (result == EDMA3_DRV_SOK); L' c+ J* k: @. h; u% A1 C# Z
    {
  n* `, m9 @" L                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,) I! e5 _5 w0 g& w. x
                                                       (EDMA3_RM_EventQueue)0,1 s" C  q3 D% s( l& s
                                                            &edma3_isr, NULL);
+ c+ @+ C2 A5 q* b' M9 {* J& N6 W    }# w+ {7 ?$ A( M1 t4 S, W6 K
        8 L; Q7 k" B( t! \5 P. H
        if(result == EDMA3_DRV_SOK)
) m- I% t7 _) c1 \* \9 m8 K0 M        {8 b0 m' B9 O7 U3 Q  I
                paramSet.srcBIdx    = 0;3 i. a5 F6 Y' D- ]3 U% e! N
                paramSet.destBIdx   = 1;: v1 i( H) p9 t" ]  D
                paramSet.srcCIdx    = 0;  K6 r5 I  Z: a3 a" ^
                paramSet.destCIdx   = 0;7 s/ g% A1 H/ e; _3 s- Q
                paramSet.aCnt       = PING_PONG_ACNT;
/ W  A0 K7 l" v7 j' g4 v9 i                paramSet.bCnt       = PING_PONG_BCNT;
$ i" c" v7 Y; ]& h9 d                paramSet.cCnt       = PING_PONG_CCNT;
8 |" ^2 |# U$ i+ c: h4 z, ^0 x4 c+ ^                ! {& V5 k! x/ i7 b( h
                /* For AB-synchronized transfers, BCNTRLD is not used. */
7 D3 g+ R5 {- k# d8 D                paramSet.bCntReload = PING_PONG_BCNT;
* A! t1 g% }$ d( y7 w1 F: P- V8 [% P; z9 T
                /* Src in constant mode Dest in INCR modes */- I; V: q2 T" g+ z
                paramSet.opt &= 0xFFFFFFFDu;/ s( a0 _. ^( v+ ^, D9 s4 v
                //paramSet.opt &= 0xFFFFFFFCu;' v) r3 y$ B& A; |4 G$ {, N8 |
                ( z# b" x' I' U' B. w  E! x
                /* Program the TCC */  G* _5 D6 @3 Z- k+ @2 _
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);* v9 |5 c8 k* ^
0 W- D- I! x9 S4 E4 L
                /* Enable Intermediate & Final transfer completion interrupt */
4 I1 L1 Z) n8 I- g2 n                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
8 F7 {- |9 `) y0 z3 o$ g7 K                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);6 S  b7 o; }3 `! E* f- d5 ?

1 g# i" D3 A3 H5 N                /* AB Sync Transfer Mode */
" G( ?1 s; V6 D# k$ u% s+ i0 f/ Z                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);7 l9 q$ A; t5 A
               
7 T1 w" n9 n$ D0 _9 X- G6 f                /* Program the source and dest addresses for master DMA channel */- j* T+ [& c" j8 d" U9 f* O6 e' C
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);7 r+ W8 I; r& c- U2 C& K
                paramSet.destAddr   = (uint32_t)(ping_buffer);
! z) O: `  Z0 {! Z2 G* E8 Q& J( b( g, J( X6 ]
                /* Write to the master DMA channel first. */
! h  L1 b5 Y# p2 v. M# h4 D! s6 p                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
# O. k( k0 b* r1 d    }       5 E/ o( J: N1 ?2 t

4 V8 T0 _& N3 [8 x' F" c        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 M# E  I, u  `! A9 h3 H0 N        $ u5 V/ L7 g: N2 A( L2 f, D
    if(result == EDMA3_DRV_SOK) ) Q9 a, y/ W! z- v; Q; ~. x$ ~
    {
0 _) E" y, K: Y* @7 ^  o* \0 s6 }5 n            print2arm("edma3 driver init success.",0);5 L+ c8 ^& L" t- O
    }
& \! w! V! g- K& w, B}5 y0 D5 e6 b9 ]5 c

  R# J" w6 L; r! q# r' K$ o; h
- x! P5 f+ k; D5 rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 B8 C+ _# Z& X+ \- I! I% \4 |
; I, H3 E0 U+ H- O( b7 K
' f. h. b& b1 F
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47; \8 a7 g# c8 s, ?# }0 S/ j5 c9 ]
每次DMA传输完成后都要再次使能传输
' e" S) k( [" @4 y; h" g9 q
原来是这样,我明天去试试,谢谢了!




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