嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:6 f0 h% F2 i& n- Z/ I6 a
#define  PING_PONG_ACNT          1
, w! I: W, o8 O. Z, f: }, K6 a#define  PING_PONG_BCNT          8*32*40 9 ]( E+ T2 o7 j  b# m
//#define  PING_PONG_BCNT       1 ; |; M% ~8 v' N: I$ @6 r. p
#define  PING_PONG_CCNT          1+ Z- ~4 L& e) _* N. b8 H
#define  MCASP_BASEADDR          0x01D00000
8 i; z0 Z& `  g7 F1 v#define  Mcasp_RXEVENTQUE        (0u)- J! }- E* W  w7 B& [8 C, ?" T* G
2 {4 ^* x& c# t2 V& s0 X
/* OPT Field specific defines */- f* g, i6 L1 x/ e
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)5 p7 W3 d) G( u) |7 v; ]
#define OPT_TCC_MASK                        (0x0003F000u): Y! D5 {! Z$ g
#define OPT_TCC_SHIFT                       (0x0000000Cu)& j( @# [+ m7 O" X6 m# q0 l5 _% t
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
0 I" i  K$ o8 G#define OPT_TCINTEN_SHIFT                   (0x00000014u)' X- A6 P$ }; @7 @- w$ J

  `, c0 c, _8 B; K* v4 R3 dchar ping_buffer[PING_PONG_BCNT];
- n4 s, k+ H7 Q/ ochar pong_buffer[PING_PONG_BCNT];
2 V3 s4 G! J" |
. M% e8 x- J% Y- ^4 k0 r) k
  R$ T7 W5 f0 _$ C
+ K4 i6 X+ t; R# J
: ~  W# l; Y, |1 Qstatic void ys_edma3_init()
* y. |, O$ F" C{" F" N. B; A9 V0 ~
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# `( z+ v, p9 \        EDMA3_DRV_Result result = EDMA3_DRV_SOK;& w0 D) N1 |' A. _, n: A
        EDMA3_DRV_Handle hEdma;7 b0 h/ ~8 l: I$ l: e
    uint32_t chId   = 0;- l! Q! ?* O, c
    uint32_t tcc    = 0;# f" A9 S% {& f7 ]. S

0 n  W0 x" X' n7 i    print2arm("edma3 driver init...",0);* m3 q; y  A# ]
% p1 e# }! Q9 ]
        hEdma = edma3init(0,&result);
! y0 h  a+ p( r5 w        if(hEdma): u, A: b1 I2 A6 I' C3 Y" P
        {
" ^# N5 B  ]9 o. V                print2arm("edma3init() Passed.",0);1 N& Q( q) Z. v9 U
        }
# i. q5 _1 V: z1 x1 k        else# _2 c/ I, ~3 g, X( T
        {
6 V7 M; i1 x7 l5 Z1 _: \7 t                print2arm("edma3init() Failed.",0);
  y7 r* `( U7 ?5 ~" K' y& I        }
, N+ l( R6 D2 _  j9 p4 l        - k) H6 `3 ?, y5 t
        if (result == EDMA3_DRV_SOK)3 ]$ G' M( V  f0 b% l" K8 n
    {
& |% N) U7 T) j( a7 W, h                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
. ]6 j7 |) H, Z3 E- f                                                       (EDMA3_RM_EventQueue)0,* l- \. o8 _  q  s. F$ p- Q/ x: g1 W' a
                                                            &edma3_isr, NULL);% p# N  V, d5 T3 v/ s; A
    }8 e% |# N6 J" K
        + @# d3 k: S% Q3 m
        if(result == EDMA3_DRV_SOK)
9 }' u6 @! F5 w+ f        {: D1 M# C9 `$ Q* l1 o, l
                paramSet.srcBIdx    = 0;
$ }* }' f2 d" b3 w: n! q  r7 o                paramSet.destBIdx   = 1;. ^0 z$ M- r7 d9 b2 [- N' m
                paramSet.srcCIdx    = 0;) f/ [+ c: K' ?- X% d0 E' n3 a
                paramSet.destCIdx   = 0;! ]  M. v/ ]" e/ J4 D1 Z2 p
                paramSet.aCnt       = PING_PONG_ACNT;
! x' W" j; O- H5 E                paramSet.bCnt       = PING_PONG_BCNT;
1 Z- u0 P1 ]; {& t6 [9 q                paramSet.cCnt       = PING_PONG_CCNT;
8 `% I' t! s* D" L/ c5 {8 b' [5 R9 D                % u( n+ y+ ?# ~  O1 u, ^' b
                /* For AB-synchronized transfers, BCNTRLD is not used. */% k% N" N& D9 M, J; |8 w: c& m$ X
                paramSet.bCntReload = PING_PONG_BCNT;3 {9 B( K' s  L; G& q

2 \) H2 ]4 e$ H6 [, f$ I                /* Src in constant mode Dest in INCR modes */' l2 X6 }3 }5 Q# t. q8 a* ~2 k- d% P: i
                paramSet.opt &= 0xFFFFFFFDu;6 {6 B1 n- m& Z! c3 `. F0 k4 P
                //paramSet.opt &= 0xFFFFFFFCu;
+ w+ V. U9 Y. ^$ D4 K               
) L0 ]2 y8 _/ L8 _# b) k                /* Program the TCC */4 }  `- ~, J) k1 a
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);7 n' N& x% @: ]3 e+ e
1 p* ?  c( f4 {1 N5 M
                /* Enable Intermediate & Final transfer completion interrupt */! L) P& @5 w- {
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);% o4 ?, X! O: Q2 _
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& y; k" V% d( C2 |& l+ T/ g' A
1 p5 }' P! F/ x! @/ I3 G
                /* AB Sync Transfer Mode */, w2 S5 ^- d/ `8 ~# L
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# S  R3 A& d3 f, A: [
                / f* \7 V* n& v# n/ O
                /* Program the source and dest addresses for master DMA channel */3 r- q6 ^; r% z4 z
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
" a! @' `% s6 Y6 s                paramSet.destAddr   = (uint32_t)(ping_buffer);
8 ^" _! a3 ^7 @; a4 @1 l% |5 `# r/ V- W) a4 [
                /* Write to the master DMA channel first. */, {  l# @: Z5 E2 c
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);) D) o2 b8 |' X3 P8 ?
    }      
" l7 b+ ^3 |. x$ X8 [6 Z) G
" Y7 \" I; K# i6 B4 u$ A        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! |/ y3 D, W6 k0 Y       
  y! B) I& d8 i7 Q1 p8 g7 K) K. E    if(result == EDMA3_DRV_SOK) ; b: y( a$ o8 V; K5 p
    {1 e/ Y0 C. O% d1 F9 I! B
            print2arm("edma3 driver init success.",0);; L8 }; V6 Z9 P5 ]2 E9 T7 J9 {
    }
. g$ N9 c1 E) l: Y1 R1 }}
8 V: _0 X/ q3 U0 I4 O& y" i
4 h# L( c) {1 p1 z, b, R) J% y1 ]1 B- v$ ~
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。) c9 ?/ H5 y% K& q- C0 Y2 l
7 J! b0 ]; }. i
% A5 I* G3 Q8 |( y+ H+ T3 o

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% c6 {: L; N* P/ [: r每次DMA传输完成后都要再次使能传输

3 ]8 {* k% A( ^6 P. `1 j; n原来是这样,我明天去试试,谢谢了!




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