嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:/ E5 h% d. r% j3 `  D
#define  PING_PONG_ACNT          1
9 o7 q$ U. A9 o3 r0 V  ]; J$ ^" K! j' O#define  PING_PONG_BCNT          8*32*40 ( X! x% T/ D  F0 z: q0 l) m
//#define  PING_PONG_BCNT       1
5 ^1 V% x! Z0 h! i9 c# M% W#define  PING_PONG_CCNT          1
+ Y% z. J- W1 g- H#define  MCASP_BASEADDR          0x01D00000- J# O# J; K( e9 H
#define  Mcasp_RXEVENTQUE        (0u)
5 N6 d* y3 ]% p  h/ L
4 S8 [, V; R, |) B' [/* OPT Field specific defines */5 T4 F* U3 `. u& }. o$ n
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
1 P5 n, M8 \# r- Y. E#define OPT_TCC_MASK                        (0x0003F000u)" }; y3 _1 I, ]/ U
#define OPT_TCC_SHIFT                       (0x0000000Cu)
0 P2 R6 i. H; `' M! C& c# K#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
2 ~0 y% K/ Y" {8 c, P6 t3 o#define OPT_TCINTEN_SHIFT                   (0x00000014u)
: u. K& v8 h0 P" e. s
6 c, e3 |+ e7 P2 X- F/ y- Jchar ping_buffer[PING_PONG_BCNT];
) p9 x" E/ ]0 Mchar pong_buffer[PING_PONG_BCNT];, m+ y9 z7 s$ ~! Z

( J7 U4 R- A4 w4 ?9 {0 `7 K5 c
! n) k  ]0 Z' D5 M5 Z2 T9 h8 f; u
2 {5 [. d' U6 L+ D6 x$ X/ _
! U% g' W& [8 F( T  [/ C, C9 Fstatic void ys_edma3_init()
2 o- w$ n; }# a8 V0 n4 [0 w& h{& a- |7 U5 P4 M. g; C. w) W
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 y! q  N3 p) {  c9 m- _        EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 e8 X8 N) ], u+ [- j0 ^6 K
        EDMA3_DRV_Handle hEdma;
6 o7 R. c+ A" a* x5 G    uint32_t chId   = 0;
  j% {* J" B) \) w9 J7 Z* g* D& u    uint32_t tcc    = 0;
# B9 L5 h) }5 a2 Z) y6 [( N( p7 _  e: `) n# s3 s3 s: Z, \. `) h
    print2arm("edma3 driver init...",0);) [4 w) D5 y3 {4 M) L  L
5 h3 s! |! Q$ r* V* x
        hEdma = edma3init(0,&result);7 R* @$ P" [! T) N7 p* M! f/ s  ?/ r
        if(hEdma)0 v! y( T" `# Q; @# I
        {
, p  k$ R$ J, L6 f% \" J; R                print2arm("edma3init() Passed.",0);
1 M+ r% N0 l( h4 S% Q# c7 ~9 D        }
: B6 Z- k# n* ^, s% b  w        else
8 q) y$ B* c* \# b8 T& B4 H        {
) h3 @3 _  {" _2 o( h( E# V2 r2 m$ f                print2arm("edma3init() Failed.",0);
; h7 S% [/ k- x+ }( u0 q! K: {        }
5 q) h/ m( ]& ?  m5 r       
4 i0 {6 I/ w$ W; `8 h2 l        if (result == EDMA3_DRV_SOK)
0 o! O5 {/ q) G    {
4 L8 J; J8 A# |9 {+ p0 q4 f                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' A9 G! x1 \  k+ e3 p( r                                                       (EDMA3_RM_EventQueue)0,
5 r5 e3 r# D9 u- S                                                            &edma3_isr, NULL);9 M+ V1 V, Q3 G; G  r, g0 h
    }, g1 _4 n4 c" I6 o) D/ }  G
        9 ~- b4 k6 ~1 [' \' F
        if(result == EDMA3_DRV_SOK)
1 J4 y0 Q3 }- y( h4 u' \4 d        {% C, a6 k( D: C# S7 r
                paramSet.srcBIdx    = 0;4 p1 s$ U' B) G0 _
                paramSet.destBIdx   = 1;+ M1 b6 m; y. z2 k6 n) ?
                paramSet.srcCIdx    = 0;
" ~. H: @" ^0 P: ]2 B+ d                paramSet.destCIdx   = 0;$ ?$ D0 j9 Z) s/ F! h
                paramSet.aCnt       = PING_PONG_ACNT;, G. G. D# O: r7 N; h4 Q8 A5 Z) W
                paramSet.bCnt       = PING_PONG_BCNT;0 ~- ?! e& K. r, }( c
                paramSet.cCnt       = PING_PONG_CCNT;8 K) \  N+ L) K) O. T2 {0 R
               
* i/ o7 ]: p  a" T! S. k                /* For AB-synchronized transfers, BCNTRLD is not used. */
4 z- I8 e, G) |% Y0 T                paramSet.bCntReload = PING_PONG_BCNT;% Y4 i9 ?4 N. R! i1 G
1 x! s9 m; T, O
                /* Src in constant mode Dest in INCR modes */
' P( W7 o& B2 r& D& Q' C- _                paramSet.opt &= 0xFFFFFFFDu;
# I# z8 ~6 D5 F& T                //paramSet.opt &= 0xFFFFFFFCu;
. l. e% z% ?6 L" o               
$ F; R* Z  I1 `                /* Program the TCC */
4 m9 v- \5 V: Y. w. j5 i& B0 N                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: K' R( `6 j$ o/ \' f3 x, N: I! {' g6 @  x( L3 Q; [9 f5 D
                /* Enable Intermediate & Final transfer completion interrupt */
0 ]+ u2 E' A$ s6 X! u                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ v& r) C) x9 n
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);* H' i, ~4 t1 s2 y6 L9 M
- m% m; }& h: Q; z) U
                /* AB Sync Transfer Mode */
; I2 X# m# ^2 Z                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- \; T% U  u% W, H" C; y. p                - [* |9 K+ k1 o- e$ Z
                /* Program the source and dest addresses for master DMA channel */7 t0 x7 \2 t$ t. {$ Q: q" l3 y
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
% q" p- M, e+ s6 Q; g8 l                paramSet.destAddr   = (uint32_t)(ping_buffer);
5 a1 o" r0 K8 B
9 m: I( @5 p6 I9 u# ^" V                /* Write to the master DMA channel first. */
8 S- {& ~0 R7 s! L% {. g* f                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! l" I, O. m) f    }      
+ ]6 M" h+ _" ^, b1 Q. i4 \' G2 K# [" n1 A. {- _, o; Y1 X0 _8 t, m8 H/ J) M
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, A0 y, }* [7 T" t/ t) M        ' V, p& Z1 @5 w( s2 ?5 N1 z4 j6 {' a
    if(result == EDMA3_DRV_SOK)
% L4 E0 i) c' G' S8 C1 K) |    {0 b! E; E: v2 i. F
            print2arm("edma3 driver init success.",0);! F& _1 J0 h( A) L
    } 3 F, x. k+ g' m2 p4 g; e5 Z
}# s4 u2 |* j3 b# n. \1 Q: I9 u, y
6 D& q6 R# j$ Z5 s

7 t& o7 O. |% P( AEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 |1 D- p1 }3 R' p) m0 A) ~

7 A8 q6 ^, I( B$ V, o2 |
" S. k" T6 O) A8 k
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:474 a5 q9 e* u6 t' o, x
每次DMA传输完成后都要再次使能传输
& P/ o1 Q) f1 `' d
原来是这样,我明天去试试,谢谢了!




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