嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:0 x) H6 U4 t, L
#define  PING_PONG_ACNT          18 \+ E$ A$ Y0 e8 u! o
#define  PING_PONG_BCNT          8*32*40
" W" Y- }8 }4 w. ^2 N$ F& g1 }" a//#define  PING_PONG_BCNT       1 " i6 [$ v+ {- |- ]3 E; }# M
#define  PING_PONG_CCNT          1% y. e  A& h, u
#define  MCASP_BASEADDR          0x01D00000
+ r$ p0 Y* L' W' Y" @* {; E' S% Y#define  Mcasp_RXEVENTQUE        (0u)
' @& u$ Z6 Z6 {1 n% G+ Y! F
! e. C1 V2 s6 t$ w2 `/* OPT Field specific defines */) x6 b, [5 d+ Q/ W% O6 K, I$ H
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# l: p5 C: F: M8 P1 F
#define OPT_TCC_MASK                        (0x0003F000u)4 M, S: s0 Z( z- _! M
#define OPT_TCC_SHIFT                       (0x0000000Cu)
6 w9 g1 r2 P, c#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
, J+ f! P' L. P& I4 ]#define OPT_TCINTEN_SHIFT                   (0x00000014u)1 }* ~8 D: C8 I6 Z" g4 R( d
" z6 |6 [1 t( {# c) R
char ping_buffer[PING_PONG_BCNT];
! J- X+ n6 e8 Q: V% r) lchar pong_buffer[PING_PONG_BCNT];; I' q, ^! j; d

+ ]7 m' [' w% n
: W) l$ f" v# K: `2 M& v) i1 t1 i3 W# D) }- x6 F

9 b- G; `8 }5 gstatic void ys_edma3_init()) X/ K( q* Y5 d
{, w" N9 W+ |& [; Y
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};! a3 R& y) f# J6 O( y. E; r* O
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
% J0 w8 f* c" D' R' h6 u        EDMA3_DRV_Handle hEdma;; x4 c* ?! t/ e# u6 ]/ b0 h
    uint32_t chId   = 0;! F  ^# v% F1 P2 b
    uint32_t tcc    = 0;
/ Y7 O/ U+ }) I2 a: R% w& l+ m) c5 X" N! [) X1 D( Y; U4 Z+ k
    print2arm("edma3 driver init...",0);
) `" a8 m# m! r6 q# [( @# i9 H4 O! _% m
        hEdma = edma3init(0,&result);/ ^+ g" C, I8 s7 ?
        if(hEdma)
0 K9 P* W; z0 g        {
  B9 T7 d  u7 d. [# F                print2arm("edma3init() Passed.",0);- ?* |" v+ r" Y8 I! R# i; v7 U
        }
* v0 }2 Y& q1 c& n. Q& i        else' C5 d  A: K5 k; f4 t% K
        {# u/ O2 \) ~/ k, c
                print2arm("edma3init() Failed.",0);4 H8 z- r0 @# _4 }
        }
* w2 {1 n- ^0 x. D2 D  b        % c$ [# ~1 m+ E  a! |' B) h/ a
        if (result == EDMA3_DRV_SOK)" q& S) l  q2 p4 Q9 f
    {7 u) j- E0 z7 u# S- _( g
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ n2 i5 S& d2 M) ]$ g                                                       (EDMA3_RM_EventQueue)0,$ i7 o- W- H+ j: ?3 ]. O
                                                            &edma3_isr, NULL);
& a, m! u: U& V    }
, W) ~8 [& V4 z        7 y; i" i% w" g3 ~& C$ w
        if(result == EDMA3_DRV_SOK)
* ^% [+ S7 O: h2 l2 ~) m/ v        {
( n( L( k4 Q! u' Y; d                paramSet.srcBIdx    = 0;
0 S# v5 U4 i. j" F8 ^                paramSet.destBIdx   = 1;
! D* Q" C0 Q6 b0 m6 H                paramSet.srcCIdx    = 0;( K! i. X9 o6 L% U) }
                paramSet.destCIdx   = 0;0 t$ L6 k+ t. D# U9 X
                paramSet.aCnt       = PING_PONG_ACNT;
  ^, ^2 J6 ?& K% W3 v7 ~+ z                paramSet.bCnt       = PING_PONG_BCNT;$ [% P, b- c4 t' ]4 p/ j
                paramSet.cCnt       = PING_PONG_CCNT;% ^3 r) ?" [! y3 z2 T+ N: t
                5 H( j4 {. Z. y
                /* For AB-synchronized transfers, BCNTRLD is not used. */8 e* q" S; q4 w7 j' i% v  Z+ r+ r
                paramSet.bCntReload = PING_PONG_BCNT;8 j$ x: P8 P3 u0 ^3 L
! h8 ~7 c& a9 s$ S; b2 N- f9 `
                /* Src in constant mode Dest in INCR modes */  R8 ~; ^0 b' M, @" L- u. T' P$ k
                paramSet.opt &= 0xFFFFFFFDu;" a! \) ~* }# t" b$ l) K% q
                //paramSet.opt &= 0xFFFFFFFCu;3 p3 c- {; F# t/ F. B' `0 \. A
               
. [  J9 \9 K4 @5 E5 r3 s                /* Program the TCC */) \( Y1 i8 ^) Y5 ]' T
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) u# R4 J$ F- j
5 y! N. J* v7 x. [
                /* Enable Intermediate & Final transfer completion interrupt */
* u) X/ x6 s! M, B4 C2 |' G) D                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- ^$ E+ W1 e) T( l+ K                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( w, Z1 R0 w1 F. _6 T- Y# W
9 b% I# P6 ~. B- n$ {" y  L                /* AB Sync Transfer Mode */
) v# ~. M/ r, q/ W3 x                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ V7 r. h/ O/ U, H) e& O; m
               
3 w- K0 `' [' g* t& J                /* Program the source and dest addresses for master DMA channel */5 u; {# W, F0 \0 @* _2 G& f
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);: R2 r9 X+ Z& i; Z1 E  L
                paramSet.destAddr   = (uint32_t)(ping_buffer);
. ]1 Z: c1 m0 X8 o$ @) f4 c5 X; c& m  E# y1 k' {3 A
                /* Write to the master DMA channel first. */2 o: q& D( J3 Z# g
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
- _! R) ~' B# \# I" u& C7 i    }       0 |( T& F9 i1 v4 U

0 m) C/ w* ^/ r0 w- e" e$ v" h        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);( Z" h' M7 D- w. J
        ; b# z8 y2 P3 e2 z6 s% a
    if(result == EDMA3_DRV_SOK)
- ^- ?# |5 |* ?- k, {    {. N: I; m: x$ q" ^
            print2arm("edma3 driver init success.",0);
" \8 p9 d4 h& N, p    } 6 K0 [8 k. H* R  h0 k% f% S
}- e7 U: f9 H- ]! n# y" j' w

$ a% J- N: ?, D5 M1 P: g4 {$ o+ O& ^1 l* P5 a' c& o" {
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
# P) x5 x( H2 J" Z) n6 [+ d: T- T# B# f4 m% `, }/ _8 q7 [! w2 n

4 E$ P4 W7 Z  F' K: B/ ?0 T
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- M, u3 ]3 W0 y* k4 e每次DMA传输完成后都要再次使能传输
+ z7 A* z* U% ]; f% d/ H) Z! p
原来是这样,我明天去试试,谢谢了!




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