嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 @( U- i( L: l2 F/ `4 I
#define  PING_PONG_ACNT          1
  `: z9 W. r, C! G3 o. i' S#define  PING_PONG_BCNT          8*32*40
2 o4 B" y( p' k' D3 I//#define  PING_PONG_BCNT       1
5 m- ?6 v( n: ~% B* \#define  PING_PONG_CCNT          1) F; w; d2 Y' l, z% n& o3 o) {& @
#define  MCASP_BASEADDR          0x01D000008 B5 C1 X! d+ v+ u' Z; N* B8 M: V
#define  Mcasp_RXEVENTQUE        (0u)! v% v8 K1 D. I1 b( W) L7 R
( f1 e. j8 |: s* T5 X* {
/* OPT Field specific defines */7 }# P1 b$ p! j  K
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)4 c% q1 v/ T7 r$ M
#define OPT_TCC_MASK                        (0x0003F000u)
- i7 ~* ~% o' h) j#define OPT_TCC_SHIFT                       (0x0000000Cu)
& x) }1 S2 `# S0 d2 E#define OPT_ITCINTEN_SHIFT                  (0x00000015u): N8 D- t& W; a! T5 x# _' g9 ?
#define OPT_TCINTEN_SHIFT                   (0x00000014u)0 f+ N" h9 c/ z& r7 g

! B, v) d4 q" H- o: _6 kchar ping_buffer[PING_PONG_BCNT];% |* w: c  Z) ~5 _: k
char pong_buffer[PING_PONG_BCNT];
7 B, `  u7 }: v1 i. ~$ V0 T' {
$ X# ~$ n% c5 u2 f. a* o. b1 p2 Q( N  V' Z" ]! X2 s! v$ m

- p0 v% o5 S) j0 _9 B
7 j- I' g" V/ H) @8 ^static void ys_edma3_init()2 |9 ?% |/ N( p1 r
{
: e! G) d0 G! ]) {$ l- h+ |+ c: g        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ x( S" K& g! \+ O, f
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;5 y3 t+ p+ d" B# h$ ]9 ~
        EDMA3_DRV_Handle hEdma;
! o" x; {7 x4 ]+ m    uint32_t chId   = 0;" ?, u% G; {2 |6 \8 n
    uint32_t tcc    = 0;
2 s" C5 V& N& n* a9 S& v
+ S  M  y% ^3 d" u% F& G    print2arm("edma3 driver init...",0);$ s; A- y4 V; b6 G

' c2 W% w8 @6 y( u        hEdma = edma3init(0,&result);
( M3 r( l0 q8 H" R) k/ `" H% N9 y        if(hEdma)
/ ~% P! r* M1 Z4 Q. _        {
1 r9 U% p. U- x+ Q( E                print2arm("edma3init() Passed.",0);* ?9 b! J- i; M1 ?# V
        }# O, O$ y* S& a- p# O  ?
        else5 c% z$ z* S% g- q: [; `6 {
        {
) H7 u4 P& a( \2 I                print2arm("edma3init() Failed.",0);* H5 q- z; m: U. P/ m
        }
: K; X6 h$ x* t        9 w% W, @9 M; s' M5 g  [9 D$ i2 X9 F6 }
        if (result == EDMA3_DRV_SOK)
7 [# j+ ?$ F# W, X1 u% M6 e. x    {% `) e0 z& }4 F  X/ w* B- e! S7 J
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 s0 S. B: S" T; l                                                       (EDMA3_RM_EventQueue)0,- D) g9 K! d: J9 D) ~5 r: W4 ~
                                                            &edma3_isr, NULL);
) |( ?% K1 R( U+ K! a    }
% A+ g7 ]1 x, A, `       
( Y- s4 _& `! q+ a        if(result == EDMA3_DRV_SOK)
6 I- Y0 ?' {" I( W        {1 b4 m7 X1 |6 x) Z3 p7 ~
                paramSet.srcBIdx    = 0;
9 N: i& C6 N$ B9 Z4 M                paramSet.destBIdx   = 1;
, W5 o9 [, t' L% a! }6 i                paramSet.srcCIdx    = 0;
8 D! Q; G% d* |" Y3 J# F% M                paramSet.destCIdx   = 0;% W$ W* P# ]0 |7 O. a$ b+ p- l9 h5 Z
                paramSet.aCnt       = PING_PONG_ACNT;
  X4 c& h2 F4 \# W+ U8 r                paramSet.bCnt       = PING_PONG_BCNT;
: T' Z- o0 `% }# Z                paramSet.cCnt       = PING_PONG_CCNT;1 k7 W$ x4 v2 K& p, u. z( Q$ r. W' B# d* Y
                % _: U! ]  D8 A+ ]# e
                /* For AB-synchronized transfers, BCNTRLD is not used. */$ k' G% ^$ J# w" W+ ?" u4 r
                paramSet.bCntReload = PING_PONG_BCNT;- _, p& ^/ H1 R" g3 t& t4 ^+ t
' R7 Y( o( s; ^; X5 Q+ L# _
                /* Src in constant mode Dest in INCR modes */
7 M/ ]0 n! q, w4 g- e5 |. w6 W1 r                paramSet.opt &= 0xFFFFFFFDu;3 K6 O) A4 s; T7 ?
                //paramSet.opt &= 0xFFFFFFFCu;8 N% |/ [% L$ \% p9 M
               
+ m6 l  y7 f5 T% }                /* Program the TCC */
' q2 [* |2 R0 S- u                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( l6 q. T: p; ?: T& n

% V( K! g+ \8 @( |3 `                /* Enable Intermediate & Final transfer completion interrupt */$ c: O/ H* d! e' D3 A0 P5 R# Z. @- E/ N1 j
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);+ A$ ~# o# s4 C& X0 ^% h4 t
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);, L0 ?' n* ^( ?) c4 s
) r, m  n; }9 l) m6 Z
                /* AB Sync Transfer Mode */! O5 D/ q7 \: w
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 W  S& Q$ _+ m  N' J% q! y% b5 @
               
+ J" `) [( E9 S                /* Program the source and dest addresses for master DMA channel */
- X0 v! O5 A! L+ v6 C                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ S( {4 w9 k5 o4 Y3 T) W
                paramSet.destAddr   = (uint32_t)(ping_buffer);
, g  o6 I1 d4 h, ]) H& c  R
' h. X5 F3 ]+ a0 ]: @                /* Write to the master DMA channel first. */
5 y6 j4 u- e- t3 q                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);0 _# N0 A6 c' M3 ?1 `. J( a0 U( U
    }      
' Y8 O+ w+ z/ X. b+ q7 }+ \1 r% W% U2 h9 N+ ?. o
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);" W/ ]) U5 k8 t' M1 x+ }6 z8 d
        ) z; m& l: U; q9 l' c* n7 f
    if(result == EDMA3_DRV_SOK) ; y! U" B1 k( o. e' @* U- o/ m2 c
    {
. o2 q3 r5 X/ g8 R6 R4 r            print2arm("edma3 driver init success.",0);; ?) @: A  Z, H
    }
3 E* |( Y$ V$ r2 U" b7 u}
4 Z. l2 I& ^" @1 {2 R( C* q
. t9 t4 a: p5 o* r5 a0 e; F6 U2 m/ k% u' V3 {+ B' k: r* j& U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" v5 w. S3 Z. V( I6 p* L& C4 }/ @* s: p

+ V8 Q1 Y2 }& b/ f+ A5 e, G
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47" ]1 }4 p( ^! S8 f8 m
每次DMA传输完成后都要再次使能传输

1 ~* e4 [  n, g原来是这样,我明天去试试,谢谢了!




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