嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 Q, z4 U; u8 A#define  PING_PONG_ACNT          1
) E, i' V! \4 t8 b#define  PING_PONG_BCNT          8*32*40 $ G2 H' e5 L( Q- h5 N! q" T
//#define  PING_PONG_BCNT       1 ! b+ t& _3 y) ]2 m
#define  PING_PONG_CCNT          1
. R7 d: S1 Y( O: ]#define  MCASP_BASEADDR          0x01D00000% p: L5 b2 l$ O+ N7 V7 T
#define  Mcasp_RXEVENTQUE        (0u)
+ d0 R8 K) j- @, B7 g
: [" R( ]9 Y0 n. Q7 {2 [/* OPT Field specific defines */7 Z! b3 w: ?) F1 @& k
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)  ^4 C# Q0 L  s2 \. Z) o' N/ b3 [
#define OPT_TCC_MASK                        (0x0003F000u)$ X2 N2 Y; Z3 e9 o$ ~/ a4 L
#define OPT_TCC_SHIFT                       (0x0000000Cu)
7 s, l: e) ^. T3 d, R5 m#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
& U/ h& ?! S  u4 b  D; [#define OPT_TCINTEN_SHIFT                   (0x00000014u)
4 z: Q; t$ T# |% F( z3 B8 {& \1 U* }, k; D% M# I, ~4 A
char ping_buffer[PING_PONG_BCNT];  S6 M% y3 t8 ]7 p) h
char pong_buffer[PING_PONG_BCNT];% }* ]) k- D- Z) ~7 p' a$ A
/ Z9 `  }; L0 @# V* `$ e3 p

- V5 f- M" q& h" N1 Z# c. \
; a% C  X4 ~( j8 Q; s
0 i7 e$ r/ j+ M" ~static void ys_edma3_init()
% s" D. x/ k9 o2 b  o{+ x5 [: f9 J* X* ~
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 U0 c! n( k' S* {
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;8 \9 z6 g4 z+ u7 n! _
        EDMA3_DRV_Handle hEdma;4 i8 x2 S$ r3 V6 }* S, {# t
    uint32_t chId   = 0;- p3 J! y$ U7 f. x
    uint32_t tcc    = 0;
. d8 o" F2 K+ h& {( z, m  b0 U7 F( K  T+ D; G! E
    print2arm("edma3 driver init...",0);; u/ s$ ]% J, p7 e2 S3 G

2 m2 V: Z/ e, f% g) P        hEdma = edma3init(0,&result);( E2 p. w" d( v% `& A. i+ i2 {
        if(hEdma)% ]- l' ^* T7 j
        {
' O, v1 S6 N5 i" ?                print2arm("edma3init() Passed.",0);: h/ `# R7 Z  ~: [# r0 F
        }
5 q. l2 K( x+ L) N* B1 R        else
+ L  x9 [. }0 x        {8 ~8 ^1 l3 ^' S2 C: t2 ~+ d
                print2arm("edma3init() Failed.",0);3 F- m2 W9 E1 ^% G
        }7 q/ W7 X% B: I" B
       
  _1 v# [! n4 l+ R        if (result == EDMA3_DRV_SOK)
* B) Q" K6 }& @* x2 x    {
* \- v% _  |7 W6 A& ^+ {                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 P2 e' J  E% D* V/ k0 ?
                                                       (EDMA3_RM_EventQueue)0,
! p' N, b5 M& p+ u+ @; \2 B" A) L                                                            &edma3_isr, NULL);* ?) t3 ]- H& G& a" X
    }
1 a1 i8 i0 {/ z& m& r        * p3 P/ s$ S/ W0 L* m! y
        if(result == EDMA3_DRV_SOK)
: t' k' ]4 E/ o9 [1 }* L0 P        {2 |7 b  P5 I  P8 h5 q8 R3 {! I
                paramSet.srcBIdx    = 0;
! M1 o3 s: e* c$ l                paramSet.destBIdx   = 1;  f1 W3 X7 [5 r( P0 I0 w3 x
                paramSet.srcCIdx    = 0;/ }! W, A- q4 Y3 G  Z9 Y6 M
                paramSet.destCIdx   = 0;
/ B0 O( @0 b3 H+ c9 {                paramSet.aCnt       = PING_PONG_ACNT;+ ]8 `, s: V+ m
                paramSet.bCnt       = PING_PONG_BCNT;& Q$ W% U2 e6 w+ e" G
                paramSet.cCnt       = PING_PONG_CCNT;
& D5 {7 p( g% J' m6 m               
, ~% |+ S1 ]+ ~2 n                /* For AB-synchronized transfers, BCNTRLD is not used. */: b- G% t& A# B) D) ~' p, b
                paramSet.bCntReload = PING_PONG_BCNT;
' ^- a/ u/ s9 o, w0 z+ f( J1 ]- h1 i4 @, O# J
                /* Src in constant mode Dest in INCR modes */
3 c( W, J9 R/ p3 H% I) {                paramSet.opt &= 0xFFFFFFFDu;
. V( q* n0 U1 F( U                //paramSet.opt &= 0xFFFFFFFCu;
2 ~) Y2 I' C0 r( _+ A               
: Z! w0 {- @: ^# _# _' S5 G                /* Program the TCC */+ b, j/ w3 j3 J$ ]- s0 }
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ O, z" S7 J- M+ \  ?1 `

9 o- |, n7 Z- n" T$ |+ O                /* Enable Intermediate & Final transfer completion interrupt */
8 @1 c9 W" I: v) M6 h; Z" X8 c                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);2 T8 \! v# Z) F+ ]2 z9 n7 M2 `; V
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 a7 M" [; e/ C. U, M# Y! v/ U* U) M- S: x
                /* AB Sync Transfer Mode */5 [# d8 b! i9 W6 z2 U2 ?
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 c) G. ~- O6 w( l                / m0 J" {* L( i: o
                /* Program the source and dest addresses for master DMA channel */
0 l9 Z$ h( H, E$ s, V5 F4 R                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);, A2 k" r  A: y
                paramSet.destAddr   = (uint32_t)(ping_buffer);
; E$ q9 T. s4 F7 i& h2 G
1 E' t& E+ c9 ~. K7 E                /* Write to the master DMA channel first. */" b. q. l, ]% j+ e( ?) D) ]
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
% w/ |$ o; q2 v3 H4 E. h( M  U    }       5 }' r. u6 E5 ], o7 Z

: i: N; D  C$ a9 `$ \. t0 H' u        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);6 O- n, {: @% t" d; Q* c- z0 r
        2 Y$ }0 X) X+ B9 U+ w
    if(result == EDMA3_DRV_SOK) 5 N; j, o' d" l, k8 f7 x$ F
    {
# M5 l$ e2 j% S' e            print2arm("edma3 driver init success.",0);4 {8 D/ H8 E, M. d0 `9 X& \. d: S
    } 6 s8 g* s! p+ J  l+ L8 j, |
}
5 y  F$ R4 v1 D  W* M# {2 C; E# s
; s+ w, ]. Y/ D
( m- k$ m7 E4 cEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 y. R4 c1 A) _5 m: J9 m% \  c) E0 w& Y- K

' D/ |  P2 s. Z7 O9 D9 F# x
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, }3 R3 e2 S1 D1 ^# U& s0 t
每次DMA传输完成后都要再次使能传输
, J; r9 W6 f7 g, G8 f" Q
原来是这样,我明天去试试,谢谢了!




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