嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 v# h) p( a4 \1 B' F& W* a2 c
#define  PING_PONG_ACNT          1# n% T: h( W% p. M1 ]  W5 V8 h/ K
#define  PING_PONG_BCNT          8*32*40
, f) L& ]( s0 p( C% f//#define  PING_PONG_BCNT       1
1 \# G  Y" m, [% V$ [$ q/ K4 [0 u#define  PING_PONG_CCNT          17 ?0 u8 c" P: b6 N
#define  MCASP_BASEADDR          0x01D00000
* @/ L' R* F7 S+ q. L1 G( H$ S  b6 t#define  Mcasp_RXEVENTQUE        (0u)
( _. W- q% k% |8 ^8 ~
6 F# @2 Z; \+ M' `1 f# D, |, U/* OPT Field specific defines */  H% ]4 ~# P; v/ [; D# E# V
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 Z5 D3 J' F' ]) j1 M6 W#define OPT_TCC_MASK                        (0x0003F000u)
0 u- o" f1 c, z#define OPT_TCC_SHIFT                       (0x0000000Cu)
7 s& T3 |% s4 I, [+ q#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
" b& w9 [7 {. `0 A#define OPT_TCINTEN_SHIFT                   (0x00000014u)
& p$ z! @6 v3 a  N8 ^" U
0 a3 b/ t. m& Q, D# G4 ^  b& tchar ping_buffer[PING_PONG_BCNT];. y. R# M1 v0 o2 g
char pong_buffer[PING_PONG_BCNT];) K  F& \: D: X5 A5 d: J3 t: Y( q2 r
+ u, L) u& p! Y; ?

' f0 w, [: z1 q7 U8 p$ p: Y0 w, q" ~( ^7 U
1 [4 p) t) T, J  K
static void ys_edma3_init()
3 t7 C. y- a; Z- P5 w4 \! m7 M{) S' I$ z8 H- k. F7 m9 [* c1 `
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};% K  }7 @* g# v: p
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;- q; X. l( L. J+ D) A) X0 s
        EDMA3_DRV_Handle hEdma;
5 ^$ \! E/ l# c4 u, X- H    uint32_t chId   = 0;+ o* e0 I  i1 R: I
    uint32_t tcc    = 0;$ }( l4 z9 t9 V6 b
6 U1 G2 d' |0 F, k9 {; b
    print2arm("edma3 driver init...",0);
' J( }3 G) t3 W' U* G1 c$ f2 P. o1 e3 G* e4 K2 S
        hEdma = edma3init(0,&result);" ^( Y, _- H4 ~
        if(hEdma)
5 ~/ q) ^7 C+ [9 M6 L) p( g        {" D8 C4 l/ w- I6 i4 Z8 v0 Y
                print2arm("edma3init() Passed.",0);, K9 X( E; l- k
        }  ]$ r- x$ @& ?' B+ X0 N5 u
        else1 |1 D# V7 u# B0 g) h5 q1 g
        {
+ N' r0 c- S/ K5 y; b2 C                print2arm("edma3init() Failed.",0);( ?7 {8 _9 z+ a. n" N* U
        }3 a9 [1 |  V" m6 B1 D* T* ?
       
, d6 p5 U6 n* Q! P* F        if (result == EDMA3_DRV_SOK)8 X, R! ~2 Z  S
    {
& T7 e, H0 l7 ^  H% V: P4 _6 d                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,7 E  l+ D- E, T$ q! @; g
                                                       (EDMA3_RM_EventQueue)0,
6 r% t) \+ t1 d                                                            &edma3_isr, NULL);; P& x* L# `! c. I9 c
    }
5 L) X& U9 x: o3 P       
" S% T7 C' i0 |        if(result == EDMA3_DRV_SOK)
3 X2 d. w- x6 M2 y; U8 V% `1 m3 @        {
- p1 k& f' _- j2 n                paramSet.srcBIdx    = 0;
3 B2 F6 y6 S: r: f$ d6 R                paramSet.destBIdx   = 1;/ s2 x  K0 p3 m' H  Y
                paramSet.srcCIdx    = 0;
; X! n2 C5 B8 p( z6 \2 e1 i: g                paramSet.destCIdx   = 0;
' f; W! a5 g+ u2 Y; s& x                paramSet.aCnt       = PING_PONG_ACNT;
3 L3 m5 c% M* R' \5 Y                paramSet.bCnt       = PING_PONG_BCNT;; y, A* @3 Y+ ?$ O3 a7 C, F2 |
                paramSet.cCnt       = PING_PONG_CCNT;9 a. b  x" j. p: j9 g: x1 G% M0 p' m
                3 ]) ]" N" J2 ^$ l. u
                /* For AB-synchronized transfers, BCNTRLD is not used. */
! n$ }/ W3 |; r. J/ u) n                paramSet.bCntReload = PING_PONG_BCNT;
8 j* g8 r6 p" t7 V; C9 T9 A
, Y- S$ P3 x1 W8 ?. z+ z/ D& F& i                /* Src in constant mode Dest in INCR modes */. G( l& R7 X! \' g/ W( u
                paramSet.opt &= 0xFFFFFFFDu;
6 k  ?4 K" G) o                //paramSet.opt &= 0xFFFFFFFCu;
6 k  I& [0 m* S. d1 O                ! q  P& v) D/ K1 r
                /* Program the TCC */) z- |# C( Y0 x; r6 v
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) G' A% c6 G& a2 W, e/ ?
; _% P' ]- T" N- p. n1 o                /* Enable Intermediate & Final transfer completion interrupt */
+ ^6 _4 M2 v  v, S% d$ \$ J4 m                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, s0 K5 K# [: F                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; f5 u# z7 m3 y: N6 H4 {3 X1 a1 g+ q2 ?: W% S- S
                /* AB Sync Transfer Mode */
1 t% j. S& h5 m) m4 Q                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; o6 O+ N$ X1 j6 x& G5 z                4 h  M  v( B9 Q8 h' P
                /* Program the source and dest addresses for master DMA channel */  D: P$ t- l: ]" Z
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);6 L9 q3 b7 W- @& ^3 J" m, ]
                paramSet.destAddr   = (uint32_t)(ping_buffer);6 L5 w+ z+ Z5 M( n0 L

/ a5 S0 ~( w! Z6 c8 j. e                /* Write to the master DMA channel first. */0 g) [$ G. B" c: [
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);/ D  D1 s6 |$ C! `8 H( I
    }      
/ j" Q( S  B$ [- B  z$ x6 J3 _1 a. E# \3 X
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);9 c# j3 C' J  t3 v$ g! A
       
% F: D* p: U' N+ f0 x0 a: q* n    if(result == EDMA3_DRV_SOK)
$ d  c% I- R; O8 s    {9 Y! E3 n. ^# I# z' X4 p) B
            print2arm("edma3 driver init success.",0);
* H  f  F: U, u* k    } $ D9 k# H9 |: K# s( ]- H
}( e4 w+ M2 p7 ~  p& q3 h# A! }; e
# d' A3 f, j; t- C$ w

# d6 u7 C. {( W3 \  ~/ QEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
! D. z! q( Z9 [4 ]: g0 S8 l! E8 ^  x- D9 G# H7 @7 ]9 R; g$ a$ E5 W2 U6 U

7 ^+ \- @0 @4 Z2 ?# @/ W
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:477 t- v7 t7 A, O- C9 i9 `4 s
每次DMA传输完成后都要再次使能传输

) ?6 F; d. }% Q原来是这样,我明天去试试,谢谢了!




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