嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:# ~* [/ X, d/ s8 A
#define  PING_PONG_ACNT          1; [! s8 J- A- q* \. ]" c3 S6 Q) n
#define  PING_PONG_BCNT          8*32*40
' Y$ [; Y  v- h+ u//#define  PING_PONG_BCNT       1
" S4 ?. B! i- Z#define  PING_PONG_CCNT          1
, F: |$ |5 X/ e8 p- m#define  MCASP_BASEADDR          0x01D00000
9 ^' I- _: M6 B# n8 \4 x) R#define  Mcasp_RXEVENTQUE        (0u)0 x7 s" s8 G+ h# ]4 X. n

  D5 X) `, Y9 R4 B/* OPT Field specific defines */4 O5 Q  X) y# I8 l2 M+ d" j4 P
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)  y9 W! a' C) W
#define OPT_TCC_MASK                        (0x0003F000u)4 o+ {/ [% B% y# w: K8 K* L4 ]( ]
#define OPT_TCC_SHIFT                       (0x0000000Cu)
6 l: p* k: W/ v, C. P/ i#define OPT_ITCINTEN_SHIFT                  (0x00000015u)- |$ ~8 r( N& d9 s4 L
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
, @7 a7 f1 g; l6 U: ^" S4 G0 v# y: y. u) X; l+ W* f8 c
char ping_buffer[PING_PONG_BCNT];
! [3 o" T  I5 ?! L# e# ~+ kchar pong_buffer[PING_PONG_BCNT];& Q+ Z+ l* h. i( ]! K
. U: _" T) [8 P) _% P

+ Z5 P* M( V! O0 y# K
6 g8 t) Z6 h6 \3 c- A5 b3 i0 A: F" H* |3 d, ?& c
static void ys_edma3_init()1 K* B" I* ^6 d6 A! Q
{/ Z' x+ b" C+ {5 U% p! U
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ m6 G7 ]  T. h" E( S' |8 ~* C$ c8 _
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 w- |* `4 j. M        EDMA3_DRV_Handle hEdma;* b9 F; @! i  C2 K. r. _- R; p
    uint32_t chId   = 0;
; |9 l' r" C" Z2 O+ J* v, C    uint32_t tcc    = 0;
, h5 v) Q$ W, \: S% L' G; e
5 q( |6 K4 m) U; C    print2arm("edma3 driver init...",0);
( M1 M" D6 g4 R1 w1 w% ~. Q  H
7 F# W3 v2 Z* A. i& S3 q7 D5 G        hEdma = edma3init(0,&result);
4 K6 e) V. D4 s# S, j/ i0 K        if(hEdma)- q4 ~$ h* W% B$ p. j: s1 R0 K
        {, H9 C# w" h/ m2 Q' M
                print2arm("edma3init() Passed.",0);
+ h* S- Q# g) E6 R' \0 K        }
" A+ A1 j& }- V' y9 C5 W        else2 x* k4 b* o' j3 M9 T6 z3 j7 A
        {6 o- Z3 [; \, S. G6 z: ~& O+ `1 m
                print2arm("edma3init() Failed.",0);
& j1 r$ R7 P  R        }
- f) h: a! F4 ?0 u0 I       
; t) b) K+ W( t6 U0 P! |; O; M7 d/ p        if (result == EDMA3_DRV_SOK)
% Y" N% w* z' W( e4 X    {6 ?* F+ [, c, ?( n6 e0 X
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,1 j5 k- S% b$ f  N% _- f
                                                       (EDMA3_RM_EventQueue)0,
0 G* d9 }% L2 b6 t% y( W' A" e                                                            &edma3_isr, NULL);( a0 o0 c) ~8 M' ?7 X
    }
- K# f% X7 E0 J% x) l; N1 M       
$ G1 J* i1 ?6 t* J5 ^: N        if(result == EDMA3_DRV_SOK)
9 z  B- ~0 @& {3 c9 w  k        {" b! Q( I5 A- r4 r7 H
                paramSet.srcBIdx    = 0;1 p  u: r3 J  m, R
                paramSet.destBIdx   = 1;
& _. g( |4 N% M, F6 k0 _& j                paramSet.srcCIdx    = 0;2 t; U2 a4 o# }: t' [! ~
                paramSet.destCIdx   = 0;
* ]4 o4 ~& T3 t7 j                paramSet.aCnt       = PING_PONG_ACNT;  k& Q$ J2 T: O1 w7 H+ {# x
                paramSet.bCnt       = PING_PONG_BCNT;5 F3 p- u+ s; O4 A  {
                paramSet.cCnt       = PING_PONG_CCNT;
: y2 y( ?: J6 o3 h5 Y                / D' O5 w1 D* p( q
                /* For AB-synchronized transfers, BCNTRLD is not used. */9 m% T5 A* L3 G" z
                paramSet.bCntReload = PING_PONG_BCNT;6 P( I( g8 @9 E
: e9 Q: _+ o2 d$ }% Q
                /* Src in constant mode Dest in INCR modes */) }" {6 f! t# E7 G
                paramSet.opt &= 0xFFFFFFFDu;9 b( t( B- T* V
                //paramSet.opt &= 0xFFFFFFFCu;
. }( B& [7 z3 V/ Y5 |9 |                . r+ j& j! t) @/ ?3 s
                /* Program the TCC */( ]; V* D; @+ I4 d* p
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, i0 n  v+ U/ B/ j, \7 Y
0 x: l2 R+ }2 D$ W                /* Enable Intermediate & Final transfer completion interrupt */
1 d* E: u9 {, Z2 B                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: \; \0 @! H. K- D0 ]0 i# r7 }                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 C! P3 t$ Y6 p6 |  g3 j$ W4 Q9 z, w- f$ Z5 R/ `
                /* AB Sync Transfer Mode */
( i0 ?2 u6 v! `! x                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; P4 ~# o- C6 j. S
                % v0 H' M- S0 f( r2 ~
                /* Program the source and dest addresses for master DMA channel */- j4 N$ t3 Z& q* N; N. X
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);. j( p. U2 C3 N3 I0 h* ?; B
                paramSet.destAddr   = (uint32_t)(ping_buffer);. i3 s6 N! R* r( [" p1 g2 U: S
8 T8 j- }& f& l$ _& D" A: ?2 u
                /* Write to the master DMA channel first. */' H$ t* F9 {9 W1 a& M, T" Z: b( Y
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);/ d, E2 r1 g  B( b2 O
    }      
- Q3 j+ G; J( |% D, t% V  M1 F( R+ e3 x/ z" R! I, O
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
) b" m1 p2 h. g2 `  x        + U& P* U6 {  n* u* @" }" J7 _
    if(result == EDMA3_DRV_SOK)
" i6 m* O& t" p. I- o/ v    {
" D( [+ f' Y/ M4 S( d' {$ k) [            print2arm("edma3 driver init success.",0);- n- x4 Z* Z3 I
    }
& Z* C: O$ r6 s+ i}
( d( @  }: i3 z6 a+ `& N! l8 D. b2 D5 C6 x2 e
1 g/ ?- D. H0 X5 F8 u; @: M
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' s; N. ]6 d6 k, g9 X+ {
- a: @" }! U* F0 w, b$ P% Y# \: o! R" E+ m  H# ~. Z

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47$ [' R! U+ ~3 B# E8 p* c3 u% r0 [2 Q/ Y
每次DMA传输完成后都要再次使能传输
1 ]0 i* Y: [$ o
原来是这样,我明天去试试,谢谢了!




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