嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 b9 W) h( K' a& @& m
#define  PING_PONG_ACNT          1$ J& W: w5 Q7 S4 C
#define  PING_PONG_BCNT          8*32*40
+ |5 ]9 O3 X7 m$ K7 s//#define  PING_PONG_BCNT       1 ; i) U# C+ ?& N5 I
#define  PING_PONG_CCNT          1
. o! @' F  l8 a6 \#define  MCASP_BASEADDR          0x01D000009 B6 g  z- }: b% V# G. j
#define  Mcasp_RXEVENTQUE        (0u)5 y! ]* ?1 I5 z! v- _8 K

: |4 n. b+ t" z4 m# S' x- F4 u/* OPT Field specific defines */
+ u* U0 f) ?: a" d#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" ~5 r% |. R. E#define OPT_TCC_MASK                        (0x0003F000u)! U$ M8 G; A: `7 r1 G7 O, G
#define OPT_TCC_SHIFT                       (0x0000000Cu)2 z  |2 V8 \0 Q% S# [
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
6 [/ w# Y, E0 V6 a#define OPT_TCINTEN_SHIFT                   (0x00000014u)8 @! G! X, [7 z  V
) R# S. n3 u. \
char ping_buffer[PING_PONG_BCNT];
" b/ W* @# n3 ^* Ychar pong_buffer[PING_PONG_BCNT];; ]5 o; J; \5 {' L
: p: ^& J! z" f0 I! E6 b! z+ ?

0 X9 k( P0 [- C$ ]  n% W& T5 H9 _* G' h" a1 v# |
$ Y5 u4 u1 }% k
static void ys_edma3_init()
; t- Q' E* n" k/ V5 R& l% X{& \# g. g* A8 W4 K
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, g" w, N0 z+ X& d. a, G, c* K        EDMA3_DRV_Result result = EDMA3_DRV_SOK;  ]2 [- U* c' \. \9 N# L& y
        EDMA3_DRV_Handle hEdma;8 b; j* X' k% ^  l0 f) N1 T
    uint32_t chId   = 0;
4 s) Q# H  m5 H    uint32_t tcc    = 0;5 k7 [( j# L( p! \; K5 W1 d) j: A
! i8 D  \- ?. U) T% J" _- _0 ?
    print2arm("edma3 driver init...",0);
+ H6 j3 x3 T( t& z0 F  X- X. M0 y4 [1 h8 }  S) N4 A' I. x
        hEdma = edma3init(0,&result);
( L$ K6 O1 ]5 l7 o        if(hEdma)
0 ~+ F1 Q! E9 Q( B7 m/ F, x2 |        {8 }' I3 {" Q2 {5 G) K# f. n6 L/ |
                print2arm("edma3init() Passed.",0);
( D; J6 B. Q# e1 U, l  p1 E        }% ~" Y& b0 d' S: ~: `* x
        else
* ~+ l% ]% }2 u' f3 l7 ^/ J        {/ J7 ~$ P% \2 ~
                print2arm("edma3init() Failed.",0);7 F$ T) O  m* ]; n% G. [8 J
        }
- Z* F; V% ^' \$ s6 z8 n7 n       
. h  t2 |5 n) q- ^5 u        if (result == EDMA3_DRV_SOK)
7 f& u" D0 O0 }2 H5 L6 w    {
/ ~0 f, y) f$ L                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% n2 f* X' v1 l, }9 p' Z
                                                       (EDMA3_RM_EventQueue)0,
& ?  z" R; l( C: ~. `& G                                                            &edma3_isr, NULL);7 U7 ?* {7 x+ s) V4 F
    }6 X& q  e- ^$ Z3 ^8 Q
        # z  x- M. F/ j$ P. [  y
        if(result == EDMA3_DRV_SOK)
3 F. e2 R  m1 i- Z; e        {. h- Q1 V) }  e) C
                paramSet.srcBIdx    = 0;1 N# T  P: r$ [+ f! W
                paramSet.destBIdx   = 1;+ h1 U( l5 _, o, G6 O5 F$ d
                paramSet.srcCIdx    = 0;
1 x# w# ^4 x* [& v                paramSet.destCIdx   = 0;2 @4 U8 f9 z/ i2 U
                paramSet.aCnt       = PING_PONG_ACNT;
; z+ ~$ H( S5 i6 e( u                paramSet.bCnt       = PING_PONG_BCNT;
; ]" I8 z" e9 B0 T                paramSet.cCnt       = PING_PONG_CCNT;8 i8 T0 \% P+ O8 s6 k! ?6 X1 c
                4 R* V0 u8 m8 p5 B0 Y4 x
                /* For AB-synchronized transfers, BCNTRLD is not used. */
0 ^* w* o  P. K                paramSet.bCntReload = PING_PONG_BCNT;- v( v3 o7 C( Q
( ~: s8 X4 J4 Y9 j- ?7 X+ ~0 c
                /* Src in constant mode Dest in INCR modes */
' x3 f7 u4 k$ E' e2 }                paramSet.opt &= 0xFFFFFFFDu;
4 d9 N* F# t7 n9 t4 ~                //paramSet.opt &= 0xFFFFFFFCu;6 l" M- g' [' w7 R0 X) H" e
                " ~. E3 F4 r" M- u* |% ]. ]
                /* Program the TCC */
: N# M' g1 \% s) j. g3 k                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);# ~8 h/ D8 w& o" N2 l

0 ^% a+ |. H) g2 E1 c7 k5 J6 {                /* Enable Intermediate & Final transfer completion interrupt */
* }) l- h8 E( w5 _                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 w; q; s! k7 a8 d' z: K( `
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; D. b+ ]; S/ U: C  o: x" P$ V' ]; M, Q  F. r0 n
                /* AB Sync Transfer Mode */
  @6 p. Q2 Y! F                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);, ^$ d6 J" `. S# u3 l
                5 n! j' I- B8 ^, V
                /* Program the source and dest addresses for master DMA channel */5 K& s% j3 w( ^. G2 X/ Z
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);  E8 {) \: R, N. ?' w
                paramSet.destAddr   = (uint32_t)(ping_buffer);
. V8 J+ M! ~; T, Z7 p$ N8 s- b" y: b2 ^3 w2 B- \5 ~
                /* Write to the master DMA channel first. */
& |) W, q& i+ k2 V! j& m                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 Q. w: o! B; V9 Y3 O    }      
4 d6 F4 H' b; g3 |
: D; B. {9 c. i4 ]        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: v* g! v$ N) o" i. P. B+ X4 ^% i
       
, {" [( ]$ e) k" U9 ]9 Z; N, p    if(result == EDMA3_DRV_SOK) 9 g7 ~$ V2 ^8 j
    {9 M- R; T& I: `' R% V5 V
            print2arm("edma3 driver init success.",0);
" y1 m0 V7 U. Y: ~, |- h    }
& ]! L3 y6 {# _( [/ ~2 b( s}
  H: @; @" Z, T. _" P2 D7 N3 R0 v( ^, p* _5 M' V5 G

. R! f# M: A# r9 B. p* HEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" l- S# g" F0 U4 y! s, A) p" F

+ T# f7 r5 r/ o; W# o( Y
! J6 L/ @* S) l) `7 p
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:476 I, p5 N+ \1 @! z+ `* F' b$ F, u
每次DMA传输完成后都要再次使能传输

7 \8 e% A2 a: m; n; z7 `* f, G原来是这样,我明天去试试,谢谢了!




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