嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( M# @/ C& Z# ^8 B8 ?; G$ A
#define  PING_PONG_ACNT          11 b) f, ~; H8 D* j+ \
#define  PING_PONG_BCNT          8*32*40
- N6 W: ~7 a8 r8 k//#define  PING_PONG_BCNT       1 6 F0 }5 f1 A3 F1 Y+ n8 j( ]" R# _
#define  PING_PONG_CCNT          17 d4 F! t) D/ @7 v' N, @
#define  MCASP_BASEADDR          0x01D00000. c/ s8 I- r6 j' |, L1 V
#define  Mcasp_RXEVENTQUE        (0u)
, N3 a+ C5 E5 l1 H& x1 T; B5 L+ Z
/* OPT Field specific defines */
% T& f) z+ |- W5 v. g7 H9 ^  g#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
! u# Q+ y' J6 c1 G#define OPT_TCC_MASK                        (0x0003F000u)
7 _$ y4 M2 n, `* d9 y; B#define OPT_TCC_SHIFT                       (0x0000000Cu)% E; V( m2 S* H7 m& x/ s# x' ~
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
9 z& ?+ S, {! p/ y  u#define OPT_TCINTEN_SHIFT                   (0x00000014u)
: `" Y+ d5 P8 j/ i: f5 ~: \' N4 _, M9 N" T3 W
char ping_buffer[PING_PONG_BCNT];
3 N/ v- T7 Z* B  ychar pong_buffer[PING_PONG_BCNT];  C! M. y1 ]  \: P
0 Z& a" W+ l) m: X$ d& P  |
$ }; U. ~5 `; ?4 J

9 Z! j4 v' a8 T# f7 J5 r% D
! W: c& C* b3 \7 J- wstatic void ys_edma3_init()
) i% x0 e; z. Y) k{
6 @- y! {" [1 q& A( q& U8 j        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 ^7 j; U  q2 }6 Y- u: O( Y: `* D
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;3 `" m; C/ y' ]0 D$ j3 H) n) j( W
        EDMA3_DRV_Handle hEdma;
6 L+ E* M8 v5 ?  ^9 H    uint32_t chId   = 0;
3 Y! p, I* h( s; V    uint32_t tcc    = 0;
3 U  v9 u4 o( _6 x. |' w  w- D  y2 o- Q+ V
    print2arm("edma3 driver init...",0);6 W, V& R5 l; g( w: C1 d  r
5 T& u' l$ A( k6 M" K) p: M  m
        hEdma = edma3init(0,&result);
7 X: ~0 h  d$ c: T, V) x% e& y        if(hEdma), C: i8 ]6 g, x% I) {* r( v
        {
: s: [! T0 t3 _$ T- B; R                print2arm("edma3init() Passed.",0);
6 [3 S7 f* G& J        }/ H  p; B  x9 w% X' x1 r4 h/ R. \" r
        else) J+ a8 j4 C; j7 D2 D9 ~& n
        {1 i- a) D. ~2 ]& }7 g3 s4 ]
                print2arm("edma3init() Failed.",0);
$ B3 ?1 v, T% ~- E        }
. V: x2 I  ~7 J        ) `9 X0 t2 D5 j: I% n5 Q
        if (result == EDMA3_DRV_SOK)
8 R- f$ u9 \  R5 O    {7 ]  a; `( ]+ [" a/ j4 T
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,' I# ^3 n3 N+ e& A+ ^+ y
                                                       (EDMA3_RM_EventQueue)0,1 [3 }2 D8 B5 J% C+ f
                                                            &edma3_isr, NULL);$ g5 r. ^/ Z; w8 {7 f
    }7 Q% @% @5 Y- U
        * e' O2 D/ G2 q9 c8 a
        if(result == EDMA3_DRV_SOK)8 C0 i1 K2 [! B& _
        {- |8 p' j, ^& T  x' S6 A2 H4 F' m1 z
                paramSet.srcBIdx    = 0;
$ i4 R5 e+ \7 C- W$ F5 M                paramSet.destBIdx   = 1;( f( h; n) A; f( w- t+ J. @( Q
                paramSet.srcCIdx    = 0;! z% P+ d; I' _5 w2 F
                paramSet.destCIdx   = 0;
  u, [! o" d5 w* Y! m, Z% D- m                paramSet.aCnt       = PING_PONG_ACNT;# l1 X* n  X+ E: h# `+ ?  H0 o; ^
                paramSet.bCnt       = PING_PONG_BCNT;- |) l( I) s4 J
                paramSet.cCnt       = PING_PONG_CCNT;& j+ P& M" U% H% r, a' Z8 F
                0 u# T0 c3 _' X+ X6 f) H- o2 |
                /* For AB-synchronized transfers, BCNTRLD is not used. */
: b5 m: K5 s, Z  [1 @8 q                paramSet.bCntReload = PING_PONG_BCNT;
  R/ P* R) ]3 P& U3 Z- y" x/ w. u5 B3 R( |
                /* Src in constant mode Dest in INCR modes */' a1 c1 G( t+ ^1 g
                paramSet.opt &= 0xFFFFFFFDu;
/ w# k$ p0 A, G& H6 e                //paramSet.opt &= 0xFFFFFFFCu;) [# |( F/ N; n& W
               
5 {/ ~5 I# l$ f4 @) i0 }- a                /* Program the TCC */$ {& I1 @( K( ^4 S4 l2 ^
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 H; M/ y7 k# a4 W6 P5 L4 a; I& _) q& v- L( f& B4 p' e* q
                /* Enable Intermediate & Final transfer completion interrupt */5 F. ]6 x6 z$ z/ Z" N
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);: f# S5 Q$ g  ]( h: k: W& R# l0 q
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. j0 F. U3 N4 C6 }+ O$ W$ s  c
  u1 Q( w; E0 p6 v5 h3 ^) H
                /* AB Sync Transfer Mode */
0 M4 `/ q# h0 y9 d* L" {, h1 D4 x                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);' x$ t- @5 e3 l, [; z
                ; n( x* ^0 _8 d% f2 l& f
                /* Program the source and dest addresses for master DMA channel */
1 }- }. e: W5 N9 D! A                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# _$ b; s( Z* G4 B3 W6 Q/ Q" G
                paramSet.destAddr   = (uint32_t)(ping_buffer);
* _4 k4 ~  D/ A
- M+ r. e6 t) d1 a8 C' F+ ^9 ]                /* Write to the master DMA channel first. */# P7 F1 v9 ?4 J7 L, b2 c3 N
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
% u8 M4 Q# i: A    }      
$ {" U* \# N7 K1 P* f' [7 K
4 c% m/ |+ o1 A0 m! N        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) M# y5 E2 ?( c& g
       
8 s) `8 z( P+ ]5 C& ]7 G1 W    if(result == EDMA3_DRV_SOK)
% i1 s7 K: w2 r: W    {8 m. {( Q2 q4 {
            print2arm("edma3 driver init success.",0);; t. h4 p4 u$ T
    } 9 l. i! q, n: z+ ]  b* V# A% O
}) O4 Q0 M/ d' c/ D& X

' {; ]2 Y- W" }4 }; h2 w9 j
+ ^. U. u( @* d2 G8 d2 K& z, yEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。* j2 |" u( O2 \; D' a3 U, P

  _$ V# h- m$ y: P5 v' |3 G3 z: J' z

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, A0 o4 M8 z" l! s8 \, ~
每次DMA传输完成后都要再次使能传输

8 u! b$ x7 G( O: M' g( d原来是这样,我明天去试试,谢谢了!




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