嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
3 s" ^: |- |% C$ m6 K#define  PING_PONG_ACNT          10 G% z- C& ~% Z8 a0 l$ s
#define  PING_PONG_BCNT          8*32*40 3 e8 {2 m& ?8 u! ~. A. p
//#define  PING_PONG_BCNT       1 - ?, d5 s9 a" d2 a$ A% t/ B. A: g
#define  PING_PONG_CCNT          1
' ?% F4 I( K: S9 S, m( `  t" }#define  MCASP_BASEADDR          0x01D00000/ V+ Z) w3 N4 k7 T, E1 l
#define  Mcasp_RXEVENTQUE        (0u)
- n, R. T8 a6 ~7 O8 m6 O
1 r, p4 }1 D6 o" Y5 G/* OPT Field specific defines */: c5 H0 i7 ^! I6 O
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
6 O2 u9 P& J1 \+ k0 q7 t: N#define OPT_TCC_MASK                        (0x0003F000u)
8 i, ?  C' K) Z9 p#define OPT_TCC_SHIFT                       (0x0000000Cu)
* D5 L; N; \8 q. @$ g9 }& \! Y#define OPT_ITCINTEN_SHIFT                  (0x00000015u)# y# m6 \5 v# D9 b. ?3 X
#define OPT_TCINTEN_SHIFT                   (0x00000014u); d8 M% f" N$ f+ m3 H, j% _4 `

# N; s' q2 w" x- Q. V; i0 |# i7 @char ping_buffer[PING_PONG_BCNT];: t2 A) p& |9 q
char pong_buffer[PING_PONG_BCNT];; K) k1 F8 E( V# O
+ Q7 F0 `( a# F+ q" k, ?

8 r& _" ^. t# b, K# ^. v) e
( e6 H% G' A3 q% p/ x1 b( B5 X$ Z2 Z" A/ [, l
static void ys_edma3_init()
% |8 t4 U$ Q+ g) c. H{
8 n7 R3 @# V8 |" J. y        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};# {7 S6 L  i9 n9 a' i& `
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# F- L2 i% `" @4 N4 ~        EDMA3_DRV_Handle hEdma;5 m2 |* t; w0 D5 k! M
    uint32_t chId   = 0;
! B4 u! |0 O9 p, C2 r' z" q    uint32_t tcc    = 0;
& j  b; U, R8 _! T4 K! Q; Z5 C& m9 b; c& A
    print2arm("edma3 driver init...",0);
4 g% }3 p9 |. f9 k2 e. K# o+ }- K4 h% N: P
        hEdma = edma3init(0,&result);
; A) a* ^7 I* l' z$ |        if(hEdma)% K- I$ R- _8 L; q5 H, G' p
        {
1 c4 n  A) _: D$ v/ W; z- V                print2arm("edma3init() Passed.",0);/ ^# v$ R5 X( b; A  I
        }: Z1 F0 F  W: ^  `' |3 ^( P  @1 [
        else
+ a. V6 [- m8 W5 c% {        {- e2 ~. i! }- a& O
                print2arm("edma3init() Failed.",0);1 _& v9 V$ J* j/ V8 M
        }( t+ B' u4 S  x+ Q
        3 f) g( ?" R; w: K- W" P
        if (result == EDMA3_DRV_SOK)9 w- ?$ o1 Q, Y  X5 D  K2 A
    {
! @. b1 g( ]' j1 g  G; t  u( U                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,8 d# Q% G  H, y1 N3 l
                                                       (EDMA3_RM_EventQueue)0,: a2 D1 r- n$ j( q! w$ r
                                                            &edma3_isr, NULL);
6 i2 T( c- g, [7 g+ A! \# ?9 [8 O    }
/ ^6 V# T8 B1 a1 C, ~        1 k, c* l! G, V/ P
        if(result == EDMA3_DRV_SOK)' V& |1 E" T$ \$ Z
        {( t/ t9 U. z% T& Y- Q
                paramSet.srcBIdx    = 0;
( u& e# N% p) h                paramSet.destBIdx   = 1;
8 x2 k& e5 j9 b& i                paramSet.srcCIdx    = 0;
+ y) l$ M; e& f7 Y% o) c                paramSet.destCIdx   = 0;
0 W, r5 q- l5 r; G! L                paramSet.aCnt       = PING_PONG_ACNT;
1 b( D2 l! c1 X/ _                paramSet.bCnt       = PING_PONG_BCNT;, j5 X7 R7 O7 d) {' [' Q
                paramSet.cCnt       = PING_PONG_CCNT;
/ N) @. f1 d3 s7 S) u& k  b' N               
! G9 u& ^! C! x  u7 ~# G                /* For AB-synchronized transfers, BCNTRLD is not used. *// v% b2 t" N6 G2 _' b) m% S
                paramSet.bCntReload = PING_PONG_BCNT;
1 q, S# y8 q. H& G* j" D9 W3 o+ R$ p" D# H  P* L
                /* Src in constant mode Dest in INCR modes */
1 \0 B. a. O7 @! x& J! K                paramSet.opt &= 0xFFFFFFFDu;
: i$ f$ x: F8 V) t* z/ o) }                //paramSet.opt &= 0xFFFFFFFCu;
" p0 g- G7 h+ v                4 V7 X! H4 c5 r" M! N3 H' u' m
                /* Program the TCC */
4 D) C6 @9 _/ `4 [3 I1 V" i                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 U7 z( C6 K0 X( m5 X+ T/ {# S/ S9 d" A* q- J' f
                /* Enable Intermediate & Final transfer completion interrupt */
" D, {# v5 T% b8 P. }" F                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);  b; C1 q( ^7 T) K3 h) L
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);* x! W8 s$ B+ v* J
6 b. i& z2 v7 h
                /* AB Sync Transfer Mode */
! r  f2 `) a, i4 j                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 {+ S/ {) b4 _) G                3 U5 [# F- C2 t
                /* Program the source and dest addresses for master DMA channel */3 d2 d; ]7 N$ p7 j" E2 _4 E. d+ C* b
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);' A+ k9 l* y* p
                paramSet.destAddr   = (uint32_t)(ping_buffer);* i6 {9 f" j* l. ^
- T) ~& y/ {6 P" O. o! o" c9 n
                /* Write to the master DMA channel first. */# P' E" B5 q* O, B6 H$ Y
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
4 m# H( v5 g$ {; f" P    }       + T# |5 I$ m5 K' h4 u- a

2 \; m, S: {+ t* H' R$ r        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 J  [: z' N# w8 y. h  m8 q3 g% y9 [       
" [. n) D* L% r/ Q! U! [    if(result == EDMA3_DRV_SOK)
) w& @& A7 y0 [9 e7 K! O* g    {% H' ^1 t$ O- ~- H( G# }. N& F
            print2arm("edma3 driver init success.",0);
! N0 ?6 T  I5 z% G0 w1 w    } 7 W* C( B. R/ r
}# K) z  ]2 ]( Q! F. m' D5 ]9 t

- v) D& O# d6 m( h- ^- k
4 h# H" q& k& L, `& @EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. _9 y$ ]8 G9 z6 W, l2 @' Q& W( s8 g1 B& G0 T6 k# J
) h$ N  z" D9 }! e& e& b

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47& J5 U8 e+ @8 _# R' X# X8 U2 n7 O# h
每次DMA传输完成后都要再次使能传输

( x8 Y) Y3 E- @3 M4 o原来是这样,我明天去试试,谢谢了!




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