嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:: C1 ?# g; N& j, A' e& G8 x
#define  PING_PONG_ACNT          1
1 y( j9 l2 w! Q% K$ V- c3 d7 e#define  PING_PONG_BCNT          8*32*40 : [+ T" L6 {6 m: \5 I0 U1 i
//#define  PING_PONG_BCNT       1 6 v& `6 |9 N) G. J
#define  PING_PONG_CCNT          1
* Z, ?9 l5 v, W+ \; m+ M" b  p#define  MCASP_BASEADDR          0x01D00000' u5 M' {: O  e  c$ ]
#define  Mcasp_RXEVENTQUE        (0u)7 }7 [4 |. |4 q* W

& p0 `# A5 o% J) Y% b! j/* OPT Field specific defines */8 w  p# L/ @4 X4 i( {: ?' O  y
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)! ^& o% q4 m. `! v! B
#define OPT_TCC_MASK                        (0x0003F000u)
5 D. o( P9 h* m#define OPT_TCC_SHIFT                       (0x0000000Cu)
5 m5 \! T8 V! j! B/ j7 B& T; F/ L#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 \& `2 R6 Z0 ^/ U$ u" w
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 P) T4 _& a1 R' q& J0 b7 C( d5 c3 ~" Y2 s( \
char ping_buffer[PING_PONG_BCNT];
) w/ M" w5 y& P3 z! e! [( c8 Ichar pong_buffer[PING_PONG_BCNT];
' y# D7 `6 \% I% g% L* X! O! w6 E8 ~$ x  f7 a6 L/ e' g

5 E  b( C  q2 S$ n9 a/ Q, F3 L# y/ i( |8 s+ A7 H0 B- }9 k9 U' c
0 I" Z: A" @7 ]7 K; E2 a
static void ys_edma3_init()3 s: s2 R& W) h2 Q9 \
{6 F4 `/ D1 c& g
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ z& }* @7 [0 R( [; |# `5 T        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 y1 T5 z) R7 Q3 Z        EDMA3_DRV_Handle hEdma;
& o1 U! Y8 q, m5 ?2 C    uint32_t chId   = 0;
/ }. ]& D* B) U* n1 J    uint32_t tcc    = 0;& H$ e7 ^$ v7 l( x
% o3 a- o/ A# ?# d  E
    print2arm("edma3 driver init...",0);
/ e) v1 X/ |1 l% I7 K8 f* @- X; i+ g4 C3 Q- H. N
        hEdma = edma3init(0,&result);
- z8 [/ ~& t: T  b* W5 E9 ?9 b        if(hEdma)- w' ?' d; o: B' `
        {+ Z* x, F% v0 Z7 V9 l" N
                print2arm("edma3init() Passed.",0);
% U+ H, \* H; S8 S. {3 K        }; ?) N. D9 k; d8 N4 [4 Z
        else. H  l; y3 }+ U( j; t
        {; h$ d4 q" m1 U
                print2arm("edma3init() Failed.",0);
/ k* z7 }. @, k: ], U        }) {; u% G8 X* {) `5 `
        & e  v. H- r1 E6 b5 m
        if (result == EDMA3_DRV_SOK)
& f" K7 L& P% ?5 D0 w    {
: H1 H: W+ \/ x( H7 p0 S                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 p0 Z7 v6 ^9 @8 p; [2 k, z- @* M: Y7 j/ Y                                                       (EDMA3_RM_EventQueue)0,5 O8 D0 i1 A" S0 Q! R
                                                            &edma3_isr, NULL);# w& {9 K4 B5 v) f/ q6 G9 e
    }
! s7 K" M/ A7 g! g% a       
. y; w# u+ @  a$ ~3 ~4 \. _8 w  c; I        if(result == EDMA3_DRV_SOK)
3 [* X/ j2 N/ }6 ?" {        {
( o  V. R  X" e7 S+ u                paramSet.srcBIdx    = 0;- q/ C! q4 o* K8 x' c
                paramSet.destBIdx   = 1;* E: b3 G8 k# O* `( |. g
                paramSet.srcCIdx    = 0;
* p0 _; T8 Q" }  c+ `                paramSet.destCIdx   = 0;
) R) \8 s6 D+ |1 W+ v) S* l+ H                paramSet.aCnt       = PING_PONG_ACNT;9 W3 `& S& F4 ]+ {8 p
                paramSet.bCnt       = PING_PONG_BCNT;8 C+ r+ `# m! B* L; c% }
                paramSet.cCnt       = PING_PONG_CCNT;3 M( w. I6 U, c) k( ~
                1 ?- m' H7 K! C  l
                /* For AB-synchronized transfers, BCNTRLD is not used. */& o2 H( z4 [0 M& Z* W2 r- D' t: A
                paramSet.bCntReload = PING_PONG_BCNT;
* ^4 v+ H% D* `/ R" y: Y8 W2 @! u, T7 D
                /* Src in constant mode Dest in INCR modes */3 u. {: ]. A, W  H" X/ V& c
                paramSet.opt &= 0xFFFFFFFDu;+ p0 R  g7 b5 W% B  ]) z2 d
                //paramSet.opt &= 0xFFFFFFFCu;
! v2 R: k- e9 j$ D7 ?3 @                6 C: @* F: G9 Q5 L  r. D1 ~
                /* Program the TCC */) b) B: P. p1 T7 w, a# J
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) I$ ~7 Q0 S. u& v/ I/ C* Y& a
3 o" t" j+ A1 @' }: X                /* Enable Intermediate & Final transfer completion interrupt */
5 U. w+ i, B6 }5 Q6 f3 m' o  |5 l0 v) L                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 W1 y. Y& z: a. z4 i                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);' t3 |6 _8 ^6 t

: B/ l$ ^* i9 N4 {( k- @8 V                /* AB Sync Transfer Mode */
7 n, D) {4 F8 v- X6 s+ s% C  J                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 z1 c9 |( ]7 c: i1 y+ \               
# }1 M  @$ F" L' x2 c                /* Program the source and dest addresses for master DMA channel *// N( ~; B4 M5 g1 g7 L
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);5 n9 t8 ^6 c4 o; K' @1 k$ d
                paramSet.destAddr   = (uint32_t)(ping_buffer);+ a8 \7 \9 H& Z# ~$ l. u1 Z
% z) Z4 G, @) z& @, S9 {3 U
                /* Write to the master DMA channel first. */
0 M1 Y; ]" R4 a4 b/ j# v                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 }# Z. g% c: \! T
    }       & ~' I; M# M/ ~! ^( q  @. T2 a' i
5 d+ S9 E+ H. d9 }' Z% U
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);. H& j: v6 P( b" b
       
8 S* s/ D( N: i& l, \* b    if(result == EDMA3_DRV_SOK)
% |7 W" {3 C: q, Z% }, [    {
! P1 b) {( O0 ^1 P0 b7 H/ U3 k            print2arm("edma3 driver init success.",0);
$ ?6 u' ]- G4 Y  m$ }; x5 G    } # z" P! B# l* o* P7 E! n* a+ Q* ]
}
) Y/ O! j6 b6 O6 ?, x- x1 \
0 u) `0 ~8 ]5 z' v8 I* j
9 [; K5 X' E1 {; g+ v( j, h* o: PEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ I9 ^5 y+ @' Z- p
, j7 J/ p) e3 _6 l# j# F8 N! D; N# D
$ \9 Q9 _2 }/ P# x+ r
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 o+ ^4 n& |. Q; x, I$ |( j每次DMA传输完成后都要再次使能传输

/ [. ]* E1 l" d) x, I3 ]原来是这样,我明天去试试,谢谢了!




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