嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 ]2 g' }$ z) [0 P
#define  PING_PONG_ACNT          1
- Y0 X% @0 f, E. F#define  PING_PONG_BCNT          8*32*40
1 @" W; ]% ~  ^) u9 _, X% b9 f6 \//#define  PING_PONG_BCNT       1 ! _$ |) `: N/ S/ f  x1 t
#define  PING_PONG_CCNT          1
1 p  u; I* G! p8 O#define  MCASP_BASEADDR          0x01D000003 L$ c2 l  R/ j$ _! j7 N; G
#define  Mcasp_RXEVENTQUE        (0u)
" r  i! H5 q- q7 B
1 l6 Q  I2 B3 n4 N0 Q: o: f1 z/* OPT Field specific defines */
+ h& A% [5 s5 {#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& d6 b2 }) w$ D8 f2 r+ ~
#define OPT_TCC_MASK                        (0x0003F000u)$ C; m* Y9 `/ i7 {' E4 ?
#define OPT_TCC_SHIFT                       (0x0000000Cu)
( m# b# K( Z! L% P8 C#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% Q0 m$ u  h/ u3 h5 m# W/ }8 f. ]#define OPT_TCINTEN_SHIFT                   (0x00000014u): T) G' n7 `, j  S: \
9 O0 c: F8 z, h
char ping_buffer[PING_PONG_BCNT];
* k! _" H6 K( Dchar pong_buffer[PING_PONG_BCNT];
4 Z4 R" R, q; z# A5 W! P, p$ j6 w, T: I% u

* W8 N5 C) ?! V$ @' u6 {; {9 h5 }  G$ P. a4 l* G2 ^
0 N- ?! y: n6 D
static void ys_edma3_init()
  |6 g0 c" G/ d{
8 g! j+ B+ Y  k  o        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};3 ?( b8 R' z9 w6 {; s( c4 ~
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' `. q: q# j$ D2 ?& ]( w        EDMA3_DRV_Handle hEdma;
9 d+ u0 X- R7 F    uint32_t chId   = 0;
! @; V) U- I6 T- K7 S2 M% E+ p+ J    uint32_t tcc    = 0;
6 Y& V/ c% Q9 ^% H" h) Q% x9 L8 @. ]' ^
    print2arm("edma3 driver init...",0);3 }8 [; B! a$ E$ Q. _

1 s" P8 ~, r* H! e6 k( _0 n# b2 o3 S        hEdma = edma3init(0,&result);
7 [! i/ o3 Z5 t" }9 s- F        if(hEdma)
: k" {: T2 P; N        {, ^% s7 j" b. V& J3 c
                print2arm("edma3init() Passed.",0);
- C3 S7 K. j2 }  g4 @, i        }  W  F2 O* H( ]8 V
        else& o5 \# h2 R  m7 }# \% c
        {
  h5 x% E+ I( }+ ^4 d5 E                print2arm("edma3init() Failed.",0);
5 E* y2 C, }' y        }
/ w; j1 V" e* `7 o" V       
/ M2 U, E; ?) i5 U2 N        if (result == EDMA3_DRV_SOK)
; i5 U; w: J5 |. v$ k0 [    {
0 j+ P! m# r1 J) Y' N                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
/ F7 [8 @4 U0 J6 @6 N; B                                                       (EDMA3_RM_EventQueue)0,& k- ?- c% b) M1 A
                                                            &edma3_isr, NULL);
" `- [. z+ F2 x4 `* B; x3 {    }. `6 p2 G# [. ^% M) y. R% f
        3 d8 p6 ^" V, n' C
        if(result == EDMA3_DRV_SOK). A8 K/ o8 r, `  V- ~
        {6 J' w1 p  U* @7 w4 k
                paramSet.srcBIdx    = 0;
& R9 v8 o$ D; o/ Y4 }. a6 ]                paramSet.destBIdx   = 1;
4 s8 i( e$ L" Y" u1 S% P                paramSet.srcCIdx    = 0;
) V) d3 Y0 x, d                paramSet.destCIdx   = 0;+ C3 \4 S. k2 m* P* {
                paramSet.aCnt       = PING_PONG_ACNT;
( h/ j  Z+ ~7 y7 j; Z2 @                paramSet.bCnt       = PING_PONG_BCNT;
7 b; v" }2 l( w# J7 L- G& d+ W" V                paramSet.cCnt       = PING_PONG_CCNT;
, p' i) ~% E* z% N               
# Z# G0 H" O4 F8 `                /* For AB-synchronized transfers, BCNTRLD is not used. */
9 P2 `2 D9 }% V  i" w, f0 ^                paramSet.bCntReload = PING_PONG_BCNT;) g+ x$ O2 S; V/ A
- ?5 u' ~( D/ `6 l& `, z7 [7 _
                /* Src in constant mode Dest in INCR modes */; K! w" A% S  M* J5 d0 @
                paramSet.opt &= 0xFFFFFFFDu;+ B9 [1 l; H! {& h: T8 {/ G1 g, o( G
                //paramSet.opt &= 0xFFFFFFFCu;% r& q( n" }9 {- Q0 {
                4 p0 T5 ^& `* w) O9 L
                /* Program the TCC */
& M' Q; _+ ~. p                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ y1 o" a6 D; V; h) w* N7 s" _) \; s2 G* c1 E
                /* Enable Intermediate & Final transfer completion interrupt */% j- i/ N, n- B0 x) V! {& m
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);( D! t0 a7 K- I2 Y' f
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! ~/ z! T& b- G. q) d4 l$ i. x! @  V0 q, D
                /* AB Sync Transfer Mode */
( _0 g# e8 ~) T& D                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);  K* V$ Z! W0 F, U' I- g! I
                ! i9 `2 R* _  I0 y* h, |. s
                /* Program the source and dest addresses for master DMA channel */
5 Z0 R$ k" Q2 ]4 I: L. `1 W                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
: ^8 f9 \! ~+ ]2 ], d/ Y; g* O5 B6 c                paramSet.destAddr   = (uint32_t)(ping_buffer);
; E$ r9 _9 z; l2 m6 m* Z+ E
/ }, k  ?. p- K, R( M2 x                /* Write to the master DMA channel first. */& K1 w! L- q3 ?$ c, C' o$ z" @
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
5 l  G' H% O/ j    }      
; u0 d/ x; h! N" d/ {" v- |  o- S, Y/ [4 n
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 c; C. g  q& u6 m  L! P        ) M" c# `5 ~; l* h2 v
    if(result == EDMA3_DRV_SOK)
4 j* X& H' W' J* _    {
! Y! ]6 _5 n" Q7 F+ u; |" |            print2arm("edma3 driver init success.",0);1 o% F6 M+ P% Q, o" k% F0 w
    } 3 G+ F* R$ O1 u# B2 G" K
}
% g5 \0 c8 K1 n* l# t# e2 W* X& z( w5 C. L3 @
( o3 F( n5 \0 F2 R6 ^
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% P+ n( l5 e, @, K. l- G/ u; }
! l6 i: f* G! Z; n. h8 I

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
2 c" O) ~) K. B! L每次DMA传输完成后都要再次使能传输
6 g+ k/ ^; I1 b; @3 V7 f  N
原来是这样,我明天去试试,谢谢了!




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