嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
! k% O1 ]! l% S9 X9 H' C#define  PING_PONG_ACNT          1
, p) G( ]/ l* X1 o: \& D$ I#define  PING_PONG_BCNT          8*32*40
& F8 L: o5 s$ l  j. H//#define  PING_PONG_BCNT       1 8 O5 M1 @& d0 A6 Z& Z5 ?2 d
#define  PING_PONG_CCNT          11 S! m5 E' [* I/ ]2 R" M
#define  MCASP_BASEADDR          0x01D00000. `; b5 T1 h6 K( ^6 x1 Y: k% [
#define  Mcasp_RXEVENTQUE        (0u)3 J- F! U; A% ^/ Z" U

* B7 h6 A; J, e0 ~' q9 V  r6 T. d+ x/* OPT Field specific defines */
0 j: W) w2 L4 I) m! E/ j- H% D9 @% v#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
: J: g% E/ }% u. {, k$ v% c' l" b#define OPT_TCC_MASK                        (0x0003F000u)9 E$ m, W3 G$ A. q. J% O* L3 U
#define OPT_TCC_SHIFT                       (0x0000000Cu)# n# k! o: x% [. u) e2 Y. A4 B% o
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
) v1 H+ v- b, ^# C+ B#define OPT_TCINTEN_SHIFT                   (0x00000014u)
# J, |& H0 e$ _4 u2 K5 Z# v" |
# q# v  d9 k! h  K" e2 R, V6 echar ping_buffer[PING_PONG_BCNT];
8 r, ?! [! w0 b! ~  Q% J# [2 rchar pong_buffer[PING_PONG_BCNT];8 i0 C1 I1 u7 @& q4 b! E: n
1 ?; B. y+ Y( L+ x

" t  T) a- S$ c, J7 X7 S4 G, B# V6 p8 i1 u& ?
8 A3 ~! s& a! s8 f
static void ys_edma3_init()8 S3 V9 X% `- G! l& t: `
{
: ~7 c4 ]3 G# v) [8 a        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
' x: o+ ~; ]4 }        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* c; c# ^. c; o& x" u  z2 k        EDMA3_DRV_Handle hEdma;5 ?2 g/ ^* j) h' ]5 N$ D8 g! i
    uint32_t chId   = 0;: s% S2 U- M8 f5 U
    uint32_t tcc    = 0;3 }3 o6 M# r/ H- x" V9 _
1 o' g4 c0 U3 b8 K
    print2arm("edma3 driver init...",0);
( F$ g" B! `' J# G1 n) W
/ O2 [+ V% [* H, c" U3 c! S        hEdma = edma3init(0,&result);
) V: q( H/ j. e# s# M0 _        if(hEdma)
$ x! ?) w5 @/ r1 T        {
. L  p: W/ r/ G                print2arm("edma3init() Passed.",0);! d% [* G+ w" c; ]4 T- e( @" Q
        }% [; M+ T$ _1 F9 Y* b3 V2 C
        else
! W0 [( M" N! O3 `) N' R$ A# L. S        {. H0 l# m( w; y9 _, o+ n" T
                print2arm("edma3init() Failed.",0);
# e* h$ V' }2 X9 `5 k% q8 a% y8 K3 J        }
; {: h  P+ x: T# Q2 `) i0 N        * Z2 d/ H$ r, ?, r+ F
        if (result == EDMA3_DRV_SOK)7 D0 M  i& G9 z& ?7 e* Y
    {  p( m* \' j9 l& H: s7 E: R
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, V7 g* |& h; c% f: S4 _/ Z, M
                                                       (EDMA3_RM_EventQueue)0,& S% k1 r) V  ~, ^0 g5 Z
                                                            &edma3_isr, NULL);
: r2 y$ W" _5 i* f5 h2 ]    }
4 h3 I1 O$ h, D; A2 t" a       
1 X/ i: b0 H# T( W7 Q        if(result == EDMA3_DRV_SOK)
! k6 @0 c, [* o# a1 p, W        {1 e7 [; d: b1 }. W+ t9 s0 [
                paramSet.srcBIdx    = 0;: b0 F, B+ F- X4 _7 |; ?! Q
                paramSet.destBIdx   = 1;
  I# a# t2 L" a: i* X: Y; x                paramSet.srcCIdx    = 0;+ z5 W4 j9 F4 X0 ^, r5 g; J
                paramSet.destCIdx   = 0;
( Z+ f+ @4 i' C. H1 M( ~8 I( M7 G: Q                paramSet.aCnt       = PING_PONG_ACNT;! h: g" u! v% ]9 B  ?" v
                paramSet.bCnt       = PING_PONG_BCNT;
; c4 D" N" e/ y' d! o                paramSet.cCnt       = PING_PONG_CCNT;! a) R- c3 i- `  W% M4 b$ z. F
               
+ P9 n$ h6 a3 t" ~7 ?                /* For AB-synchronized transfers, BCNTRLD is not used. */, s0 x+ ^7 h1 n  R' C3 M9 u8 f
                paramSet.bCntReload = PING_PONG_BCNT;& s6 }! ?4 ?! z; d
' l1 Z3 W: [% z- f$ k3 H; M) J: w/ H
                /* Src in constant mode Dest in INCR modes */
5 ~, i- k1 W% c5 {: H  p3 _1 a                paramSet.opt &= 0xFFFFFFFDu;
; R8 ~5 l* `+ P, s                //paramSet.opt &= 0xFFFFFFFCu;5 Q# i3 d% s# T* l, s
               
0 G+ j) `: i: _) @" j; i: H* T7 Z                /* Program the TCC */
; _) t" t: ?* Y3 L                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# `$ ^# d2 c% G! d; i
5 K$ X+ a3 w- `7 \, B                /* Enable Intermediate & Final transfer completion interrupt */; y) u# Q( j. c; l) c
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" e8 H! g% j, q5 @; t                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
: {5 }  i, _5 z- A5 D2 j
" ?! V3 S# t& v2 c                /* AB Sync Transfer Mode */- e" C- z5 Q/ ]4 a
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);- ^' b0 R2 h7 v. |  k; x$ A6 w+ ^
                  P  v$ N1 s( p+ u2 N, V+ r6 j4 E
                /* Program the source and dest addresses for master DMA channel */
0 G; T& y7 ]6 b# w% V9 {, W0 L$ n- d                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);& K. P1 Z8 ~7 E1 l) }# R( ?' A
                paramSet.destAddr   = (uint32_t)(ping_buffer);7 \, }5 g1 w* _+ c9 g

' p! t' `8 P5 b7 ?- X4 c8 K3 ~1 a                /* Write to the master DMA channel first. */
, l0 u- ^' X" h* @                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
4 @6 f0 M# S' M6 w$ Z    }      
( ^" ]7 |4 r/ U' ^, a& X% I5 k' D/ ^
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ _1 |% k' C6 z) e+ c. x& Y) [
       
; e3 o& s+ t! D- I$ s+ l    if(result == EDMA3_DRV_SOK)
( \- }2 `5 Q; p$ ?1 x1 u/ F    {' b. z$ u0 {% j; f2 K/ N
            print2arm("edma3 driver init success.",0);+ @% I% e& C4 J# j* P
    } 2 p1 s+ |; e  s( Z, `3 j# I1 i8 X
}
; N: {  W" @* Q  r  F
) H  e8 A8 e% F0 y" R& ^: k
( T; k- L1 ]1 i2 g9 d9 oEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 [  [9 v2 R/ M" J* Q9 R: k6 {; Z( U& e9 G$ ~) a! K' Y

/ d1 g5 g" ]5 A3 \7 m8 \7 |6 F
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 S6 r. ?& s3 R) P+ V' I每次DMA传输完成后都要再次使能传输
& Q3 j# P9 x0 e
原来是这样,我明天去试试,谢谢了!




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