嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ s& A' |6 w" y1 [% l5 P) Y7 `#define  PING_PONG_ACNT          1
5 ?- Q+ ^# j( P2 j: M5 Q8 ?: _#define  PING_PONG_BCNT          8*32*40 $ ^* y2 N# Y8 K( S& o- Y) X4 r  D4 ~
//#define  PING_PONG_BCNT       1
7 F4 A* L% h$ r2 V0 J. b#define  PING_PONG_CCNT          1
) q. d5 ~/ Z0 K  u! @1 L#define  MCASP_BASEADDR          0x01D00000  o; Z7 Y0 P8 ?3 z# p* M* R# l
#define  Mcasp_RXEVENTQUE        (0u)) |% \' ^/ j& E* f; ?# G
1 V1 P% n# q' S* x* ?6 l
/* OPT Field specific defines */% p# |& o- Q( D! U1 Q4 u
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
6 Z( G" [% D# ^2 D2 g( H#define OPT_TCC_MASK                        (0x0003F000u)# ^  W3 E; x" O
#define OPT_TCC_SHIFT                       (0x0000000Cu)/ V* |( r2 }4 j
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
9 K; X( H8 Z2 ^$ G5 z#define OPT_TCINTEN_SHIFT                   (0x00000014u)  K7 S: D7 s8 X4 k3 V0 H
1 A  K/ Z- U: D9 _: r" ~/ Z- @
char ping_buffer[PING_PONG_BCNT];
  v# H; h3 t6 Pchar pong_buffer[PING_PONG_BCNT];
8 D9 c4 x0 d* N& W
. d" T' s+ _/ l1 r8 v( O8 {
8 S) t- |3 ]6 Q9 v5 ^; L
' A* g2 e5 [1 S. a) Y9 k
# p: H- s0 x0 r, o% Q6 l" f- i9 gstatic void ys_edma3_init()* d7 c' x+ c) {1 c$ A
{
7 ?9 Q- o7 R+ H. I        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};, g4 i8 C5 B1 K; _* \
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;4 K4 d7 e. }" k& g9 w7 i8 G$ M" y7 Y
        EDMA3_DRV_Handle hEdma;
1 Z5 n* }7 g/ y1 H    uint32_t chId   = 0;
" f" R( y0 k& \, g4 x3 D, X    uint32_t tcc    = 0;
) b( a; ^: L" Y* o1 W
" h" i2 ^# p6 l' c- f2 U/ p    print2arm("edma3 driver init...",0);4 x: i' W( x. r. e( z( x

/ s! l1 n3 z( _) @; S! @8 ^        hEdma = edma3init(0,&result);" a' o( @5 ^1 F9 s
        if(hEdma)
6 x% F, ^  w1 V        {; _  J' Z( B/ S9 T* ?& @7 L% I
                print2arm("edma3init() Passed.",0);* s$ {* T9 b2 F  ~
        }8 i4 V$ \  p$ c3 I
        else
: b/ A4 R: ]- l  V4 y+ n        {: K* V7 \2 V+ x, V' d
                print2arm("edma3init() Failed.",0);0 l- h; H9 w& W: h6 A! j4 H( R
        }$ Q2 Y4 F1 q: O3 h' b) C" n
       
- K/ Z! i) }2 `8 I! J1 g        if (result == EDMA3_DRV_SOK)+ Y& g. o+ f% e4 h1 l
    {
8 R, R4 b$ m+ a" p5 M                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
8 \3 ]* N! _9 y9 v                                                       (EDMA3_RM_EventQueue)0,
6 z& d0 V5 P$ k; ~7 V                                                            &edma3_isr, NULL);5 B9 x7 B9 S" j
    }
9 d7 d& L! {/ Y1 o* G; n        + ~9 c$ ~6 m# p  s1 x' ^, `
        if(result == EDMA3_DRV_SOK)
9 p: ~( i, F. }5 W% h        {
% K$ t  {# s7 ?& }2 Y. G                paramSet.srcBIdx    = 0;
' o( w4 F9 K2 Q8 x5 k! x' w                paramSet.destBIdx   = 1;
- g, R$ ]/ m1 [$ U: N; s                paramSet.srcCIdx    = 0;
0 v3 d# A5 O: F; Y, q                paramSet.destCIdx   = 0;
5 }( C. @$ y; d  k; b, e$ Y1 g                paramSet.aCnt       = PING_PONG_ACNT;4 ~0 {2 ?! m. L. L8 N
                paramSet.bCnt       = PING_PONG_BCNT;0 Z& }( ^& M- l1 E% c/ q
                paramSet.cCnt       = PING_PONG_CCNT;
9 h7 S5 {0 K0 p; x6 Y4 G4 I/ x                7 d) C4 Y. q' b2 Q4 F6 d/ i
                /* For AB-synchronized transfers, BCNTRLD is not used. */  o2 l* C  \$ i7 N
                paramSet.bCntReload = PING_PONG_BCNT;
: B$ Y3 L' E" @: l0 n( l
! t0 Z/ ~( y) V8 A$ C0 ?5 b                /* Src in constant mode Dest in INCR modes */5 V" T* f" X" T7 h* B5 N. i
                paramSet.opt &= 0xFFFFFFFDu;- I& `. s+ P: [4 N5 }/ F: X) z  b
                //paramSet.opt &= 0xFFFFFFFCu;( G" Y$ _9 f/ c' Q# e4 y' j
               
# c1 n$ z3 S% }4 V                /* Program the TCC */5 r* ^$ |: B$ t* J9 M( s
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( f: l- d! l( |9 K' s  O$ l+ o( V
4 U4 g, I% H/ i- J+ B0 t( T) q* L& f
                /* Enable Intermediate & Final transfer completion interrupt */7 [4 w% m- M7 F
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);1 O4 x) l5 I9 x7 [
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 O7 ^2 G2 a- V% _% T# I! U
1 f+ U" `) {8 [1 l+ N
                /* AB Sync Transfer Mode */6 _9 _, V2 K! {
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
$ r+ |1 |3 W! c/ x                7 X% H: Y; ^0 Q' z- X
                /* Program the source and dest addresses for master DMA channel */$ H! E3 v# Z: x% s2 W7 h; x
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);0 k4 E" |6 \2 v4 n3 {# t
                paramSet.destAddr   = (uint32_t)(ping_buffer);
8 [& J) X! P6 ?- Y
8 w# }& B9 O2 v( O                /* Write to the master DMA channel first. */
8 Y2 p. p5 o: c) K* l                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
" ^7 l$ l  A% L: L; y    }       8 F" W( V* o% V- g- D4 o3 x

8 |$ K- _# o* @1 ]        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);3 u0 W" J6 X9 Q2 ?, S& N
       
7 u4 |5 w/ s2 x  e    if(result == EDMA3_DRV_SOK)
* f+ E% ?5 p+ I% v1 T    {
5 K, r, C8 |! N( [' x            print2arm("edma3 driver init success.",0);
# o0 [, V3 C/ A' \% E    } 4 J$ ^" r9 S9 M( r2 _* N/ X- V
}6 w4 p8 X0 \. p
3 X0 f9 k- n9 \" I+ v( ~& S

) p/ S+ C6 G/ c% nEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 P! F+ N9 }6 p4 g  }5 E
  a! O" g1 }4 y9 o1 Z1 A" `* Y# k8 x# c5 x" t

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47$ \2 F/ n% j0 Z/ Z0 g( u
每次DMA传输完成后都要再次使能传输

' |5 t. B( Q1 S* b5 P+ X原来是这样,我明天去试试,谢谢了!




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