嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:1 F3 I# b, h: d) }) r
#define  PING_PONG_ACNT          1' @1 J$ O. L6 t' X/ F1 I4 U
#define  PING_PONG_BCNT          8*32*40 , I* I5 ^! o3 {5 D. E  h% O
//#define  PING_PONG_BCNT       1
# w+ k* ]8 T, g#define  PING_PONG_CCNT          1. D% q2 _- X9 d# m2 m7 g4 x2 f+ _
#define  MCASP_BASEADDR          0x01D00000# [! B2 N5 l5 Z, J
#define  Mcasp_RXEVENTQUE        (0u)  D7 S! G$ P; v3 a/ ^. p
4 K/ R2 X( \$ r1 k2 T$ ~$ T. j
/* OPT Field specific defines */
! \6 G2 m# Y7 q# H2 x: R#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 {/ m4 r! J( r4 h( V1 E3 {#define OPT_TCC_MASK                        (0x0003F000u)3 c, b/ N7 W7 B# z. x1 b
#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 ~: @( G$ C! `#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
6 m/ a& ?- e" M9 Z0 F$ R$ b2 f5 I#define OPT_TCINTEN_SHIFT                   (0x00000014u)
% K+ e& N" e3 G- x8 C2 L; t8 K$ U  l4 V
char ping_buffer[PING_PONG_BCNT];% ]6 `6 @0 L* c9 m. B2 i
char pong_buffer[PING_PONG_BCNT];! O# m9 l& I- l. {: ?* F
3 F, b1 U# F1 N( X4 N5 d

6 F+ {% N1 e) A5 U" {& f. G. B7 Q. B. Y9 k  ~' x9 N: [

0 V' U5 s* _, U1 l& e% m4 {static void ys_edma3_init(), O' W4 J2 q4 O/ K5 [
{
4 O+ D0 U- ~( j4 M2 G: f' N        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 w7 Q0 d3 G7 c  H) S! b
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;/ @+ L9 ~+ ~' ^, n* Q4 u- y- T
        EDMA3_DRV_Handle hEdma;  O0 }0 J' }5 h& w7 |2 \
    uint32_t chId   = 0;
. V& w4 S& F, }7 z/ y) }  U/ M    uint32_t tcc    = 0;/ P' E8 N" u  [6 F7 Y# t
& s) Y4 b2 n, N8 |) F+ t6 X
    print2arm("edma3 driver init...",0);
; n) y! n" W4 P0 h* D* z* ~# l2 @6 {3 Q- }) f$ I9 ?9 r0 J
        hEdma = edma3init(0,&result);
6 J1 \5 z* C9 n3 ^        if(hEdma)/ h6 ]0 c5 H0 [0 T4 v' }
        {$ Z/ r" x1 E) M; l, c1 J
                print2arm("edma3init() Passed.",0);
) ^- L% L3 k: K8 F        }5 n+ R, A. b* N4 O5 }! a4 j1 Q
        else$ \; N! ^, ]3 u& V. J4 _
        {
- \, U0 S5 `& y; S                print2arm("edma3init() Failed.",0);& S  V( h( R% d* G% T9 w% ^  C
        }
, w. j/ B8 z1 h        & Y, D3 n3 x% K6 Y9 P$ C7 M7 U
        if (result == EDMA3_DRV_SOK)
0 U6 w8 J" t$ g  t    {1 v. A( f! ^% e1 [/ I
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& _: q' s2 A) y* N5 F                                                       (EDMA3_RM_EventQueue)0,- @: _! [  A( g+ S' x
                                                            &edma3_isr, NULL);5 k! D; Z. q, {9 i
    }
6 L: Y9 ]  d& x6 ?" l7 X9 J) B        " e+ ~+ B$ U$ q# p
        if(result == EDMA3_DRV_SOK)
5 X7 k: o8 j. u% G% O        {
6 s+ r4 T& C- y6 h& c2 _9 S$ _' C                paramSet.srcBIdx    = 0;
% f- d" |% B; U                paramSet.destBIdx   = 1;: k& U0 s) ~2 t- ]( e: @2 G3 a
                paramSet.srcCIdx    = 0;( A# f" S& n# s2 r  [) Y' x; z
                paramSet.destCIdx   = 0;& e, M+ J; M! e" {/ Y4 l8 Z9 y5 ]
                paramSet.aCnt       = PING_PONG_ACNT;
9 @# q3 F/ l& m* R                paramSet.bCnt       = PING_PONG_BCNT;! U! s; Q: ~. l1 a
                paramSet.cCnt       = PING_PONG_CCNT;
0 [9 x( }4 @( k2 ?" `4 t: o8 k; }               
* N& E; d3 `7 A5 A) v                /* For AB-synchronized transfers, BCNTRLD is not used. */; P4 m+ {; _# x  K9 z4 b
                paramSet.bCntReload = PING_PONG_BCNT;
# b7 ^# ]: |, b8 f
9 W) Z) z) g: `5 G8 |                /* Src in constant mode Dest in INCR modes */
" s9 P! L- K0 T' o; o0 Z2 l                paramSet.opt &= 0xFFFFFFFDu;( k5 c  s. ]6 g! H! j
                //paramSet.opt &= 0xFFFFFFFCu;) ^( g+ h3 [  l: u6 R/ d- U- v
               
3 r% w9 h; |2 w2 Q1 Q! E1 ~                /* Program the TCC */
0 y# [9 j& J# _                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);: h, D7 J. f7 E

# w8 J3 Z/ L+ L. n1 l$ T* m8 k4 e/ z                /* Enable Intermediate & Final transfer completion interrupt */
4 h- |# X* z4 c                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- s. K5 [4 }7 ?2 b# u                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! \; _$ E* v2 D" q9 `8 a
- W5 E9 r+ b6 N                /* AB Sync Transfer Mode */
  z0 u1 m3 Y0 W* R5 U                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);. _6 P5 p( g% n' f; s2 k6 g6 i5 j
                4 L' I3 t% R1 _) S6 h& I) F
                /* Program the source and dest addresses for master DMA channel */
1 d* F# D) T) R7 c4 w% g                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
5 r+ |. V- E+ P; Z1 _0 i9 ~! `                paramSet.destAddr   = (uint32_t)(ping_buffer);
+ W- |/ m8 W6 y* o) d9 m
: E  {# w' ~1 c5 j" ^                /* Write to the master DMA channel first. */
: s4 P5 r. d: o, \% u' J                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
% A7 v* j* G( b    }         N6 u+ e6 `/ n# R+ L6 w
4 O% e" ]/ O2 a
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& q: k/ {- K  r) G* ^6 a/ ?
        : N. |$ I0 M2 D; D
    if(result == EDMA3_DRV_SOK)
) {! ^6 v( R5 n# v: J    {6 X8 @+ q6 H9 W& M) E& D
            print2arm("edma3 driver init success.",0);
3 @# e8 W1 W6 Y  m1 C$ |    } & p0 }  y& h! S5 V. N- R/ g
}
& D2 v1 O9 L: G- p1 ~# j0 c- E% k$ H' F  D
0 Z/ N0 Y# m9 m4 G% }/ g! s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' k) ?/ N! B8 t( u$ N$ L1 r6 g6 R# _) n' k- x2 u- x0 O
' b. w! D6 ?: v

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! _( l) r- Y0 M每次DMA传输完成后都要再次使能传输
( D' R5 \3 Q: v+ r1 A
原来是这样,我明天去试试,谢谢了!




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