嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 |* U+ }4 G% Y
#define  PING_PONG_ACNT          1
! n. i* U& |7 K9 Q4 @- h#define  PING_PONG_BCNT          8*32*40
5 w. h/ {2 F. X+ q* K3 v' u' J//#define  PING_PONG_BCNT       1 0 O" W: o% J! t4 Z/ X! ]
#define  PING_PONG_CCNT          11 D; z) c( h# A
#define  MCASP_BASEADDR          0x01D00000) U: k, ?% Y) N. _! _" s) i6 [
#define  Mcasp_RXEVENTQUE        (0u)4 w2 C, M! C9 }& q6 \- s
" q6 Q  Z3 d, g. C2 `! k
/* OPT Field specific defines */
1 l5 B  D  b7 Y6 [/ p  R; |#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
) d4 g$ [$ S8 w# F#define OPT_TCC_MASK                        (0x0003F000u)
' B) X" `; V. t. a# J#define OPT_TCC_SHIFT                       (0x0000000Cu)* s( D9 J, ~' k' B5 \+ h* b4 w+ H
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
. Q* k6 s8 H, H2 {7 `  q* i5 x#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 t" `6 J% p5 Q: o$ l5 C9 {' ^- G; o* T$ i; o
char ping_buffer[PING_PONG_BCNT];9 }* [7 l& @7 s3 k" c
char pong_buffer[PING_PONG_BCNT];- {" f) V2 [; d" T
8 e1 f( S7 h) K1 k2 m8 g; ]' H% I

2 L* H. j$ X6 W5 o
: i! s5 I/ z5 R, U% {9 T& [- d9 L+ h2 o) Z6 U: A" k# \
static void ys_edma3_init()
+ V5 i3 H* m! R2 _8 Z{
' [7 Y/ m+ R' I; S8 [# G1 c% ?: t        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};  |& u( ^: t& @* [6 ?4 E
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
  w8 N" `8 a5 B" T/ ?$ r6 K        EDMA3_DRV_Handle hEdma;8 C% v. ]- a8 S6 Q' g  H
    uint32_t chId   = 0;
( O$ r5 `$ o# ]& Z    uint32_t tcc    = 0;' G5 N7 }2 v  {" _: `3 U5 V

! R. K2 u6 }, J' u7 d- I    print2arm("edma3 driver init...",0);
* p( A" R& P4 S* w, ^5 b7 x% y: ^: f, \0 S2 x
        hEdma = edma3init(0,&result);
# \$ A' c! S, [7 ^5 A5 v# g  |, H        if(hEdma)
# q" A! ~5 p! h  _6 f  F        {( l. ?1 K- B: H2 s
                print2arm("edma3init() Passed.",0);
3 C& O7 N' u3 T& c        }* \" E0 ^% x, F, `7 j) o0 s8 j
        else
* M7 [5 M4 x8 X9 |5 {8 e        {1 m* K* V- H: P/ S) i4 a1 w
                print2arm("edma3init() Failed.",0);
7 t) w- |7 Q) H, i) ?        }5 Y! h8 U9 I" M- @
       
! u- C  i) \) }7 y" a2 o        if (result == EDMA3_DRV_SOK)
! Z% L$ ^1 h& Q3 o. e( d$ [; o% I- v    {  F  n( J" k: M. B
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; a: t- R6 B( {; q; P. q                                                       (EDMA3_RM_EventQueue)0,
5 x2 U: P( c6 s3 r                                                            &edma3_isr, NULL);" {  A0 t+ u( }
    }
6 F- v' S8 d$ F" D; B, e) l       
& p% ^4 l# n3 l+ ~( p        if(result == EDMA3_DRV_SOK)& q. [% R$ C: w) j, P3 m
        {
7 D) C/ c0 k' k9 S                paramSet.srcBIdx    = 0;
* M2 }) C% t4 m( d. e2 P                paramSet.destBIdx   = 1;
5 e3 Z3 u# Q) t9 F: L3 i6 Y                paramSet.srcCIdx    = 0;3 V7 y; D  e3 e
                paramSet.destCIdx   = 0;
; z- W. c; `+ ?/ k2 I/ U                paramSet.aCnt       = PING_PONG_ACNT;
& M$ m2 v. a1 Z) \) |5 H; \3 |+ o                paramSet.bCnt       = PING_PONG_BCNT;
% I% d* |+ I8 U. V" ~( |9 [0 [                paramSet.cCnt       = PING_PONG_CCNT;
7 q; ?+ b0 M. c# p3 F                5 V1 U, ]. F& v! ]0 l* D8 f
                /* For AB-synchronized transfers, BCNTRLD is not used. */
/ l* a# }4 ^3 ], O8 ~$ Z                paramSet.bCntReload = PING_PONG_BCNT;( t8 y7 U( `) ^8 e$ o" X/ P
4 U3 a9 z$ Z: a7 Q& b4 O( o
                /* Src in constant mode Dest in INCR modes */
$ _1 B0 P* ~! S: R6 e" R* `. M                paramSet.opt &= 0xFFFFFFFDu;1 x& {0 K! S& T) p8 |
                //paramSet.opt &= 0xFFFFFFFCu;
* ^" f$ Q' C+ P/ p) c% S4 L0 ^                1 g" M5 ]! B' C! m) M. u
                /* Program the TCC */
) f& m3 O6 I) a$ c- g; _2 w                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);+ }: F4 h6 R3 r5 }. G" C  [" {
5 a% _3 t6 A, D; e! Y
                /* Enable Intermediate & Final transfer completion interrupt */
" {, d6 u% k# C! z( P                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! m$ e$ s$ q. r/ ^' Q2 Y& }                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) I) S6 V  C7 v2 ]$ h! O' {, X

2 n4 L" v" b0 W, m                /* AB Sync Transfer Mode */8 \  o: n7 _! J! o2 }
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  m' S& I2 I- N- W# b0 `0 l$ e               
6 [% f! f4 m% P5 I" [7 t                /* Program the source and dest addresses for master DMA channel */
! d1 K5 a! j  C                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
: C$ Z9 D8 H1 I                paramSet.destAddr   = (uint32_t)(ping_buffer);4 p' o* B2 d; w5 y
0 R( s+ }+ r) f0 f3 w
                /* Write to the master DMA channel first. */. f0 S( J* I3 W/ A
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);$ n7 V& V' W) W; y" D1 `
    }       : h1 x, V( n$ d( B2 B
9 {: m5 ~3 n/ w: r
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);8 l! U0 ^9 _5 N0 J
       
. w" a! u( ]9 ?) u- r) @    if(result == EDMA3_DRV_SOK)
, w5 K( x% ]0 Q- D    {
& b" S  S/ I! O( _, Y: x            print2arm("edma3 driver init success.",0);
7 o( B4 U3 h' s" ^) }) @    } 1 Y! w6 }4 q9 B
}
( V& d7 c& I1 I" R; ]! s& D9 M8 f
: H. L4 j( Q2 l8 s- }/ f) F1 F
4 h1 k. p: F; x. WEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
. m' w. ?8 g$ x% c' D' p1 Y9 k
6 |' e: Y% M( w; P3 X' j4 G. K
3 X' x+ t, G) |  s7 u
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47' V& x7 Z7 {4 K& D! i
每次DMA传输完成后都要再次使能传输
! E: E! y; b* K- R
原来是这样,我明天去试试,谢谢了!




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