嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:5 C5 Z; `" F0 E5 h, a' Z" [/ |" R
#define  PING_PONG_ACNT          15 p! g- ?. g/ ~$ F9 I
#define  PING_PONG_BCNT          8*32*40
3 c7 u. v0 ~' V0 t  |4 Y+ t  z8 x& @//#define  PING_PONG_BCNT       1 : `+ g1 d/ Z$ n0 [+ @5 I
#define  PING_PONG_CCNT          1* i* p1 A1 d8 }& O9 l6 Y
#define  MCASP_BASEADDR          0x01D00000
8 V1 q" B  _4 n7 ^. Z! ?/ Z#define  Mcasp_RXEVENTQUE        (0u); l; w5 j# Y* z8 d
  ?6 ^6 M( I% Z0 O* c
/* OPT Field specific defines */1 }( W" R" @  x1 I" D
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)5 n2 d% }! W  f5 ?4 B! ~$ c, w
#define OPT_TCC_MASK                        (0x0003F000u)
0 x7 t9 n+ w" b! V#define OPT_TCC_SHIFT                       (0x0000000Cu)
, f3 Z7 Z: H) w- n#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
  |1 h) M: d7 x. W#define OPT_TCINTEN_SHIFT                   (0x00000014u), n! O! {4 T6 B8 K9 d" ^
2 \% F3 C2 `: l( o8 [# N9 f
char ping_buffer[PING_PONG_BCNT];
& @) a7 o% S6 M) v' o4 i! echar pong_buffer[PING_PONG_BCNT];' V$ |& {" s# M* X

. }. D/ `' D* g; i7 u! a( B* B  ]2 ~- I& J# ]  a2 w

* p* |9 Q& s% G- T% r% V9 w& |* O- y! Q
static void ys_edma3_init()7 a) D# L! w2 [
{
6 T' x# x$ @. s. f& v' ~7 m        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
$ F, s7 f+ t5 t4 ^        EDMA3_DRV_Result result = EDMA3_DRV_SOK;; S! G9 u9 r: Y& S. z
        EDMA3_DRV_Handle hEdma;  q. F+ i9 l6 n! E+ m+ ~+ X
    uint32_t chId   = 0;7 u9 ~( o, H9 g  [. J
    uint32_t tcc    = 0;
5 y( R1 C# ^8 ?* D; c
- U7 S; }" Y. R" {4 |; L    print2arm("edma3 driver init...",0);
. f0 m* w* v* p( _5 ?$ i  a$ a
9 X! A9 Z" f$ q        hEdma = edma3init(0,&result);0 R3 c6 `6 {1 O) N4 \; ~0 `3 n# b
        if(hEdma)' B7 d5 C; Z; A( P- u' ?% s
        {
0 y# i; k0 X+ M) A( ^9 |$ V; L                print2arm("edma3init() Passed.",0);( s8 h, m) o9 b. d+ A( F% i
        }% R/ Y0 P6 J: a9 ^7 w9 A( j$ E: ~% A
        else: I) J' P4 A  ]! ?! A+ m% f6 j4 c
        {) f, J, y2 C& S, d& _3 ]3 U
                print2arm("edma3init() Failed.",0);) _- o9 J% R, V( V: m& p
        }4 [/ Y  L1 |6 L
        ; A; X) v. w8 Q: B
        if (result == EDMA3_DRV_SOK). Y7 l8 Q. }8 v2 J, d
    {" w3 J7 j. j4 c
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% r* V+ W2 i* u2 G7 P: i5 F8 O% K3 S; K                                                       (EDMA3_RM_EventQueue)0,
: h1 E. }: S' d; l3 Q0 e& B; f( U                                                            &edma3_isr, NULL);
& ?. Y" Y7 `5 F8 U- Z3 r$ r    }( Q( S$ c6 u6 I" u, r- G7 s
       
" [: n" U9 {* d7 H% n        if(result == EDMA3_DRV_SOK)- I! D6 u; A$ a5 k& i5 d/ o
        {4 Q6 p( A% [' W
                paramSet.srcBIdx    = 0;& l! N" x+ }, f2 T. ~
                paramSet.destBIdx   = 1;
0 @( s* n% C+ u# k4 i                paramSet.srcCIdx    = 0;
1 k( G: S( r( ?) P. N1 E                paramSet.destCIdx   = 0;
) g" R1 t7 ?$ t! X' b3 }                paramSet.aCnt       = PING_PONG_ACNT;
8 R" r! `$ c" n( _) I                paramSet.bCnt       = PING_PONG_BCNT;* a* Z6 N- ?( p- J7 S4 o  B# z8 W9 g% ]0 L
                paramSet.cCnt       = PING_PONG_CCNT;7 G" e9 G& i# E5 h% n, i# T: D
                # q/ r8 @+ ~; A$ B/ }
                /* For AB-synchronized transfers, BCNTRLD is not used. */3 n* i' v) c5 a
                paramSet.bCntReload = PING_PONG_BCNT;: G4 B+ R8 y3 z( p- e
' k' U& e& n: y( q
                /* Src in constant mode Dest in INCR modes */( a4 v5 y* z. H
                paramSet.opt &= 0xFFFFFFFDu;' D  s/ f8 f/ ?% ?
                //paramSet.opt &= 0xFFFFFFFCu;
3 `: s0 V4 e; f; }. X8 ^2 Q               
" ^; L! W- N; _# F                /* Program the TCC */
7 h0 F& X0 T, I' y                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);- ~/ L) H7 X- W' E: t) q& `

, ]' f- K/ f4 q. G/ W                /* Enable Intermediate & Final transfer completion interrupt */9 V8 L( e8 A: X% r, M
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
: ^7 v! \0 X+ g                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 w" d! y/ h& R2 E, y0 Y, t1 s( @" R* Q& s! k3 p
                /* AB Sync Transfer Mode */
# y% r: j# b1 F) Y+ c6 t                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
( I! B, p# q' \3 u) m               
) ?$ p8 `0 A$ l                /* Program the source and dest addresses for master DMA channel */
$ S, C; V2 x$ J; Y7 c  F; p1 v                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
2 u) x6 y! H4 H7 A7 F+ W                paramSet.destAddr   = (uint32_t)(ping_buffer);4 \9 c1 m& u" n- H! f) ], C

: q$ F9 k) k1 H9 H+ S# g                /* Write to the master DMA channel first. */6 J( L$ v# B: N' r% u/ s
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
* n" t8 R: c" Q5 z/ I    }      
6 Y: v" O2 u, @- d
: E# e. q" ]% v- f7 o        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
# [1 B/ H- k1 e        / _; k: b0 v* V. T+ }& w8 l& A6 n
    if(result == EDMA3_DRV_SOK)
/ Q2 f/ W$ q7 n3 S* ~6 ~    {3 C8 ]) E9 E! d2 V' e
            print2arm("edma3 driver init success.",0);7 O/ }5 ^8 X- S! D+ s
    } ( m+ Q3 O3 }% w) `9 l
}
- f$ }! }4 S6 Y) ~! ]! y, X$ [" V
( s* j! n1 ~3 P9 O# D
, R( R  N* r- xEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
3 L; \' W( `/ }5 }
+ I! o& u% \  e$ B* Q
! x+ \- }+ A5 S& B: ~( m3 O! i9 g
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:478 G# j! F- {& U& C9 W$ H' W  q
每次DMA传输完成后都要再次使能传输

9 M; ~+ l$ B) _1 G6 x5 e原来是这样,我明天去试试,谢谢了!




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