嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& n0 {( L5 q/ ?2 w0 a' n#define  PING_PONG_ACNT          1
( C9 P2 ?6 r. W/ Z* s( k#define  PING_PONG_BCNT          8*32*40
8 `! K5 \0 Y: Z' c& c//#define  PING_PONG_BCNT       1
) i) O8 s$ l, H#define  PING_PONG_CCNT          1
' e4 k9 w/ A& \, R6 v5 k7 u, ?# i#define  MCASP_BASEADDR          0x01D00000) {" t+ _0 W; s" h
#define  Mcasp_RXEVENTQUE        (0u)$ \& e( O4 @$ |! f% y

& X: S. |5 e; v4 Z9 r1 ~/* OPT Field specific defines */& t& u+ y. a9 V5 B7 |
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
9 G" V. ~  F+ \* G$ ?#define OPT_TCC_MASK                        (0x0003F000u)* j8 @: A/ W/ f' \- r+ q
#define OPT_TCC_SHIFT                       (0x0000000Cu)0 A  o6 a7 I( `
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ e* h' W6 J9 f
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 |2 a  I" u  [& X5 |2 v$ m; ]
& n# C' @" T' Q! {* @7 {char ping_buffer[PING_PONG_BCNT];7 a3 z2 c/ C" I' c# D
char pong_buffer[PING_PONG_BCNT];
! t) q' c2 B( p* S6 b* V
& ^' I) T. U2 G+ G8 a7 `  t* ~' [' D2 M$ L. v

% \3 C* u, r+ X2 |" s
0 F0 c: o# r8 L2 d4 k/ r7 \! bstatic void ys_edma3_init()
5 m* o; `) I0 z' e  d& V{
4 t8 }% t+ g$ G1 J  ~        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# }% u$ s/ X5 ~5 x  p2 T        EDMA3_DRV_Result result = EDMA3_DRV_SOK;3 |; a" s2 K6 u$ y
        EDMA3_DRV_Handle hEdma;
$ |9 p$ q- X% w    uint32_t chId   = 0;9 i! P, u, ]& ^0 P6 T
    uint32_t tcc    = 0;* }4 @$ P; ?1 n- K% o

. R1 A7 u! Y) W( U  o" h: H    print2arm("edma3 driver init...",0);
' |# U# O. q4 C0 r( k/ M6 ]+ `0 V5 C! ~
        hEdma = edma3init(0,&result);/ l+ j+ q4 {9 H( l, c$ m
        if(hEdma)$ f6 x( ]: C8 c
        {
9 \# V! L* Y, \                print2arm("edma3init() Passed.",0);
7 ]% W' ~* B, H. t* F        }8 ~% H$ C5 l2 H- ~1 b/ @
        else
( D% d, e  Q- m. T* K        {/ {6 v, n  m3 `2 g$ A
                print2arm("edma3init() Failed.",0);
2 U; p* O- d% |  z& P+ c        }
& D) X" Y8 o4 k  s5 X) z        ! {" ?" S0 x7 P/ V/ I, \+ X
        if (result == EDMA3_DRV_SOK)
; g/ O( e$ d6 G+ [1 ?- u! N; F    {# r2 p2 Q, e! U3 n
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ c, v$ h& r3 Q% Y0 c                                                       (EDMA3_RM_EventQueue)0,* m6 G6 n0 V  [+ c( @; {0 q; R
                                                            &edma3_isr, NULL);
  t: _: h0 a  H4 r7 B9 U: X    }
" n1 A+ R7 m$ Q0 ?5 `0 {# d        9 ?1 V, ?. s, g7 \, v9 ]' ?
        if(result == EDMA3_DRV_SOK)
7 n" a: g' l$ {1 F5 J# |        {
; C7 W" q- b: x9 U                paramSet.srcBIdx    = 0;" J, E+ u( \: F2 q; S
                paramSet.destBIdx   = 1;
/ ?( U0 W% i9 C3 N                paramSet.srcCIdx    = 0;4 W) K) e+ N; f
                paramSet.destCIdx   = 0;
$ D3 V3 Y% X0 s( L& C! c" d" k                paramSet.aCnt       = PING_PONG_ACNT;
, {$ n2 _! t- b: M  a7 _% \8 Z                paramSet.bCnt       = PING_PONG_BCNT;4 a+ v2 w5 o" I! |. X  H3 {
                paramSet.cCnt       = PING_PONG_CCNT;5 g5 r* b# A7 g7 P! M% b* z
                , N7 Z& q0 N, Q7 M0 `
                /* For AB-synchronized transfers, BCNTRLD is not used. */" e! Q$ f: X3 i4 n) {. I+ T
                paramSet.bCntReload = PING_PONG_BCNT;
8 j8 m" I) c8 J7 s# ~- [8 j5 `, U3 }- p! v' M1 x" c' z* i
                /* Src in constant mode Dest in INCR modes */8 l9 U$ E8 Z5 P
                paramSet.opt &= 0xFFFFFFFDu;
, B9 W1 q' Z2 }3 e$ G3 a' e9 X" E, ~                //paramSet.opt &= 0xFFFFFFFCu;
) k7 J3 N' H8 P( R                ' i3 e4 Y* N$ [0 H
                /* Program the TCC */& n3 r" q. J2 H# r/ w0 U; i+ Y2 ~- m! \. m
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 N' ]6 j2 W* G1 _: ?% w: _* m+ O3 n3 |/ ~- X' w4 R. }
                /* Enable Intermediate & Final transfer completion interrupt */( Z7 Z) `# v: S! b0 }
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 M: R& I2 A) |$ m( B7 J" d                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, \4 x9 r: O; N; S* c' b" q6 n8 j5 @( F. |  S
                /* AB Sync Transfer Mode */
5 W0 N( p3 u  M! @+ g" e                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& t# t+ _0 P- H( a- M                5 F" d& |9 N. a( ?0 }# P% k
                /* Program the source and dest addresses for master DMA channel */9 v3 w0 M  P% x7 c
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);4 j3 s2 r% J6 H: V
                paramSet.destAddr   = (uint32_t)(ping_buffer);$ s9 u8 p/ [! f2 z8 @& V
) D& X( M* o' m0 ^  @; G' T6 y
                /* Write to the master DMA channel first. */0 Z3 x- V* Q7 @4 c1 s/ b. c7 |
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);$ ^- P, m- f& i' G$ A5 X
    }       2 U. D! `0 n+ B7 f  V
8 G' v1 f! u) V
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);: X) B# H1 l8 l& Y( _; w
        : s( [+ Z$ q! U6 s  X; W
    if(result == EDMA3_DRV_SOK)
, f  A" ~, j2 H8 s+ k    {
- O! X0 R/ }. d6 p' K            print2arm("edma3 driver init success.",0);( Q& L& `+ c7 M  k5 ?6 C% `+ v
    } - K  ]- B8 E& b5 e+ Q# R
}
, H/ Z5 b0 F$ f# q2 D! q1 H* ?( Z# v
+ O% M' ~' [1 c$ T9 A; [
# P: n3 H8 d0 `! rEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& A+ ]/ R9 C" }: f& |/ _" N" m# [2 ~$ ~
8 X. l# m( y9 e" t$ P. ?

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 M8 D  T* r- ~每次DMA传输完成后都要再次使能传输
- T& V( L# H- ?$ T) g3 |9 @
原来是这样,我明天去试试,谢谢了!




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