嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:. S- \+ B9 i* x# k3 f9 R/ a
#define  PING_PONG_ACNT          1
) o, Z+ h) v) c! N( O  t#define  PING_PONG_BCNT          8*32*40 - \+ K1 l3 |( i4 @; g2 ^' S- ^$ ]
//#define  PING_PONG_BCNT       1
9 Z* _% h$ @  g7 |4 r#define  PING_PONG_CCNT          1
$ t) S2 C; ]% S1 X& [. d6 i% w#define  MCASP_BASEADDR          0x01D00000
' Q2 a& v0 Q: A/ R  n#define  Mcasp_RXEVENTQUE        (0u)( F6 V9 W7 b0 f8 q. j( w9 w( J

, @1 P) Z+ C& U5 R1 `/* OPT Field specific defines */
$ A! A  b& ?8 H#define OPT_SYNCDIM_SHIFT                   (0x00000002u)" o) `6 g  p! t  X: F
#define OPT_TCC_MASK                        (0x0003F000u)
8 i5 t) Q0 w0 ~8 V  C- A6 p#define OPT_TCC_SHIFT                       (0x0000000Cu)
- F% ]$ ?6 r" h1 z+ R2 [#define OPT_ITCINTEN_SHIFT                  (0x00000015u)7 e/ {: G9 ~( i! `4 E5 Y" ]! W
#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 F6 E) R: A5 x6 R2 ]  u
6 Z8 @$ U5 I# a1 N- A) ]
char ping_buffer[PING_PONG_BCNT];
3 Y% v4 H+ e' y( Jchar pong_buffer[PING_PONG_BCNT];
" I; y! j" g% F9 u, f6 f- f2 S+ L7 P( g  B  e

4 E8 R; K9 j, l7 P7 b6 i1 j( R& @! h" ~# v: o0 l. g5 |
4 D+ B* w- k' ^# i7 ]4 X# j
static void ys_edma3_init()7 \  ]3 y9 `; N# e0 H
{
5 S0 n- e; j# B        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, n  k* x- C4 N  V* k( r0 A7 C1 Y' |
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;6 m8 _7 D( T1 _
        EDMA3_DRV_Handle hEdma;
  q" @; Y) ~+ \# x' ~6 O6 D0 d    uint32_t chId   = 0;* w4 s- k& n, x2 ^) T+ `; `; p
    uint32_t tcc    = 0;
  o% e1 v2 v# \( J  P! l: Y8 ^2 N: d' `5 f; k# ^% A: X: L
    print2arm("edma3 driver init...",0);
! j' n6 U3 n% H7 o
. f8 V, ~& a; s- H        hEdma = edma3init(0,&result);4 S$ |* _+ |' y5 f) A/ t
        if(hEdma)
9 L& S& B( g3 A+ C+ F, `        {8 j" y$ k6 ?% v4 h
                print2arm("edma3init() Passed.",0);
9 l3 X: m# W2 ~# t% I        }( I  B0 I( I, r$ H
        else
# G( m: Z' d& W9 k        {0 \. x. e2 n( }! }; S/ O; D) E
                print2arm("edma3init() Failed.",0);
+ a' r" p! V, c% g5 \        }
/ i* j: x8 X. D  ^; u! `0 O       
1 k6 P1 g5 L% ~4 _( h        if (result == EDMA3_DRV_SOK)" D& a! v/ n; Z4 x  n, v
    {! J. e1 A! Y! `- A% l
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. s, X' ^& v7 m# l; C! g& ]$ j                                                       (EDMA3_RM_EventQueue)0,
0 k, X. r2 ~# O! z                                                            &edma3_isr, NULL);7 r. _" a" i7 m
    }
+ I, f" P! d! j  n8 O# `       
" T5 F9 I/ x4 l- p7 }& X        if(result == EDMA3_DRV_SOK)' Z0 W+ d8 y& E6 ?+ t: b! F
        {
$ T& c; }5 n$ q: g& F* i* h+ y                paramSet.srcBIdx    = 0;
6 ?' j: ^$ o6 J/ P                paramSet.destBIdx   = 1;
# S. W0 i: |# O8 _                paramSet.srcCIdx    = 0;
2 }7 X; l2 z7 o) s                paramSet.destCIdx   = 0;
  t  N' T& [% [7 U                paramSet.aCnt       = PING_PONG_ACNT;: I0 E7 O" f5 B7 V4 g& u% W
                paramSet.bCnt       = PING_PONG_BCNT;
2 n( D6 c% G$ _5 {4 O, v                paramSet.cCnt       = PING_PONG_CCNT;
4 e+ x* P+ M# r4 Y8 A                , Y3 M7 w. n7 {* l- |
                /* For AB-synchronized transfers, BCNTRLD is not used. */
/ j8 S, ~) w& L- \+ s                paramSet.bCntReload = PING_PONG_BCNT;
1 \5 z& s" X  W5 M* Z
+ Z2 `/ Z- E+ l4 U) K                /* Src in constant mode Dest in INCR modes */4 o3 o8 B. ]1 C& ^  e- Z6 x* v
                paramSet.opt &= 0xFFFFFFFDu;
, _) x% Q4 y, M2 ?/ }6 I  Q5 |                //paramSet.opt &= 0xFFFFFFFCu;
" s; x( N8 e* ]; [- ~6 T2 y% ?               
. A1 f8 X- S& w/ J' E                /* Program the TCC */7 \+ i1 E# V- E) i$ I3 f
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; k! K3 {8 a8 t( ~6 u% f% \* a0 |: b% m. ?+ u) [
                /* Enable Intermediate & Final transfer completion interrupt */
3 x% T4 N& I$ T9 y! V                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 d" C1 V' x3 l! e
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) Q0 c, y6 |4 b2 I0 x* v3 M; T  J- R4 ^; `! J; \% N  y) X1 M
                /* AB Sync Transfer Mode */
" j9 K, @7 l7 Y" y0 e" l2 r                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ t( X8 a7 W3 J9 l' X- l               
' A- A- Z' h" V7 {                /* Program the source and dest addresses for master DMA channel *// Y; x8 Q* y) u. B! s
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
. V+ y! O+ P7 x                paramSet.destAddr   = (uint32_t)(ping_buffer);
% h3 d( v& g  z* `* e9 F; G
$ I( @2 S1 {& R, D% V6 Q2 g  R                /* Write to the master DMA channel first. */
) E* O6 }- |, x  F  I                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);/ ~5 n  {, n. b  o
    }       . ^: x2 ]# p$ d6 |, k/ S
! G2 z  g- @1 k/ K" w
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);' `! m, q& R& V: B$ l
        7 U) h. I5 ^# m' _+ ~3 V# w  q4 F. y
    if(result == EDMA3_DRV_SOK)
( ^+ S8 g7 Z7 y5 J" t- [    {& c, g4 K, b& A9 ?
            print2arm("edma3 driver init success.",0);% o& k( O7 c& l8 a* N
    } % L3 U* v! j3 K) f) l
}/ T" Q& H1 e5 l6 g) `
# s( `4 b5 ?: Y  |; K

+ x0 ~1 a$ C$ H6 y. ?EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 ^% |+ ], Y& @, `* N! F
' s) l6 m7 x0 K& b8 W) j7 P
/ I6 u, {" U+ F6 s
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* X0 N  J# c$ w0 B8 G每次DMA传输完成后都要再次使能传输

% `! c/ Y+ c4 K8 K% [原来是这样,我明天去试试,谢谢了!




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