嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 w6 Y2 b; Y% q! i' ~; A" E, v#define  PING_PONG_ACNT          1/ }1 t; i! E. H) f8 [+ ^
#define  PING_PONG_BCNT          8*32*40
5 ~, s/ L+ Z  g" T//#define  PING_PONG_BCNT       1
0 u) ]! _4 ?: Y5 X) Y. t4 g5 ?#define  PING_PONG_CCNT          1' R1 i# H9 i) Y+ t4 A
#define  MCASP_BASEADDR          0x01D00000, J0 t7 m7 k6 L' B
#define  Mcasp_RXEVENTQUE        (0u)
' Z" V, z% S4 A9 k1 B
# Z0 \, k; a. J3 i' a* `7 L3 F0 f/* OPT Field specific defines */2 K' V. M6 h/ P  _$ U1 m* c
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)5 Y6 G% |# X8 n' m# X) f# D+ b
#define OPT_TCC_MASK                        (0x0003F000u)
. Y2 c0 h: s6 ?: V3 W#define OPT_TCC_SHIFT                       (0x0000000Cu)
' V* B; m1 C* G; a#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
2 I0 g6 T! k3 T: g! C#define OPT_TCINTEN_SHIFT                   (0x00000014u)
& P  ~1 [7 x$ w0 b% k! }8 `- A" q/ g* j( q# h
char ping_buffer[PING_PONG_BCNT];" J' m. o" {6 K* b* y  k7 A
char pong_buffer[PING_PONG_BCNT];! R, E% l1 T1 ^
  Z$ D+ \& s2 K8 q* W

" Y* W; q; l1 E
4 T& ~, M  f4 n2 _/ L2 F  j
6 z1 {% X8 h& Q) A  nstatic void ys_edma3_init()
; J' T3 `+ r! G7 f5 J+ y' \0 g{
; R, Z3 m$ A: D$ H        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};4 m4 X) J  @2 N/ S
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 \+ e  J6 g1 C0 C  ?5 V" K9 e2 q
        EDMA3_DRV_Handle hEdma;- e( m' G0 C! m" l5 g, W3 S; y
    uint32_t chId   = 0;
( X+ _; N, K' B  c    uint32_t tcc    = 0;
; {  G; T; T4 l) u# ?* y
+ y' F* q, C5 x4 Q2 E% h    print2arm("edma3 driver init...",0);
+ R! |( O  y* ?7 A- F
+ A- Q7 ?9 M4 f        hEdma = edma3init(0,&result);
, l0 l9 W* i5 S+ g: Y% `        if(hEdma)) p! _9 c$ i3 [5 `' u- z; f. J; n
        {3 V- n+ R9 R. `% u8 L
                print2arm("edma3init() Passed.",0);9 i" I; a2 f6 l9 [! P4 s/ z7 x. D
        }
1 E" E! D4 h# B$ B+ N        else
" l* t) I  l, z# X9 ~* b. v1 Z1 f        {: t, |3 C  O) [; M
                print2arm("edma3init() Failed.",0);  ^7 P' P8 ~" x% a$ t7 J
        }
, V# |/ }2 \; [  r* ?1 \) {( ?        , c& r0 T" J+ K
        if (result == EDMA3_DRV_SOK), ~. z9 x& d, k9 A9 B; f' {# w
    {) y, b4 X! l0 a; A, l( ?
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,$ K; o" U- V' c
                                                       (EDMA3_RM_EventQueue)0,! W4 |) s5 t3 q7 L$ I) F5 o
                                                            &edma3_isr, NULL);
' u% ^2 q% c1 b9 C    }' `5 v$ T. S% f
        ( G6 [. y3 G/ I) K& \
        if(result == EDMA3_DRV_SOK)4 A9 c. Z4 C) N4 q3 t+ L/ @3 l
        {( A# t% F, U9 }9 v! |+ j
                paramSet.srcBIdx    = 0;6 d$ N/ h! f. R8 _& C1 g
                paramSet.destBIdx   = 1;( I% p( w$ d0 \' B) |
                paramSet.srcCIdx    = 0;
! N1 B+ z# Q5 @( o5 k5 n: c                paramSet.destCIdx   = 0;
$ V; F# j, n! A: l                paramSet.aCnt       = PING_PONG_ACNT;
7 W% h- Y# K% Z7 i% ^' x; h! B                paramSet.bCnt       = PING_PONG_BCNT;
' q  K; \( M1 c& O) c                paramSet.cCnt       = PING_PONG_CCNT;' N  X+ `$ `0 k
               
7 P* E* }# M- ?; w' U- r                /* For AB-synchronized transfers, BCNTRLD is not used. */
* V5 g$ c; u! {( d( a% ^( ^                paramSet.bCntReload = PING_PONG_BCNT;) d+ R4 i5 B1 f6 g1 ~" B

4 ?: m; I  O* e/ h" t                /* Src in constant mode Dest in INCR modes */% c( J, J/ R$ w3 F: m& j
                paramSet.opt &= 0xFFFFFFFDu;
! c( c! V  g  K6 u8 y7 E                //paramSet.opt &= 0xFFFFFFFCu;! `$ L! @# }5 G! [. Y4 e( f( h
               
! E# X" d6 \: ?7 p5 X( c                /* Program the TCC */6 [/ n3 J+ j, E& `8 W
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);8 x! Z3 @* Z$ l
5 Q' v" D" C" Q. h) o* o
                /* Enable Intermediate & Final transfer completion interrupt */, T( [( T- I! N; i3 r9 W$ y4 u/ Z% u4 V
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);  j; P  c) c+ j; r) ?
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) {( x$ v3 H2 `- X+ p

( N  x* P0 M" m- o: r" M                /* AB Sync Transfer Mode */
8 p7 A. H3 ?+ V                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# ]* ^6 |7 z+ M3 ~# R# k: |! J
                7 Y+ K. u5 g% m( U% Q( m
                /* Program the source and dest addresses for master DMA channel */
% S! G9 b1 \4 p+ n1 N7 \                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
7 F  G9 M( v+ [0 @2 H; {7 x7 o/ M                paramSet.destAddr   = (uint32_t)(ping_buffer);  I/ T  E* b' y3 P

" E! L6 b- s! s! Y3 m                /* Write to the master DMA channel first. */
- ~, m8 r) s- M+ c" L6 I+ x                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' a) e+ G6 K/ h# I    }       " L2 C1 N3 e, P0 F8 m& G  [/ ?
7 R0 ~; C( T1 `, E: p
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% J8 D" ?6 a) H0 w, Z
       
# g% q7 [% C! h    if(result == EDMA3_DRV_SOK)
6 b+ t+ r$ n  G% u+ \    {& R4 `) ?2 t8 p5 [# {
            print2arm("edma3 driver init success.",0);
. G0 Y" M, p: y! Q9 |    } ( ^. x1 b, T6 I4 I8 H/ V
}
. K$ S. ?' \; G& g7 M" a
. r: g- D5 v& f1 r6 E3 E
, ~" R& e; x8 I7 c9 n. PEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 ^+ M( X8 L/ ], f- ~( q
5 g! f. a# }& v! Q# Z$ a+ c& F: ]6 a- B, j$ S! t0 j, A

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47' @5 c9 t, H/ s+ n" b' b2 w" y
每次DMA传输完成后都要再次使能传输
0 z7 M1 w% m$ I" C4 ?- [6 J" q7 `
原来是这样,我明天去试试,谢谢了!




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