嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:, L# o6 L  B) ~* T7 C$ P1 N
#define  PING_PONG_ACNT          12 g) J2 f8 ^; Q2 q
#define  PING_PONG_BCNT          8*32*40 4 _: w1 B) I9 }& ]  w
//#define  PING_PONG_BCNT       1 ( I% K0 x- D- p4 I" |
#define  PING_PONG_CCNT          1; W) p$ ]! i4 u
#define  MCASP_BASEADDR          0x01D00000
9 z5 Z7 r" E: q4 p2 j#define  Mcasp_RXEVENTQUE        (0u)
8 w% o, ^6 u% ]& Z* J) G, z5 f6 i! P6 j& W5 }2 s) i* X$ ]- e. t) d
/* OPT Field specific defines */
" G2 G0 x0 r2 i& S#define OPT_SYNCDIM_SHIFT                   (0x00000002u)' O' R) t* y6 y, \2 F1 F! `* ]' _
#define OPT_TCC_MASK                        (0x0003F000u)) r9 x+ q+ |, k7 g6 D
#define OPT_TCC_SHIFT                       (0x0000000Cu)3 t2 {+ \+ g7 `! T3 p! c: M0 L
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
, [) u5 B' `! ]1 y! y' h#define OPT_TCINTEN_SHIFT                   (0x00000014u)
! \$ v+ \; d% `* I: Q$ J; s8 Q( l  }, j0 g3 U/ V) r5 ?/ y0 N$ n
char ping_buffer[PING_PONG_BCNT];
% \6 [0 I4 @4 J, gchar pong_buffer[PING_PONG_BCNT];
0 X7 c# L( b& S  d
* B8 S2 s) ^) q* n% F5 U8 D5 E6 i1 C8 f5 a7 W9 N2 y% P3 {

- T9 A7 ]6 [0 t" T
5 J* b& D$ {3 m2 Vstatic void ys_edma3_init()1 i  F$ u- u! N
{
% |5 c9 ^4 z/ W6 q# O  u  T: }; Q        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};8 B1 U4 R" E  I/ @
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;) W: x" G& e9 A$ d7 }4 x8 J( w! y
        EDMA3_DRV_Handle hEdma;% U# ^! ~- s: F* ~
    uint32_t chId   = 0;
) s4 a: b& p, v3 A# j# k/ R0 l: r    uint32_t tcc    = 0;8 ]+ U. B: g( l: g$ s& g

& @" \# E" x( o3 W' M' \" ]9 }: q    print2arm("edma3 driver init...",0);
' U' ^! ~% b0 x/ T" x" t9 Y! w
( k: P: {4 V. L  U5 G0 X8 W        hEdma = edma3init(0,&result);
. e+ ?9 H2 t, _: X% e        if(hEdma)
3 C; z0 @( U2 ?" w* n$ L  P0 X        {/ ?0 L, I6 o* W' Z- ~2 R
                print2arm("edma3init() Passed.",0);" J1 F' E- L0 P  l( X
        }
/ _( X4 }1 M6 t7 m2 K        else, j& t1 n4 s4 L, k+ j3 X2 r5 q
        {
- V3 i) \! S  ~' k* f7 A                print2arm("edma3init() Failed.",0);
4 b+ A) c% m3 M        }! }. q; G' B3 _& D/ J3 N6 ~  J
       
9 D3 u( H4 y7 }5 _+ H        if (result == EDMA3_DRV_SOK). b- i; M' ^& d. ~
    {
, E- I& u) q3 n. ^0 `/ p. I; I                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,6 F9 J, U4 G: w  R: N8 ]9 |% C
                                                       (EDMA3_RM_EventQueue)0,0 @* N6 r- O& ~0 }" k3 \# N2 F
                                                            &edma3_isr, NULL);
, m6 [# n! I, l! }8 U+ C2 e0 s    }- |9 T. P0 r/ t+ R2 H* z
        + f2 G2 D5 g* ^" w6 x  K) i5 e3 ~
        if(result == EDMA3_DRV_SOK)5 W/ F9 Z0 W& \5 k8 @( ~. i
        {
2 V/ @7 x) S8 ]" x                paramSet.srcBIdx    = 0;
2 R- R" s  i; U1 G% M5 t                paramSet.destBIdx   = 1;
+ ]5 S5 K7 ~" N! ^2 j7 S                paramSet.srcCIdx    = 0;
. c# `# U1 \* i8 J, D* X$ z. \# s                paramSet.destCIdx   = 0;" H, |' d  e" l1 o+ `
                paramSet.aCnt       = PING_PONG_ACNT;
* n4 j' }! b# \8 T                paramSet.bCnt       = PING_PONG_BCNT;
0 r& C: b/ a, ^' L& g2 \5 F  Y                paramSet.cCnt       = PING_PONG_CCNT;9 P/ j! r+ b' |8 _0 N( O
               
5 O6 R3 e4 t  E: M2 [: o4 _* A                /* For AB-synchronized transfers, BCNTRLD is not used. */6 U$ O! _6 N' z' T
                paramSet.bCntReload = PING_PONG_BCNT;$ R9 K# n2 t8 @) Y

8 i& P/ j* @- N# V, G7 i, V4 Q                /* Src in constant mode Dest in INCR modes */
% Y. h/ }) v3 u" o% H" U4 Z: M$ Z                paramSet.opt &= 0xFFFFFFFDu;8 _0 s3 ^4 C5 Q6 x' j% ~
                //paramSet.opt &= 0xFFFFFFFCu;
& i9 {6 _8 S5 C" R* e+ n! s               
  X; B! X* B) t, R8 n                /* Program the TCC */# l( C$ J# ^* e$ T) K1 p
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);  }! _" o" a7 S. G, A

; @6 v3 m- \9 S7 F* z- y+ ~: C                /* Enable Intermediate & Final transfer completion interrupt */
6 j0 \* P6 T1 P" S2 R' W/ }! @                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);0 r3 G9 B% j& k3 J- v) T
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
" ]* U! ~2 p8 }5 Q% Z7 _+ Y& t( z6 b6 K7 u: T0 ^2 Y
                /* AB Sync Transfer Mode */% H5 M- l$ b- J
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);6 p' U9 P7 a2 l
                : r- ~2 ^2 w% j: {) @1 c, F
                /* Program the source and dest addresses for master DMA channel */; V! y, G3 {/ C) U2 I3 B; D+ B+ p7 `: `
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);- E7 l% h/ }1 F- r& O0 i
                paramSet.destAddr   = (uint32_t)(ping_buffer);
( A# d% n( k9 Q) j: K' Y* G3 x" m8 y! J/ P3 x
                /* Write to the master DMA channel first. */1 Y' m4 m5 D3 Z7 S) C1 n( j
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 D1 |6 h5 T" J" k
    }      
3 h# O# o7 E+ K% \  @
/ P& @/ Q/ a1 a; {4 ^        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' D* U( u5 U$ E0 P( f4 _        . m& _6 p/ W& i6 w" Z- v' l0 T( d% N8 L4 ]
    if(result == EDMA3_DRV_SOK)
/ }: {; }4 w$ j/ G) c    {
: n2 P2 `0 x1 X( x- o5 q* e9 x            print2arm("edma3 driver init success.",0);
8 h: M" C9 E6 |. K$ @# V% t    }
$ r0 P! `8 {) }: g% Q3 L" _}
! R/ a6 A- ?" \  E/ ~" t( p1 E4 ^4 v/ ~: Y6 u
9 ?& c( I4 S  D3 p3 M
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。0 v# N# ^( s' A$ b: W3 v' L
  \9 {' Q2 \* P) @

( w4 N, N) o( [+ m; s
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47) V8 Q' D- o7 P) ?5 G- A3 y$ d
每次DMA传输完成后都要再次使能传输
2 W5 Q2 d; `! U  u7 s/ u
原来是这样,我明天去试试,谢谢了!




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