嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:( }0 x  V- a9 b* P/ j; Q0 ~
#define  PING_PONG_ACNT          1+ t- e! Q) |9 {! b- n. x0 l* l
#define  PING_PONG_BCNT          8*32*40 3 X4 l; }% ]/ a0 i* r' n
//#define  PING_PONG_BCNT       1
) S' H3 p- N% N( m' |( h#define  PING_PONG_CCNT          18 Q. {# l4 M2 ]+ N
#define  MCASP_BASEADDR          0x01D00000
' ~  q' _1 S! E+ y#define  Mcasp_RXEVENTQUE        (0u)
+ U3 u1 n" v% i* p, x, c3 g5 B9 o
/* OPT Field specific defines */
5 }5 |8 V8 J" A8 t$ f#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 z7 V# y% N2 G# Q) e: X8 e, ]& C#define OPT_TCC_MASK                        (0x0003F000u)9 t$ ?1 C) e8 D) S( Q; R* F; l, a( y
#define OPT_TCC_SHIFT                       (0x0000000Cu)
# m: \7 d% J1 S# r' Y. z& Z& p! n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)5 Z, [4 ~  K5 p2 x+ x. u4 o
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
$ g5 q$ e! ?% q
, Z2 \, h$ k& w; ?9 t. Ochar ping_buffer[PING_PONG_BCNT];
$ L# w. R7 g4 Kchar pong_buffer[PING_PONG_BCNT];
- A/ q- f* ?% L- H
; M# }6 g  \8 H) [
3 n4 M- z' e  T$ Q9 G' C# C$ p
# n  c- F+ d0 t7 l. g* m  O( ?6 X: H. R0 s) r
static void ys_edma3_init()
0 B( `% l2 `6 l. a( g; |: u/ J{2 ^" e1 _! X7 Y& B2 M3 R" ~& d
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; a/ W* }1 }# _6 ]- a- Z1 c: v, z
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
$ \9 ^& ~( c) Q# u! K6 B. [        EDMA3_DRV_Handle hEdma;6 R* ]. U" m/ [/ N5 c: S
    uint32_t chId   = 0;* t% o# v0 f( \5 m' `1 B
    uint32_t tcc    = 0;# D" c( U& S' {3 c; D6 A# W
8 U, `5 k2 E2 D. J) B" f( B+ A2 W; C
    print2arm("edma3 driver init...",0);2 q8 e( K) w: {& x' u) T# ~

" t. ~6 f$ n8 K( k6 p+ D" O/ i1 g        hEdma = edma3init(0,&result);" z+ W" g% Y8 r+ Z, L) }
        if(hEdma)
; Z0 f" k. S; e' g5 ?+ F        {6 [; J1 z9 [, G( F+ e( Q6 q( I! t
                print2arm("edma3init() Passed.",0);5 y$ p$ q- M3 x! F
        }
9 ~# c- }' X4 J1 C8 a" g- q4 O& D        else
# ?5 Y: k0 w; |. K  V        {2 h& L6 [7 b9 v4 Q9 j0 e: k
                print2arm("edma3init() Failed.",0);% {% P- A4 H( m! ?3 n
        }
+ U, ?( d9 _$ t6 z0 p* k        6 e7 s! e3 `( _% ^# |' V' g2 x5 z
        if (result == EDMA3_DRV_SOK)  w: @+ g- ?9 D& i+ t
    {7 d0 ]& H) Z" l: \6 f
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. ~3 F" {$ u7 \2 Z2 m                                                       (EDMA3_RM_EventQueue)0,4 w& }, P' B+ \5 ^, V& h
                                                            &edma3_isr, NULL);
7 y$ `- d0 Q6 |    }& }2 Y4 r1 c' D" o/ n
       
0 _$ P0 w4 g4 m3 {5 O4 Q* ]" a        if(result == EDMA3_DRV_SOK)
% U3 _& Y# ^  k+ I: Q, _        {2 D- x3 C" Z8 s
                paramSet.srcBIdx    = 0;% M, F& |9 m% h2 k8 n
                paramSet.destBIdx   = 1;% F: d# R* ?& O
                paramSet.srcCIdx    = 0;
  x: K% ]( N6 ^5 K) _) M                paramSet.destCIdx   = 0;3 }% T: s2 F. O  A" t: \/ k4 l0 N
                paramSet.aCnt       = PING_PONG_ACNT;
2 [" ~% y: g( q( X: ?                paramSet.bCnt       = PING_PONG_BCNT;
( v- q* m( ]+ g! u                paramSet.cCnt       = PING_PONG_CCNT;: S, W; O3 i, [1 `- i  A$ V
                5 F' e; d  r5 L8 a9 u
                /* For AB-synchronized transfers, BCNTRLD is not used. */
8 d& k: k: _4 ]: C& S# F* }1 J( r                paramSet.bCntReload = PING_PONG_BCNT;
: q& P& P$ w  M. F( ]& Z! Z2 a7 K' I4 P+ ~
                /* Src in constant mode Dest in INCR modes */
) p! Y6 H- ]3 |                paramSet.opt &= 0xFFFFFFFDu;
4 x: n* t. I) b5 |7 p& ~                //paramSet.opt &= 0xFFFFFFFCu;& E! l- ^# ~$ j& }' {' Q
                . H& ~! B: R# L0 g
                /* Program the TCC */
  a7 z  [$ a( E                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" \& I# t" N3 u" W9 Z7 G

" r6 g: j3 g: j. D0 {; M1 O- W1 t3 K! D                /* Enable Intermediate & Final transfer completion interrupt */
2 X' S6 |  C9 p- S, ^( |  m$ g                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 N" J; I2 u/ o& J( z6 ]9 p
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);  ^  b3 s5 `7 Q6 A( G
/ u/ w3 {# j# N5 K/ n! \5 J8 ?, y
                /* AB Sync Transfer Mode */' L# _4 S" l. B1 r
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
3 h  f: \$ q. k& R0 k               
2 C& |# E8 e( V9 b  K+ L0 |$ i. K                /* Program the source and dest addresses for master DMA channel */
- g9 N  L# p; H' M0 k                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
9 R5 ~* n5 k' {                paramSet.destAddr   = (uint32_t)(ping_buffer);: R3 D, N  u7 ^" m, P9 T9 ?, i

, {' U( H$ A+ W! D8 n                /* Write to the master DMA channel first. */' E8 [/ V9 S5 v; A7 Q
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 r# E7 P0 G8 l    }       2 {9 t; N& A# N' }
8 s% K, `" f) u2 n4 ]
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& z' s9 @7 m" z/ H        , K$ X1 m- s. N: Y8 v4 C
    if(result == EDMA3_DRV_SOK) . u- M% B& a+ ^5 p- @
    {; u0 ~' ~2 t, |
            print2arm("edma3 driver init success.",0);
( T# D$ V2 f3 ]0 i7 `% }$ T    } 5 M- R  b4 \7 g& h- k% Y4 k6 [
}
0 T# ~/ U, }' F8 g' r1 v' c1 i8 @2 ~, E* I( ~
: r: V+ v. t# ^) E- U; |  T6 v2 Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。$ [! w1 v; Y* s+ Y8 @% K1 `
1 J% ~) q/ W$ Q) C3 @

# P# I3 e3 P" ?  M+ ^
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( h- m* j# k% M; W5 }' t: s每次DMA传输完成后都要再次使能传输

) @" [" r3 p  _- W  ~: F0 c  G" c原来是这样,我明天去试试,谢谢了!




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