嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 a3 @4 K+ h0 ^6 X* X" _2 J6 [* u#define  PING_PONG_ACNT          18 o0 i, W5 U, q
#define  PING_PONG_BCNT          8*32*40
& y1 j2 V; R# g6 z//#define  PING_PONG_BCNT       1
' p+ r$ P* E: I' m#define  PING_PONG_CCNT          1
* g# E1 f  a1 S, {#define  MCASP_BASEADDR          0x01D00000
: ^. A2 m/ X- [. q7 K7 h1 i5 E#define  Mcasp_RXEVENTQUE        (0u). ], j: M( J3 ]. D) k7 }/ {$ {3 w
8 E* t4 z4 h4 G
/* OPT Field specific defines */
, G8 `6 V5 ]0 W) W8 }9 {5 K#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
8 H3 q" N3 n/ O& n#define OPT_TCC_MASK                        (0x0003F000u)
! _; u# e6 k6 ?, X# R: b#define OPT_TCC_SHIFT                       (0x0000000Cu)- R( U3 K, C+ r) f7 a
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& |5 q* O4 Y- }5 ~2 e! g; [
#define OPT_TCINTEN_SHIFT                   (0x00000014u)9 |$ p( Q8 B0 y& k
) Z1 E% F* [5 L8 ?6 u
char ping_buffer[PING_PONG_BCNT];3 }! l8 s7 N* [, ^
char pong_buffer[PING_PONG_BCNT];% e; `5 ~7 y5 b; J; x9 f) `5 R
( R- t6 u$ [6 {7 L# `

( f: J7 L/ e! W: k" k5 r5 M, [' @3 I0 A" s$ }0 D1 h2 D

7 A& I' c& R# M) Qstatic void ys_edma3_init(), ]* {' j  }7 K8 Q  j/ F- c( d, [
{! [* ~2 Q" z$ w( g% R4 {
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* P5 p1 c" h( S6 q5 v, d$ p2 l3 }$ ~* Y        EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ Z- X4 G2 U* o$ s& d
        EDMA3_DRV_Handle hEdma;! X4 F" S9 f  _  ]3 P
    uint32_t chId   = 0;& N& }$ ?+ y* W8 R" F, ~) Q
    uint32_t tcc    = 0;
  Z. K% x: l- F; t6 H
" l! r" H; |1 [' n) y7 o0 \    print2arm("edma3 driver init...",0);& B4 G* J8 g5 J6 [; P' j

) ~! z8 R2 b: {% D" p        hEdma = edma3init(0,&result);
! S+ n# w! j- z        if(hEdma)( i$ Q7 u& ~' H% j: T* }7 K
        {! \9 e) ]0 X5 c# {2 n
                print2arm("edma3init() Passed.",0);: b  K- b" {3 B: K/ d
        }
7 C& d! c7 \" ?/ J7 Q! |5 a        else
6 }' x3 g  [0 e6 }        {
9 q/ O: W, g, G1 T' B/ r+ S3 L                print2arm("edma3init() Failed.",0);) o0 s4 b+ l3 d) @
        }
' N% S  ~) x- i! s. ?2 `       
1 Q+ u$ z) P0 m5 c0 u        if (result == EDMA3_DRV_SOK)4 K% v) R- Z* a
    {
: O& ~# [; J4 h9 _+ l( o                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,% z1 U' z: _3 a* r
                                                       (EDMA3_RM_EventQueue)0,
( V' s/ f6 M/ m                                                            &edma3_isr, NULL);' k* E5 s2 X' e6 a2 R& x
    }
* y( ^3 h+ z6 |3 D( X       
$ ]: d7 k4 Q% y5 u6 \- ^; t        if(result == EDMA3_DRV_SOK)8 C$ H9 P1 Z9 M( r
        {9 s% M+ e7 o, q
                paramSet.srcBIdx    = 0;
. t+ x! `9 |2 j$ z8 s                paramSet.destBIdx   = 1;+ l6 |8 f6 T; E8 z
                paramSet.srcCIdx    = 0;
' d) A2 b' z: V% S+ ]7 E) N9 v                paramSet.destCIdx   = 0;
' [: c7 Q  V/ D7 Y" r9 I1 @                paramSet.aCnt       = PING_PONG_ACNT;
* U, O% D8 ]( U* f- i. j                paramSet.bCnt       = PING_PONG_BCNT;1 t2 p: {2 Y2 ?2 ?# b
                paramSet.cCnt       = PING_PONG_CCNT;, R! y% F, T5 \6 U( T9 D
                8 W: r  ]# W6 H' y
                /* For AB-synchronized transfers, BCNTRLD is not used. */
7 Q0 Y( `8 m1 P8 D% f, f# L                paramSet.bCntReload = PING_PONG_BCNT;# q2 G3 g+ m" h& r9 g/ O, r; D

! i6 v3 v2 t9 _+ C0 A4 O                /* Src in constant mode Dest in INCR modes */7 D! v) K0 u% o; ]0 Y; U: [
                paramSet.opt &= 0xFFFFFFFDu;
. P. h- E8 T. J( D  A' h2 B" H                //paramSet.opt &= 0xFFFFFFFCu;" ?* q( a0 y9 Z" j
                9 P8 ^3 r/ G- S# i9 d) t
                /* Program the TCC */9 Y1 T, E5 |" Q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 }$ }/ ?6 f5 m( E  Q* x3 U

( _7 p& x2 f9 m, Z" A. K$ C6 P; }                /* Enable Intermediate & Final transfer completion interrupt */8 L9 |: z# L1 b1 M( E; j$ ^
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! k" F# |3 j7 x4 J                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);! ^1 h( T" X4 _7 e) [0 s# q

3 y- Q1 b5 k# q5 G                /* AB Sync Transfer Mode */
) n/ j4 I% k) L* L4 @                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# R+ T+ f! ?( d1 W                $ Y4 @3 f2 m) |$ @3 S, o
                /* Program the source and dest addresses for master DMA channel */
4 Z! N% y; y* O4 n                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);( b! m1 E6 G! }8 V+ @3 D
                paramSet.destAddr   = (uint32_t)(ping_buffer);
$ {4 E  Q. {9 W
* S- j% o9 N2 @; V5 T$ @                /* Write to the master DMA channel first. */5 n4 |1 w* M4 p8 U3 ^! V
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( _0 `+ V4 q" c8 }. |
    }      
. x7 s" g& Y; Q0 t3 s% ?
$ a' [, ~  v8 e. M$ }8 V; Z        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);1 m& t  u  y, P% r
        + C! _; p1 \/ ^2 Y% d
    if(result == EDMA3_DRV_SOK)
2 g  ]. ?6 e- p! ]    {
$ l& C' k  ~( T4 M            print2arm("edma3 driver init success.",0);
5 u; h. F) n) e$ B! J6 C+ K" S0 f    }
9 ~, ?$ z* |6 V}
3 O  o% B( G  H0 k- H1 G7 {( ^% J! T- V$ r& S* W

( w7 E: e0 P2 D! T3 Q" K; X# nEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" Q9 ?+ L5 O. |4 I  e4 k4 k. c, V0 N
) H( B# j* X9 n+ ]
2 k! Z! U) B5 J7 U5 j) f( A' R

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47* p; Y$ e- ]1 A4 m4 K
每次DMA传输完成后都要再次使能传输

/ C8 o- R: R5 {- F7 H( }" m( p7 D原来是这样,我明天去试试,谢谢了!




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