嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" R  q7 ^: J- ~  B1 f1 r; c#define  PING_PONG_ACNT          1
" i. g+ y( v3 u, ^+ e& n" z, n) B#define  PING_PONG_BCNT          8*32*40 ! |7 e( n0 k" r0 X9 k+ d. y0 f( x
//#define  PING_PONG_BCNT       1 % I$ t* }( f! s1 K+ [4 V: n
#define  PING_PONG_CCNT          1, i: v0 T0 v7 \8 S+ s
#define  MCASP_BASEADDR          0x01D000005 u8 N) e% d( K  q, W5 ~
#define  Mcasp_RXEVENTQUE        (0u)9 p% m, S4 ^# ~; ]" t. _
9 j* |4 v# d, o5 V, d% G6 z
/* OPT Field specific defines */# ~3 l: C0 t& x/ O
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)1 U1 e' A. B% M. z; g
#define OPT_TCC_MASK                        (0x0003F000u)
2 `" ~  I$ N& j$ P$ v' W$ J#define OPT_TCC_SHIFT                       (0x0000000Cu)
4 c- W1 A$ A* J; M4 u: S3 a$ o2 s#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& H- R, R  u- g# ]3 v
#define OPT_TCINTEN_SHIFT                   (0x00000014u)! o: d" t( X# b! f5 e
0 H1 o$ @" W1 y' m& s
char ping_buffer[PING_PONG_BCNT];
3 z" O. ^7 z# n3 h1 d8 Qchar pong_buffer[PING_PONG_BCNT];$ j. k% [9 W) V) G% W  u" H& {
' |0 p* H$ R+ B' v& r0 j
. Q1 T) [$ d; U) P

& ~( b& u4 d5 B! `- x# v, m
0 ]  P$ |! Q( s" Z4 s1 Xstatic void ys_edma3_init()1 G9 c- ]' k: Y9 y3 I
{1 I/ R( z( ~) A: E9 Z
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( h3 R6 v6 I/ o6 N
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 U" k& C! p) i; v7 ^0 g7 ]% Z        EDMA3_DRV_Handle hEdma;: Z' K" e( i1 K2 ~; X
    uint32_t chId   = 0;. b- t) C+ a* X0 l. p& _8 P
    uint32_t tcc    = 0;, E' [% c. p- l0 u% {" E& N

! G) O4 [) X5 |    print2arm("edma3 driver init...",0);
' T" g1 l  ?: Y) F  w+ n3 V: N1 s9 _9 p, Z( W; @
        hEdma = edma3init(0,&result);
. a/ N# y5 t/ c4 y/ F        if(hEdma)
8 L( P! w$ M2 a  P+ V/ g        {
/ q: [: Y8 K( g5 z5 f2 u6 G                print2arm("edma3init() Passed.",0);  o, ?  i. k9 G, _0 W
        }3 P+ N/ A  q6 f( Z
        else
" J9 Q1 ?4 p, H! r$ a0 z8 }) D        {
& L4 E1 T7 L+ j8 H: d                print2arm("edma3init() Failed.",0);
( C2 x6 ?- K' v! `        }) w4 c) y) ^' @" W
        . Z5 E* d/ ~; q$ Q, o* r8 K( c
        if (result == EDMA3_DRV_SOK)
, z" e9 E4 \) j! V; g  }    {
0 i( \* P1 ~6 p- B( _1 c                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* W- o. m0 i. L! z; q                                                       (EDMA3_RM_EventQueue)0,8 t6 ]+ v% a# I2 w+ u
                                                            &edma3_isr, NULL);: R( e3 g$ T: w$ H& l1 j0 D
    }+ n  e. j' P' s, l
       
5 T- }' t0 ^1 W/ W2 k8 A        if(result == EDMA3_DRV_SOK)+ x( @8 F; m% F3 R
        {' n; D" W; p* L. I/ K  Q* x) ~1 a7 u
                paramSet.srcBIdx    = 0;8 K, y% E; ]- ^& D' B4 u* y
                paramSet.destBIdx   = 1;
6 s$ W! F% M# T* E                paramSet.srcCIdx    = 0;
7 J+ u4 L! T8 l. F4 b7 T" V                paramSet.destCIdx   = 0;+ m; [6 b' j7 u6 ^
                paramSet.aCnt       = PING_PONG_ACNT;# V9 z2 E4 M" f# l* }
                paramSet.bCnt       = PING_PONG_BCNT;  S/ f3 Z6 Y6 `% J- ]4 y
                paramSet.cCnt       = PING_PONG_CCNT;
( j  g& H! O. O1 \. X. J                : k% ^+ R7 W6 P( Z' p
                /* For AB-synchronized transfers, BCNTRLD is not used. */! q" _; V" g5 Z+ \4 l, U( T
                paramSet.bCntReload = PING_PONG_BCNT;
* \- M5 @0 m' {4 U, v
( ?+ u1 z8 e: u4 g3 ~4 s                /* Src in constant mode Dest in INCR modes */
% N! O  f/ f3 h( i5 t8 T7 `                paramSet.opt &= 0xFFFFFFFDu;- A! N1 b5 E" q5 m5 {9 b
                //paramSet.opt &= 0xFFFFFFFCu;
, B2 t6 [3 ~  _' o               
7 v, R& X% Y; a9 n4 l/ C) s3 e                /* Program the TCC */
+ D; n2 c  ?" k9 i                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' [: K0 [9 j7 \* {. }* N2 x9 @4 \. |. A
                /* Enable Intermediate & Final transfer completion interrupt */. [! ~9 ]  m  d% E1 L" M
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
4 m. F: ^- f6 C. b                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
( K$ U& o& }4 O2 E0 t9 n' U1 F$ ~/ p* p$ H, y; z: y1 |
                /* AB Sync Transfer Mode */& e# f; y! O' w! K" U( e! c7 M
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);5 g/ j4 V2 M) N) Q/ b
               
' W: `" m- L# c' o                /* Program the source and dest addresses for master DMA channel */( o$ p* L( v5 o6 r
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
' b2 S; t' q9 h2 K9 |) C& h# O  n% c                paramSet.destAddr   = (uint32_t)(ping_buffer);
$ T9 z: g. V- j9 P
; M3 s! {8 @* R6 O, Q2 T                /* Write to the master DMA channel first. */3 t8 a$ n/ E6 Z; z
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 Y3 u+ X9 F8 U" T% ]" g    }       ! W' {; G" z. o- S

* U* r+ b  O0 }' \+ s7 C5 P        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 S  P; ~2 v$ b9 B       
8 a+ k5 }# h3 T0 F    if(result == EDMA3_DRV_SOK) 2 ]! B" C* B& j0 i# `# j7 }0 B
    {
1 {2 ?$ j( \6 e3 i2 R' q' w            print2arm("edma3 driver init success.",0);
$ f/ y/ F1 V$ G$ x+ N    } ) _7 x/ t( L+ w+ Z- _
}
/ I% ^  F2 \; ?6 k" P$ S$ O3 t8 {6 R" f1 v, u$ w7 J, d

) s3 u8 X9 L. dEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: ^; q( \& h+ C4 J4 J- U+ ^4 J! S9 Q6 T& `1 H' B1 K+ @

. R% Z" V# Q- }7 H* }7 ?& r+ \9 u
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:471 y$ L& o$ N4 i0 v' r. a2 r
每次DMA传输完成后都要再次使能传输

! ~5 a- c3 [/ v( `5 B& y原来是这样,我明天去试试,谢谢了!




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