嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:- W% ?" @, V) e+ m3 m) i6 Z- g4 [
#define  PING_PONG_ACNT          1
3 g5 _& D( N, i# J8 i" h8 L#define  PING_PONG_BCNT          8*32*40 $ l; U6 t3 X3 }' ?
//#define  PING_PONG_BCNT       1 ( s' b2 `* [7 Q2 H- R
#define  PING_PONG_CCNT          18 Y, |( B6 Z5 W4 \& Q0 d' a
#define  MCASP_BASEADDR          0x01D00000
- ~7 p, r  K9 T* x1 f#define  Mcasp_RXEVENTQUE        (0u)
& B  ?) X6 {( ]9 J8 X/ z  x7 A  ?+ @/ n7 [- H, G
/* OPT Field specific defines *// X; B3 T( I' M) l: O7 E* B# n
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
$ ~+ d7 H' D# Z#define OPT_TCC_MASK                        (0x0003F000u)
- P1 E' z8 r) Q#define OPT_TCC_SHIFT                       (0x0000000Cu)) @! T1 H/ \2 @7 v3 ]0 v
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
( I( i$ L9 [6 r#define OPT_TCINTEN_SHIFT                   (0x00000014u)
9 P% ?! F8 e, C) G: ~+ _& y1 h# W+ R% c( W+ P: ]4 h4 y- \' E
char ping_buffer[PING_PONG_BCNT];
; E3 E3 ~: g; W% L, U3 J; H) d/ |6 kchar pong_buffer[PING_PONG_BCNT];
0 ~+ ~5 B9 i. m3 a9 Z  f9 v, k  o0 s

, C! A) b2 L/ y. P
, S; h9 {8 G5 d  W% D* q7 x8 c4 G
static void ys_edma3_init()' l; r1 k: ], h8 f7 Z. o% c* ~
{
& n8 D6 \. Q) Z        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 _8 ]5 y0 e0 l: v2 i
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;2 C  @: H  S0 u& T
        EDMA3_DRV_Handle hEdma;
9 ?  V# b0 }) c( A) ], D# f    uint32_t chId   = 0;% U# G+ e' f5 V; G/ `
    uint32_t tcc    = 0;
% X* Q" z+ o' \, n- q7 \' Y0 L4 u" F
    print2arm("edma3 driver init...",0);" h9 N6 `7 _. B$ n1 ]1 A& d* ?- A) u" g

  a$ z' t, R. ~, j        hEdma = edma3init(0,&result);* k( Y1 O) Y. ~- U8 n+ W
        if(hEdma)8 k; _  V' a: y" W6 a3 q% g* Q
        {
/ M# N& W! z9 |; n' s$ V                print2arm("edma3init() Passed.",0);
/ _4 U+ J' w) T0 I) ?) e        }
# @4 ]; b( w# c$ Q; R        else- A, E' u. u$ h* D
        {
) u- K- Z: R' C6 p% x. ]9 q                print2arm("edma3init() Failed.",0);* ?: \4 }; ?& u$ @4 b
        }8 ?0 j* O; i+ b, ]  x9 {7 g% {
        + H8 z$ Z# @) G8 }
        if (result == EDMA3_DRV_SOK), ]6 H) g+ F; O7 @  R; e/ z
    {# n* i& D! c1 o! j1 C
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 t0 {; F  ], V! Z  G% h3 c                                                       (EDMA3_RM_EventQueue)0,
- R* k+ q0 l  E                                                            &edma3_isr, NULL);
9 p" T0 i3 k) k) D$ R! E. e    }
0 p, r- C2 X: ?  _( S        . b$ u0 @) g: H" t5 o
        if(result == EDMA3_DRV_SOK)- g! j1 f9 s, I+ z9 d9 F, ?8 a
        {# @$ ]9 Y; _: {/ W# {7 R! p3 i
                paramSet.srcBIdx    = 0;
0 [2 a6 i: A( ~# ^6 F! C                paramSet.destBIdx   = 1;& J. [) z1 l! a7 u5 s
                paramSet.srcCIdx    = 0;
3 J* C; n% F/ L* F                paramSet.destCIdx   = 0;/ V5 F! @) [2 j1 n3 X
                paramSet.aCnt       = PING_PONG_ACNT;
/ P3 G! Q! W$ S) B. b7 q                paramSet.bCnt       = PING_PONG_BCNT;8 A9 N) h& g! U
                paramSet.cCnt       = PING_PONG_CCNT;
5 T' F1 q# O  e4 e2 H2 s) F  L               
+ f/ S# U( z8 C* Y5 i! K0 n                /* For AB-synchronized transfers, BCNTRLD is not used. */+ L2 _* }+ P' I; f2 J
                paramSet.bCntReload = PING_PONG_BCNT;! G2 T) T+ H3 C- ?$ Z! e

9 z) [0 f! s/ Y" X* g: p                /* Src in constant mode Dest in INCR modes */
. x- y6 K$ @" p& x                paramSet.opt &= 0xFFFFFFFDu;
/ r) u' j( i- E( R. U! n                //paramSet.opt &= 0xFFFFFFFCu;
4 ?9 A2 ~1 M0 a' Z, _8 A) t' A* ^               
0 V7 j6 D- H( @9 J+ K                /* Program the TCC */! R3 I7 A) G( i1 V6 H, `. q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: G6 C( F  W; N3 b
7 @5 O; s* g* Z8 v5 Z! C
                /* Enable Intermediate & Final transfer completion interrupt */
3 w* e. }5 _! c  v) L                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);7 @, x0 o  g2 ]$ j+ E, I
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);9 P/ J" n3 {+ E$ o3 z" a3 Z  `; z
. Y3 B: o0 ^0 Q9 A7 i7 q( j
                /* AB Sync Transfer Mode */* y0 o2 t; Z' |# J+ U& w- i
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
8 h! s( q3 |6 y: a1 [, j4 u4 I+ W  R' G                ( c( z4 B8 g* G7 @. M
                /* Program the source and dest addresses for master DMA channel */9 Q  G) ]- C+ j: H4 n# t' G& O
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);6 r. a$ T7 V; F- }  q9 b! @- z
                paramSet.destAddr   = (uint32_t)(ping_buffer);, K% T, L/ |8 ?& x

6 B- l# v/ j8 @8 Z; r8 }                /* Write to the master DMA channel first. */+ O) u7 C5 F/ w$ g( o4 \* R
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 a( b6 X' d: w# j# p
    }       6 z2 Z7 A( M7 N3 v& O
+ Y9 O! y! H0 F4 m; g: o- ?4 i& b9 `
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( f2 G# z1 \) \' P) S6 _
        ( K  [4 X4 E4 n
    if(result == EDMA3_DRV_SOK) 0 B" V$ D$ e0 b: k1 i
    {( X/ r: n. M0 M# L
            print2arm("edma3 driver init success.",0);, F+ r7 y7 \. [% n
    }
7 o9 V; `( |& T; V" m2 M* V8 \}% v# Z- A9 Y  W  D& j2 L- l+ y

; I/ \( V6 ]3 S8 ^" @' E' l" m
; M  E' [' S1 M  tEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。; K) ?$ D9 t& v' O  O3 t

2 Y1 U7 F6 v) }; p7 K# U5 U* e
/ G7 ?7 m" [$ r, x1 ?# c
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; o* T9 l' @! F% S! B' U3 u. G( u$ W每次DMA传输完成后都要再次使能传输

6 @) Y3 Z: e8 m+ s+ S$ R% F原来是这样,我明天去试试,谢谢了!




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