嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: b9 k& z) Y: O+ i) a
#define  PING_PONG_ACNT          18 C/ V* ]7 `0 N8 H
#define  PING_PONG_BCNT          8*32*40 1 o, h% p' i/ a4 {9 Y
//#define  PING_PONG_BCNT       1 # {9 g( G3 I! u
#define  PING_PONG_CCNT          1
( B% Y1 @4 x: M* @- ]#define  MCASP_BASEADDR          0x01D00000
  t! {0 F' ]9 l; v#define  Mcasp_RXEVENTQUE        (0u)' L$ Z/ R1 d* T& G, s9 W
: N# d6 n- u' @; a/ G
/* OPT Field specific defines */
  ^; `4 Q# V4 m#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
7 T# s" @, V& V! q7 k& P7 o#define OPT_TCC_MASK                        (0x0003F000u), U. U+ t6 N; B# {- s
#define OPT_TCC_SHIFT                       (0x0000000Cu)- G- G+ I* l: M! R1 Y& s
#define OPT_ITCINTEN_SHIFT                  (0x00000015u), M& Z0 C! x. n7 `4 `6 M
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
( P3 {6 w- b8 W0 Z
4 ^' B1 M! R  L# L" k0 C2 {" j# Gchar ping_buffer[PING_PONG_BCNT];
, T$ M5 H' W% S8 }' {. X+ e) Hchar pong_buffer[PING_PONG_BCNT];( d+ d: @) j$ M8 `. G8 ~8 ?
3 g2 U6 t3 p+ \1 o& F( ?
0 [% d+ z; g1 g. m) k9 m
' x! A& S2 U: W7 c
. e# P8 v0 D  U4 m' F1 C+ y
static void ys_edma3_init()
" a6 c) H. G; s4 v{
) ~) }0 ^5 F% O( p; S        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};" m# C2 b2 q5 i3 O/ Z' D, f
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;* B( u% R0 W" M. c; k$ D
        EDMA3_DRV_Handle hEdma;
) \/ i. e5 `# {    uint32_t chId   = 0;! o- j$ A9 e9 i& E% W( E
    uint32_t tcc    = 0;
$ C; _4 @  u2 O4 c" Q+ m& \: u" w* t4 W+ x. _* \
    print2arm("edma3 driver init...",0);
6 \) s( d, C1 j( g1 x
, I( z# L9 S6 m' Q/ V( J3 d2 c        hEdma = edma3init(0,&result);
' C4 s6 {- v, `5 e$ R        if(hEdma)4 q- S: n$ c! o0 I
        {9 h9 c) w6 k5 @+ H: P" X3 Y
                print2arm("edma3init() Passed.",0);
& l% N# ]* M* C        }
5 C+ f8 M; F3 V1 [* o& u        else
! \/ @& e+ X8 e' C) \2 Z$ S        {9 p2 l; E/ O+ V
                print2arm("edma3init() Failed.",0);
: [9 w1 e+ s5 |: Q6 X" D        }
7 b- t$ X! P: {( x       
8 r3 Y9 B6 ^2 H, X        if (result == EDMA3_DRV_SOK)! `/ y' O: Y+ e
    {$ P6 ~4 s" E! [2 H& z
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 i  \" [2 t; }5 V" C5 W3 h6 K6 R                                                       (EDMA3_RM_EventQueue)0,
2 v0 Q# h, P; I, K$ N- x, i5 i, ^                                                            &edma3_isr, NULL);
. F* C8 M+ |) Q3 g  r    }) x( W+ S8 K. }) {0 z
       
# [: z8 g9 V2 @        if(result == EDMA3_DRV_SOK)/ x- |+ Y. A2 p) y
        {8 ?5 y# Y8 H6 S. M% z1 H" ?7 ^( \
                paramSet.srcBIdx    = 0;
0 l6 [  i* y$ U% L3 U0 n- o. T                paramSet.destBIdx   = 1;
9 ~* [% t1 O) H% _, E                paramSet.srcCIdx    = 0;
! [9 U: Z2 }6 Y% M                paramSet.destCIdx   = 0;; O6 K( M2 x2 }: C7 A" R
                paramSet.aCnt       = PING_PONG_ACNT;
& G% `1 m8 c* L" }' \* C: Q  J6 _                paramSet.bCnt       = PING_PONG_BCNT;
* |/ B# R- n2 ], B: @% y                paramSet.cCnt       = PING_PONG_CCNT;$ V' e! L6 ]' ~  H
                * M7 [! F+ w9 v6 x* }5 ?3 S
                /* For AB-synchronized transfers, BCNTRLD is not used. */6 K1 j; a( ]- y2 ~
                paramSet.bCntReload = PING_PONG_BCNT;7 ~. e$ ]; b6 j2 B

! ^# M) a) V" @3 ]: u' T                /* Src in constant mode Dest in INCR modes */
2 [' T8 U! k# y( q1 ~9 J. N                paramSet.opt &= 0xFFFFFFFDu;
  ~; s/ ?9 D1 ^6 R. G8 P1 T                //paramSet.opt &= 0xFFFFFFFCu;
9 o; R/ T7 b" X' H               
4 t7 U9 B6 p& U) l+ j                /* Program the TCC */
1 u  f/ q3 a2 a- I                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);4 h  |/ j3 D5 ~# J2 Q. ^% |6 b

. }4 G( f( N3 Y8 K" [2 ]' ?                /* Enable Intermediate & Final transfer completion interrupt */0 Z8 h" j3 V- ~, z
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ k# v8 d3 s3 b, a4 U( c                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);+ T0 h4 S+ O) p/ g, q

7 G, l. t) g3 m% K                /* AB Sync Transfer Mode */
1 a- B1 F: Z+ N) B, ~                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);" d, {/ [+ q7 X6 F. x# z
                / R6 h& E6 Q" p; [+ X$ I% t4 F2 T
                /* Program the source and dest addresses for master DMA channel */
9 _' V6 N( R. B) f, a( t- J+ F4 [                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
$ s# \9 n. [5 f. R                paramSet.destAddr   = (uint32_t)(ping_buffer);
$ l  F1 _& q& s6 N) x( U2 @! {. Q
                /* Write to the master DMA channel first. */1 d2 o& b9 X. [+ r1 B$ A3 N
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
9 e3 z& G7 {9 D    }      
) q: ?! P$ L: [- f
: R' H) E6 G9 {! Y( Y, V( v        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);3 j5 ]4 e' n' }. d
        3 {* s8 W- v# @) q
    if(result == EDMA3_DRV_SOK)
8 j$ P" o5 y2 Q0 H8 q    {, F% K; {8 d! @  S' M- Z2 g
            print2arm("edma3 driver init success.",0);0 Q. |) R: |  p: t: W
    } 3 ]4 k% P7 _$ R, A1 S5 H
}
1 }9 I. y: Y# A8 }5 {2 C, Y( k: ~5 t# y/ g
% ]- G2 Y; b8 K6 Q+ Z) |) E
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% q, \3 ]+ \4 `: {3 S3 b
+ U: N; r. Y2 P: b& i" J

3 c6 |* Z- S, I5 a9 `/ a- ^9 p% C
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ f, _. E0 M0 b. E! b
每次DMA传输完成后都要再次使能传输

" y7 a1 l2 S5 _8 E/ A( c# z* A. {/ k原来是这样,我明天去试试,谢谢了!




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