嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' Y; q# a& P  x& Y& G6 E#define  PING_PONG_ACNT          1
. _$ @* a0 ^) S; u# G. @, l#define  PING_PONG_BCNT          8*32*40
' d+ Z# \* t6 k//#define  PING_PONG_BCNT       1 % S# |" m2 p5 j
#define  PING_PONG_CCNT          1
/ B9 H( P3 E, m6 E9 m0 X) u7 C#define  MCASP_BASEADDR          0x01D00000
$ G" e9 u, p* \% N3 J% M) M! j#define  Mcasp_RXEVENTQUE        (0u)
! @' B! O1 p  Z' [+ Q6 r% |5 [8 v6 Y& H3 i/ x( k. M
/* OPT Field specific defines */
9 o" U; H' ]+ J9 H: t" O#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
; H4 B/ p2 k1 H; H3 m, |0 ^, l#define OPT_TCC_MASK                        (0x0003F000u)5 \8 S) k- Z7 e4 d
#define OPT_TCC_SHIFT                       (0x0000000Cu)
7 }8 P) M. P* r/ _#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
% ?$ E) ]( [- C#define OPT_TCINTEN_SHIFT                   (0x00000014u)
6 c5 n9 ~8 s. d. d* z0 r% C7 {0 p8 [. `) c/ a# z/ A
char ping_buffer[PING_PONG_BCNT];9 t; d* H* h8 R$ P+ {* ^' q+ }# C
char pong_buffer[PING_PONG_BCNT];& C& i0 v$ C7 K* M1 U8 k; Q2 e2 ]6 L

! J: O) x* i6 f2 P/ q7 s8 t3 Z, W  o- d. N. t1 T& t; _
7 J3 Q  P  a/ b' a) f2 h
8 ]; A- J) d! D8 _; g$ J( T' |0 g
static void ys_edma3_init()
" `1 @- _( Z- v& n! g: ~{
+ V- [7 g- C+ r- I( Z- n        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
* i7 K* Q8 ?- {) K7 K        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) i3 q+ u1 {- h7 x" A        EDMA3_DRV_Handle hEdma;
7 R. v( f- h4 f/ |7 M# G. B  d$ t% p" Y    uint32_t chId   = 0;
# {" [! C- P/ G. w/ A    uint32_t tcc    = 0;9 z2 G$ p% g1 Y  q
6 ]+ t- K% W9 O7 q
    print2arm("edma3 driver init...",0);6 j( N" t7 l6 h! l

, s; c( m" Q: O        hEdma = edma3init(0,&result);
* J/ i/ y3 P2 K8 B6 w& J        if(hEdma)/ E3 V0 h) D) _& n; F% h, j9 Q% m5 K
        {2 U4 x+ l% E: C4 U. ~# u
                print2arm("edma3init() Passed.",0);: X; T. I* \( G1 v6 E# k
        }
1 {' R1 S9 a0 ]  Z7 ]) l) ^        else6 r8 A  b; X0 h% q+ q7 A% C+ O8 N
        {+ ?1 I! ?2 C/ W
                print2arm("edma3init() Failed.",0);
& p6 i+ }. v/ S) }2 O) [8 J8 t        }
6 r* l7 c9 C* ]6 @        0 A  x- Y2 t, ]$ l1 s3 Z6 S/ A
        if (result == EDMA3_DRV_SOK)
" `4 c1 t! a7 Z* u+ j    {
1 `2 F1 z/ r5 [  o                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,) ]8 f' V! I9 s% v3 [
                                                       (EDMA3_RM_EventQueue)0,
4 H9 ], L3 K5 v                                                            &edma3_isr, NULL);* n% D* l& e# c+ A: h$ r
    }4 B9 C: s/ k' |9 }
        $ _) v: {7 }8 b5 p. A$ J: m- W* g- o
        if(result == EDMA3_DRV_SOK)$ o: `, W, K$ `5 n: _. h/ H
        {" P* m& m, i! e5 h2 n3 w# q" X
                paramSet.srcBIdx    = 0;9 ]3 j& w+ ?  i; R* X5 l: g3 c; p
                paramSet.destBIdx   = 1;: s  W+ C- Y1 f7 X
                paramSet.srcCIdx    = 0;& a2 N6 @+ m) d
                paramSet.destCIdx   = 0;
  v4 z6 M$ c% n# K% o1 g5 Y) E                paramSet.aCnt       = PING_PONG_ACNT;
1 V$ u( V( B7 ~1 Y/ v                paramSet.bCnt       = PING_PONG_BCNT;
: f& k5 z3 _/ o: A                paramSet.cCnt       = PING_PONG_CCNT;
9 P8 B# @- {2 f/ M1 k% @                / T9 F9 Y" ^0 Q! u8 c. B' r
                /* For AB-synchronized transfers, BCNTRLD is not used. */
& F* m2 S( T3 c% @/ a5 {, J* k4 `! Y                paramSet.bCntReload = PING_PONG_BCNT;
  @  R5 G' c/ `; Q4 v+ \
$ W' g# f) u8 K) l                /* Src in constant mode Dest in INCR modes */
! _/ f. T+ Z& v9 }% |$ v0 `& [) |                paramSet.opt &= 0xFFFFFFFDu;
5 @' a- `8 F+ ]7 r                //paramSet.opt &= 0xFFFFFFFCu;
3 k; D7 q* Y% I# X( q5 n               
+ B. F7 |$ `1 [; d0 h9 w" I8 }                /* Program the TCC */7 m4 @. p3 [- E: Z* _
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 K' F7 i! v. M; K

9 {8 ~! L- [: E$ s% i$ d  g0 ~                /* Enable Intermediate & Final transfer completion interrupt */
1 c: Z( f% z" N/ V                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ P) k/ q. d- y) i
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% c/ [4 u0 p+ D0 Z9 N( u
& G, ]! i* b' _2 o& U; k6 |                /* AB Sync Transfer Mode */
% Q+ d9 F% I; n' ~                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% J5 F! ~4 T- Y               
; l% \, D5 W; r- l2 k' e( L                /* Program the source and dest addresses for master DMA channel */
3 s* u( Q! |- A! d, }/ B% j                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
' d! B" F4 r3 U% `                paramSet.destAddr   = (uint32_t)(ping_buffer);& N- c$ G' G. j6 O9 H9 o
) W& p4 H3 T! f0 Y! D. K( g
                /* Write to the master DMA channel first. */. q( c' ~8 K) ]/ l2 r: d
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
& h  S3 l" j7 [$ r" a    }      
" m* z. [/ K2 X" [: r
+ k7 l, N) W% h& u/ Z& H5 t- H8 C6 L        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
9 w0 D& n7 y: M3 k" `       
! R5 W) R; s$ E9 G. g' K0 i    if(result == EDMA3_DRV_SOK) 4 h& c5 D/ y- H  o$ w( \
    {! B7 T, V* j( Z8 n# X' h
            print2arm("edma3 driver init success.",0);! R; `% H7 u$ `3 P
    } % a; D8 c9 Z+ O1 I% s
}
$ |7 M; g+ t1 G/ N) p8 x  p
  K$ U" H* I- v  Z: o3 f5 D9 o/ B. S- Y: a' _3 A+ O6 e' ?8 x+ l
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- f% m4 M2 T, l6 v7 Y# g2 _# B9 b+ f3 W' k3 d% T
" K- s  `; Q- y. r- J- `

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:473 j5 o; Y& J0 \9 _
每次DMA传输完成后都要再次使能传输

3 g) U7 r  A& W, }/ Z- o原来是这样,我明天去试试,谢谢了!




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