嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ O* r; c; V, I+ A#define  PING_PONG_ACNT          1" T3 B8 o1 C& j/ r
#define  PING_PONG_BCNT          8*32*40   ^* t2 \& e( k8 @5 y8 X
//#define  PING_PONG_BCNT       1 - Y; e$ y; E1 L$ S3 G* s* c1 R$ Y
#define  PING_PONG_CCNT          1
3 Y% b3 h! x3 j0 I$ s#define  MCASP_BASEADDR          0x01D00000
- e& N9 R1 Y% j5 V#define  Mcasp_RXEVENTQUE        (0u)
1 c9 ~0 L% b. @% e) N6 e- A' E2 T& d; x! U  \& }5 g2 s% K
/* OPT Field specific defines */
9 R& ]! R" a* r; P' N( e% g8 R#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# H1 O4 o" T) D7 x# W# T$ ^; B' ^4 c
#define OPT_TCC_MASK                        (0x0003F000u)
0 ?/ j  }* g% ^# M' o( ^9 |#define OPT_TCC_SHIFT                       (0x0000000Cu)
2 [- x% R: M" X- Q2 d" G#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 d& r1 C. P* ?# y1 J* S4 p1 ]
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ d- m0 W( b4 Y' J) U  T: D, L, c" n
char ping_buffer[PING_PONG_BCNT];. P4 D, E8 E3 O' v  o
char pong_buffer[PING_PONG_BCNT];
* A, r, `% o0 G1 t9 k: ]- g1 z. @
" v; O( A9 m/ E, r8 g/ u9 @: I( ]( l% E3 J, M. C5 S/ ?$ D

! M" S! T- |- Z. }: I5 Q0 x% s+ s* p: y- X
static void ys_edma3_init()
% F; a2 S( Z- y* {{# n0 v1 L* ^% ~! ?
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' k/ {$ t. y  [. m) J* }
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;) ^5 s+ p; [. B% Z2 W  `/ x
        EDMA3_DRV_Handle hEdma;9 |. J! ?/ C" b0 @
    uint32_t chId   = 0;8 H* b' |+ {$ P& \) Z" A1 O
    uint32_t tcc    = 0;
  r8 i1 r* L+ d- }4 j) m9 s* M% A- ^2 _4 D
    print2arm("edma3 driver init...",0);
5 x* \0 F) E( Y4 b% K: Z9 s6 y) L2 d7 D
        hEdma = edma3init(0,&result);3 p8 z) g6 S: _, {3 W' B& [' c% e  L
        if(hEdma)
4 n0 b+ M& h5 D0 o5 s% Z- r& N        {% T0 `& a4 U7 y8 u
                print2arm("edma3init() Passed.",0);( `/ M- b: Z" W" ?; H" B0 B
        }+ j% `& w' F8 m! W7 W- ~9 R$ m
        else
/ s; _- b4 O& m4 J% ?* m        {* G# |5 C' T6 H/ z8 u' v. e
                print2arm("edma3init() Failed.",0);$ L3 H" \! R  K- I; c
        }
1 y/ \" ^  ~4 j4 j9 S/ S& r0 S; K       
* l6 f; x& s) H. U& W2 L        if (result == EDMA3_DRV_SOK)
( I2 R7 T! K5 |5 [7 O    {
! p6 U" t: E$ |3 e                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 h. L3 `! e2 V% O                                                       (EDMA3_RM_EventQueue)0,
$ j) S# h9 g9 O- c9 n5 o' P                                                            &edma3_isr, NULL);, b2 y1 v5 w! h3 j' ~  @  R
    }- V! J9 ^* O$ u
       
+ F' R; m( l6 t; }( R+ i+ i( a        if(result == EDMA3_DRV_SOK)( \) j; g5 x+ t/ T
        {7 z' t4 s7 j$ H2 Z: @' r* [
                paramSet.srcBIdx    = 0;
) u; c% D; r5 u5 ]# j1 y                paramSet.destBIdx   = 1;
  @. w. u! I0 ^4 T8 h3 \- ?$ V) s                paramSet.srcCIdx    = 0;
& t5 L8 u4 v5 N( f3 B' p- k                paramSet.destCIdx   = 0;
" I. u$ e1 r3 r0 B# `( Z1 e                paramSet.aCnt       = PING_PONG_ACNT;& ]; f, a; t, Z9 y4 q: V9 A; |# C0 a
                paramSet.bCnt       = PING_PONG_BCNT;
) r- c; R( j* Q& L% Z0 \' H, d' [                paramSet.cCnt       = PING_PONG_CCNT;
' {4 R( @( x  W: m/ e7 T                , r! `" |/ a  a& [; C1 |9 R9 [  b( f; Y3 K
                /* For AB-synchronized transfers, BCNTRLD is not used. */
* y: c( z% k+ H# B1 U0 h0 U                paramSet.bCntReload = PING_PONG_BCNT;, {% A- [$ I0 v
1 a4 k2 `) l' g0 D
                /* Src in constant mode Dest in INCR modes */6 f0 l) j  o6 o- u$ d2 U
                paramSet.opt &= 0xFFFFFFFDu;) `! X! \( p, z5 w- `5 X
                //paramSet.opt &= 0xFFFFFFFCu;2 }) Y+ ^6 K- g, D( d6 X
               
$ ^- U) r7 v% H, K! t( R8 j                /* Program the TCC */: W) K$ V% O4 P2 W
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 i9 j7 S0 E7 m4 Y" w0 f, f9 ~+ x  p5 w0 j9 ~) R( l
                /* Enable Intermediate & Final transfer completion interrupt */
5 n; {* r% I1 n9 V                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" n2 x9 H, ~2 u) R5 f0 |5 x                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 t4 A  V6 T6 r; _5 z5 p. M7 t
8 g: \" d4 O, F5 p( ?" I7 R
                /* AB Sync Transfer Mode */) p9 V- C( j7 E1 D( K
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; P" R- c4 F  l, O  J               
( }1 Z* v6 P2 i8 f9 p                /* Program the source and dest addresses for master DMA channel */" R3 v0 @; q. O" f( z) N4 f# P+ n
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
& P& v" b- M" W( L' }- U. k                paramSet.destAddr   = (uint32_t)(ping_buffer);4 B2 U2 a6 r3 d( R6 P, G/ L4 |+ s

- T. e, v. Z' @2 u# @                /* Write to the master DMA channel first. */) t7 {9 h8 ^; K* m
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% z% X* @& n1 X1 i8 S
    }      
1 N/ m: |/ K6 Y3 m& |7 t
9 S3 Q- N8 }6 X1 ^        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);# j7 k# w' C( t+ l
       
+ w" C4 [  a% u: X    if(result == EDMA3_DRV_SOK)
! a+ P5 |- A+ d# U    {9 Y0 \5 M3 W4 M0 x2 p
            print2arm("edma3 driver init success.",0);; ~/ E7 J' U+ G& L0 i/ h
    }
% b/ c* b% x/ o( P1 _}) O0 `$ `! q& `7 p' f2 m6 }  m

3 T# L4 E/ y% c' ~! P( d! I$ y' |) M8 i7 e3 f0 i2 z2 C. s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。, K" x" y+ X; X9 y; z: Y" ^

3 Y$ f6 {) o; {: c8 {2 x5 g  T
4 j+ v( n5 R! [1 _( n& e! w2 c/ I2 ]
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:474 S3 C5 ^8 g$ X' ?* l
每次DMA传输完成后都要再次使能传输

) t3 c2 h5 L: E; r1 G  I( F原来是这样,我明天去试试,谢谢了!




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