嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 v( b; B8 |! D# s2 Z4 \#define  PING_PONG_ACNT          1. T6 m; K8 a' |. O# N
#define  PING_PONG_BCNT          8*32*40
, X% `5 u- f  F& j  ?5 E4 A//#define  PING_PONG_BCNT       1 : D! N, N* }! Y0 w8 _. s! M" a
#define  PING_PONG_CCNT          1- D3 ~6 V0 L9 N' x* {
#define  MCASP_BASEADDR          0x01D00000
2 A1 ^9 Y% H9 q4 p; K# S#define  Mcasp_RXEVENTQUE        (0u)% R6 Q, x# A0 I" W* @- b
6 Y. W- \! @6 a: z
/* OPT Field specific defines */
6 q7 E* n$ s; m1 ^1 }6 H1 W5 {#define OPT_SYNCDIM_SHIFT                   (0x00000002u)9 y0 ~* g6 u' w# r
#define OPT_TCC_MASK                        (0x0003F000u)2 o4 A. ]8 f# [" U7 b& Z" Y
#define OPT_TCC_SHIFT                       (0x0000000Cu)
% l$ Q  x- V- G; _, K#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
! v# f* t7 u* }: X#define OPT_TCINTEN_SHIFT                   (0x00000014u)
" J! j* d/ F/ B8 u: p  j5 C2 ^+ l: y- k; f7 Y- p
char ping_buffer[PING_PONG_BCNT];
" ?4 C9 b4 G! rchar pong_buffer[PING_PONG_BCNT];
8 c8 n  h9 R% u- v: ]4 ?6 u' H4 T) O* c* x7 V! @7 t" c9 y
- @# O, E8 ^4 G- \& |, j

" d7 O% t# }- g" _2 `  |4 \% n" j- t! h3 k6 K
static void ys_edma3_init()3 V/ ]5 l$ K5 Y9 v" _; n+ G
{
1 R2 v' j; B  C0 i1 z        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};6 y. }; K, x  Q
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;; D) }: z! Z; g% b$ v
        EDMA3_DRV_Handle hEdma;  `$ \2 ~8 ?! m# B8 N3 }. ^
    uint32_t chId   = 0;4 [1 C6 e5 |5 U  ^9 |4 q  O1 m) ~0 }
    uint32_t tcc    = 0;- u' T: {4 z* L* F' Q  B. Z7 K4 Z6 b: N

# j5 c/ {; d4 o1 a# U) ?    print2arm("edma3 driver init...",0);
7 }+ ^0 y* N8 H1 v$ o; V+ n& X" T, g
        hEdma = edma3init(0,&result);
# R2 B' F+ i) X; U' r: x: w3 \- r        if(hEdma)
( q; |) I  X5 \; c$ K8 R6 z        {
! ^$ a# [% o* N% d$ F                print2arm("edma3init() Passed.",0);# c. Q8 u6 E5 b+ x8 Z
        }
4 i2 }2 b8 I! M7 I3 E- u0 ^        else
; t$ N( P7 f2 t, C( j        {! f8 z* ~& T+ \
                print2arm("edma3init() Failed.",0);9 l7 x3 a* F- N  B5 C) i1 {
        }
  [' Z( V5 o' ?. p6 _6 x       
' I  E/ F- C8 K0 [' X. F3 Y: |        if (result == EDMA3_DRV_SOK)
5 ~3 g" g+ t: W1 }" U: G    {& o/ t" H" M+ \! O
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, b3 s  H! n  u                                                       (EDMA3_RM_EventQueue)0,
2 Q  ]' f  d6 n3 c3 b                                                            &edma3_isr, NULL);2 T9 b( I4 }5 f1 N2 S8 X$ ^
    }
( L' I8 _! @, I# I, w        : a* h6 c: u% P3 ]; E5 t8 w5 N3 Y$ ^
        if(result == EDMA3_DRV_SOK)
/ S" I2 |! w) ?4 c  C        {
& b) S% x0 a8 E( L                paramSet.srcBIdx    = 0;) ^( y7 v5 M0 P, L% J
                paramSet.destBIdx   = 1;
) N. o4 f0 n; P5 ^                paramSet.srcCIdx    = 0;# {2 r9 ^. c% Q7 h" s
                paramSet.destCIdx   = 0;
" A! ?: t' v$ o8 y" A8 t                paramSet.aCnt       = PING_PONG_ACNT;6 j7 G5 @: z7 m( R
                paramSet.bCnt       = PING_PONG_BCNT;
7 L+ P8 T' N$ t/ `) k% U! r                paramSet.cCnt       = PING_PONG_CCNT;
8 i  K* d6 p6 e( Y! X# V6 u9 |; H9 n               
# I# d2 h+ r! }" E  R/ l                /* For AB-synchronized transfers, BCNTRLD is not used. */9 v  S3 A9 j6 B5 y" P9 @9 S, _
                paramSet.bCntReload = PING_PONG_BCNT;
9 v1 d; o2 r! l6 ^( S. Q2 Z& k% r
  V7 c6 Q" T; E- E, l                /* Src in constant mode Dest in INCR modes */3 u" m/ g3 `* }6 u0 W
                paramSet.opt &= 0xFFFFFFFDu;. {! b; A1 F$ c; C( y' A( ~# R
                //paramSet.opt &= 0xFFFFFFFCu;
: F* P9 @) ]8 \                9 j; H2 I0 S* W: K
                /* Program the TCC */
9 _; f( \; n3 P                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);) x" K4 x/ g4 f% Q6 z& k0 J" i( I

/ Q4 G, a) y) H. Q                /* Enable Intermediate & Final transfer completion interrupt */; x6 R; U- E2 w, q0 i
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 c/ @) k  v/ ?. l3 y+ E. F                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);% w: E" H6 \- ]: c6 _4 h& [+ J

0 U9 V: m0 I; H3 z                /* AB Sync Transfer Mode */
  @0 {1 F- {: Y4 X0 r$ D                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 K4 y8 b# X4 I- Z' p9 @               
3 x' ?. g* P/ X2 u" E* x3 @                /* Program the source and dest addresses for master DMA channel */
: @* R! g/ x& k! @# T5 b* a                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);* I- z7 A, |# {1 {& u; w; t- F
                paramSet.destAddr   = (uint32_t)(ping_buffer);
4 K6 M& `# U  K" F: M3 v* |4 m2 e  a5 ?5 s; ]6 z. i
                /* Write to the master DMA channel first. */
$ ?/ u! p8 G2 F' R' p                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);( q# r& n1 d7 m8 U1 X. T1 G3 n
    }       ! G3 c/ N7 i8 c8 g5 m3 j
3 W0 g$ }4 L9 M1 u, a+ h3 D
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* \  a- q/ u% k7 n5 A       
- T: M$ N' }6 [) a    if(result == EDMA3_DRV_SOK) 9 a3 R- u/ \& U8 M- N4 W) b
    {5 ~& F4 c5 ~: \; g9 A
            print2arm("edma3 driver init success.",0);( @8 K% X0 O* [# o3 u0 O6 e- x
    } 0 _' M0 x3 ^2 t/ b
}6 S8 Y7 W( L' e5 ^

2 l+ U: B! ~4 I2 t7 d3 f/ X. H$ O+ x: T5 K7 N( `1 y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
) m9 f% M: y: `( K. }' B; c
& {; y+ b, Y( D5 o1 Z, M% G6 N3 w3 H2 h% t: J

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
9 ~4 g3 F& v' D( ?$ \每次DMA传输完成后都要再次使能传输
0 V2 D7 S4 ?4 u8 R4 y
原来是这样,我明天去试试,谢谢了!




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