嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:! E* |0 m/ b4 x% |6 W4 `. i  V
#define  PING_PONG_ACNT          1
2 ?' p! }- a+ Q8 c( K#define  PING_PONG_BCNT          8*32*40
* d4 Y1 N0 `8 B  B9 K7 C- V' `/ O//#define  PING_PONG_BCNT       1
. v7 c# N% ?2 {8 _  Z0 {#define  PING_PONG_CCNT          1
: |% w$ f0 c& Q, m8 h5 _#define  MCASP_BASEADDR          0x01D00000
+ L# z! h+ G' U" s+ N) U' p# i#define  Mcasp_RXEVENTQUE        (0u)8 b! ~! ~" @2 v" @
0 v, b- t0 Y7 o1 r8 J% T) c7 G; ~
/* OPT Field specific defines */2 W. B' o( y2 K4 L2 |) `
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
, y. e# I. b1 `; I- R. I#define OPT_TCC_MASK                        (0x0003F000u)* d/ ]- z7 P6 O  b/ @& ]4 p
#define OPT_TCC_SHIFT                       (0x0000000Cu)* R- F+ L" _# K4 A
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# M. ^: g" {- j2 Q+ M#define OPT_TCINTEN_SHIFT                   (0x00000014u)" j; m# J5 \0 n# T% Q: E4 ^3 B5 {
  r. D0 C( O- L9 |  H! Z
char ping_buffer[PING_PONG_BCNT];
% ]; ~: j3 Q- E- `* B% @! t8 rchar pong_buffer[PING_PONG_BCNT];
$ {! _3 L4 D8 l  b, Z2 \; s+ e! z  A6 t* G. m+ f$ Q
8 F+ g, \6 ^9 C9 ^4 z5 x  z

9 P/ A& F4 A; }- H1 c6 c9 c- E) e( C9 J! P# o
static void ys_edma3_init()
. H& }6 E# _+ H: K$ m{
) z, d) }" J7 ?# {( B        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ @* D- k) Q' v        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 Y/ @& J9 s! S9 K8 I  o& ]% O        EDMA3_DRV_Handle hEdma;+ d  [7 {. P8 n$ R9 W, v' s# _
    uint32_t chId   = 0;
: s0 {& B$ _! _# B' p% C    uint32_t tcc    = 0;# J2 x5 E/ a0 p* r' s8 A5 L# H6 }( u

6 N; z1 p4 J: [' S& @    print2arm("edma3 driver init...",0);; H( V9 L9 ?8 U4 b7 F

. U: f7 y3 q9 ~8 t% A6 E" i        hEdma = edma3init(0,&result);
. z7 @9 r* ?# r$ H. v$ D2 \        if(hEdma)
( S. A; Z" V) k0 R4 [! M3 j0 {        {# z' r1 D( u1 |( S7 k2 B
                print2arm("edma3init() Passed.",0);
) Q$ p2 R6 [9 u( z  f# M( Q        }
8 \( J+ _/ E  s- |! Y0 A        else7 K5 T3 a& D* R: I; {
        {
& a0 n4 M4 f: z0 Z                print2arm("edma3init() Failed.",0);
& W, |9 m$ B* B) `        }! U/ N& N4 G' ^. ^9 W8 Z
       
/ K, R0 b7 P% W& E        if (result == EDMA3_DRV_SOK)) f" @2 g! {- v
    {, M% d  F: P* d% V" N. d
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, l$ ]+ [) u, o' ~" ~
                                                       (EDMA3_RM_EventQueue)0,
8 I+ B0 ^* D0 b7 q# P/ G                                                            &edma3_isr, NULL);
4 h0 a2 z6 C9 Z( o* ]    }* g0 Y! j* x, W2 ?0 [
        5 s+ Y9 R+ U% r1 [0 Z2 g
        if(result == EDMA3_DRV_SOK)$ i8 M1 L( L1 t* w4 N2 Y% n
        {, o; g# o" M! }( i. o
                paramSet.srcBIdx    = 0;
1 y8 I+ l! D1 J: Q                paramSet.destBIdx   = 1;
$ p. G6 O9 L! Z+ q                paramSet.srcCIdx    = 0;
4 X2 f  w' S( [                paramSet.destCIdx   = 0;
* T6 [4 d9 W" @( W. @6 g  Z* e8 }. [2 f                paramSet.aCnt       = PING_PONG_ACNT;* h! ]% }8 N+ Z* P2 x8 U7 j
                paramSet.bCnt       = PING_PONG_BCNT;
9 f5 ?7 ^7 u/ \( k+ N                paramSet.cCnt       = PING_PONG_CCNT;
/ b4 K* p' `' ]: M( u5 {  U/ C               
& d! N0 f; Y- _; S2 p2 `                /* For AB-synchronized transfers, BCNTRLD is not used. */, ~" k5 @, G8 p  d, T
                paramSet.bCntReload = PING_PONG_BCNT;
' T' Y! k- {. z' O( ~, z
7 `2 s( T6 w9 ]) u' F; D/ X                /* Src in constant mode Dest in INCR modes */$ B* f- j$ i1 e9 d
                paramSet.opt &= 0xFFFFFFFDu;
" l+ H; b3 }7 t, b( q1 q                //paramSet.opt &= 0xFFFFFFFCu;
& v/ A; r: b( J6 |" X) G  a                : b' ^- a; b9 d: n4 r* A7 D2 _
                /* Program the TCC */
' Y; W) S5 ^9 E, l% H2 A0 G                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& @6 c+ U+ q- g4 K9 P9 c% B2 d  P4 p4 T5 A/ J3 F2 Z
                /* Enable Intermediate & Final transfer completion interrupt */+ d6 P+ w- D* P* u% w
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ |! V8 c% }: R                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ Y/ |, D  W( t& ?2 v( E
, g4 E8 h1 v" r1 a- P' e. [$ @
                /* AB Sync Transfer Mode */
2 `  ?$ G/ ]. E! r, i                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 V) o  v1 r; h6 V               
1 ~# Q8 {# Z/ c) @, L9 i$ K; C                /* Program the source and dest addresses for master DMA channel */
( S4 d! `) a- X6 @" j                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
/ ?) @5 O) T, Y+ z/ t; o6 J                paramSet.destAddr   = (uint32_t)(ping_buffer);9 d7 p& {* o5 P8 {

( S+ Z- S- A- U5 t! l, g! r                /* Write to the master DMA channel first. */
2 Z0 M4 Y; I! d/ q  V                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 B: \& c6 D3 S7 ]! r" l6 |    }       ) |9 e: ]1 r9 x# S2 E

/ O6 W+ \* t, R; f* a$ |) b# u        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& |4 w7 b% ?4 u& e0 c       
' `' M# {8 `! F9 F4 q; ]$ b    if(result == EDMA3_DRV_SOK) $ W6 [6 I: x8 b" C5 P; H
    {
9 H& o9 x* A$ a            print2arm("edma3 driver init success.",0);) n; ?8 h. i6 q
    }
3 v. }2 a7 c7 t7 S3 S7 o}
. x* v6 E, `: `) w) n# u  a6 P: Q

: l$ I+ w+ ?& ]- h3 GEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 Y% o, A& @# F2 K( p7 r
8 j- G* [: F0 ~4 ?2 u) B2 B1 C) Y0 o/ K  }1 ~! r( p; |6 i- S

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
" Y6 O* `$ V: O/ t每次DMA传输完成后都要再次使能传输

5 |$ Y$ [9 y! W. S$ k+ A原来是这样,我明天去试试,谢谢了!




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