嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 p7 e* @, M0 F! @. {* O#define  PING_PONG_ACNT          1' e, i( C9 B/ w
#define  PING_PONG_BCNT          8*32*40
0 [4 w  b2 B; l/ D//#define  PING_PONG_BCNT       1
6 I% D6 V. I- O, @9 {#define  PING_PONG_CCNT          1  x7 y8 o3 k9 D% v. X
#define  MCASP_BASEADDR          0x01D00000& h! O5 e3 a. f+ b' p
#define  Mcasp_RXEVENTQUE        (0u)
( g/ k3 d0 ~; C; k- `) B5 [9 Q8 U) W- Z1 D5 r
/* OPT Field specific defines */( M* S1 g: w' o, [% Y
#define OPT_SYNCDIM_SHIFT                   (0x00000002u); u' O! C5 Z9 ^9 K+ d
#define OPT_TCC_MASK                        (0x0003F000u)8 n. R8 I; T2 @, I+ d  n) o6 t
#define OPT_TCC_SHIFT                       (0x0000000Cu)7 D" [+ b' b. o1 p, W
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
0 p& L1 G+ N* j7 Z7 L& E& z#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) k" F0 V" g$ S0 Z. C' {& D) I2 W/ F& [5 N, W% ^' O) I" @" O& H4 G
char ping_buffer[PING_PONG_BCNT];5 F% h" b" K- g: Y  n5 \2 ~
char pong_buffer[PING_PONG_BCNT];
! [& ^. {9 F5 l% q+ k8 s
9 ]1 o. u1 B0 d' _* j# J6 B
" w" F2 |8 Y# G# M) B; r/ G8 w
) ?2 j0 E) q" M: d6 z
/ N; @6 F8 y1 M% S: i0 @, E0 cstatic void ys_edma3_init()
4 D; M6 c4 K6 a) B# A' M) V* ?4 ~. p{
7 h% I! X! _+ p" Q        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& K: s5 f: K3 X6 r  ~( h
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- p8 L* r$ e0 p9 M# Z. a        EDMA3_DRV_Handle hEdma;
" A8 Y! ^/ V' N) n, y8 y    uint32_t chId   = 0;
- |0 D5 H8 \, r7 h5 b" U5 I  a. r) g    uint32_t tcc    = 0;# u+ `* A1 m! P1 B3 |, P9 ?
8 _. |* s3 l" `' a# W
    print2arm("edma3 driver init...",0);3 |7 N( J, D3 o3 @; B7 {
2 W* v, M6 w8 A: X
        hEdma = edma3init(0,&result);
. r2 M5 g! R+ t. U' S- q( F        if(hEdma)
' o( O9 k; A" i* ^) o) X& A; d: M        {
6 Q5 n) `4 D+ g4 {& F5 ~* U                print2arm("edma3init() Passed.",0);
: u6 z, v: v  q. i: R1 ~9 P" e        }
5 l0 p, t+ h" d  i% N+ J) e. P        else
0 z+ ^6 t# V, I8 U8 I0 {        {- p: S% ?8 j# M$ t( H* l
                print2arm("edma3init() Failed.",0);
2 P2 R; U* i( c8 e- o) q; ]        }
) H* N) y/ g! \- O6 `7 ]0 @       
$ j% H' f, }; B. N2 l  l* I        if (result == EDMA3_DRV_SOK)3 E9 O4 {1 |5 R: A
    {+ ~9 h# Z  O1 E1 t
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 c# d" ^0 B+ q8 Q3 M# ?4 J3 ~
                                                       (EDMA3_RM_EventQueue)0,  {6 G( h$ z+ C! \4 z8 w2 q
                                                            &edma3_isr, NULL);7 y# f; w4 U0 g2 S6 M" P' W; C1 ]
    }
7 M" k( _: m! f# a7 T        5 r5 [1 Q3 s* o. B' R+ I
        if(result == EDMA3_DRV_SOK)4 i% w  l) B8 S/ m7 k# e; N0 N
        {2 R" z$ K2 A' L1 }4 u; @6 C
                paramSet.srcBIdx    = 0;
6 B9 K' C8 R5 Y1 s& ?& G                paramSet.destBIdx   = 1;& ]0 V: J0 l3 |( L- l# ?  g! Q
                paramSet.srcCIdx    = 0;9 \9 |" Y' {3 ^* }& c. j1 q
                paramSet.destCIdx   = 0;
$ a7 M2 N5 B' N- R$ O3 R$ H                paramSet.aCnt       = PING_PONG_ACNT;
# A6 U2 q$ R, u5 e                paramSet.bCnt       = PING_PONG_BCNT;
! U$ P7 S# X! y5 ~/ ?2 y! P; V                paramSet.cCnt       = PING_PONG_CCNT;+ P0 F+ m" i' a' _) v
               
# ^( S; o/ C, D                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 g" {; s+ s! M4 S                paramSet.bCntReload = PING_PONG_BCNT;: q- b! a3 V* g: m0 X, \
" Y4 `4 O8 B( O- J' y/ E3 r4 n
                /* Src in constant mode Dest in INCR modes */8 N% N% w+ t# _! e. w; S
                paramSet.opt &= 0xFFFFFFFDu;
6 m6 _' @3 Y" |5 t) [( |                //paramSet.opt &= 0xFFFFFFFCu;( @: K$ ], h9 q7 v% {
                - V- w0 E8 u2 @* R( m9 _
                /* Program the TCC */
5 n# z+ ?# y. c& I7 a                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);3 l7 E7 R9 D/ ]$ ]
! t" J. z! Y5 J1 U6 E
                /* Enable Intermediate & Final transfer completion interrupt */9 q. R( r* V  v% q7 K
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; c- Y# s% ~" c$ _: q                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- C# b& n. \! p* m' _! s
9 K0 P5 d$ f& ~8 M( H
                /* AB Sync Transfer Mode */
" p1 i( o$ f1 _; W                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);; X% C/ I& a. }" k" |: y0 ?. }6 J
                3 |! [- l. u  D" ~
                /* Program the source and dest addresses for master DMA channel */& Y+ r* a& `% h4 o8 D
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);' j& W% R% s0 [" ~4 P
                paramSet.destAddr   = (uint32_t)(ping_buffer);/ e; S4 j& u6 ]  w" `" b7 H

2 R: g' C) C& J$ R4 o                /* Write to the master DMA channel first. */+ h5 s% m& [: _2 G8 P1 O0 }
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- k. P. y4 C/ ~
    }       . [! R; H( m. B
2 C' w3 |0 a& s( `, T5 `
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);/ |) k4 d; V8 J; X2 R+ E  f
       
: P* m" q/ k; q- D7 m- J7 u    if(result == EDMA3_DRV_SOK)
% X/ m; }) s4 }/ s, s! Y, w3 j    {
2 K6 b. Z7 U9 M4 F. F& C            print2arm("edma3 driver init success.",0);
" X# e' }" {4 Z( o7 ~; K    } ' E; v" Y$ ]# D& _
}
3 s9 p/ R( r# d* \, [& ], L& m' v/ B. J. N! @7 o2 p$ v
! b9 P% Q0 Z+ r, d
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& ?6 i2 d' ]9 \9 d

/ S2 G0 O8 u; W; D1 x0 W+ }# r2 P$ A/ ~5 W

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47$ v: k5 d3 W7 N( a* i
每次DMA传输完成后都要再次使能传输

9 k+ p, B% X/ I+ U# s: e$ d  o9 E原来是这样,我明天去试试,谢谢了!




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