嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 c% M  e5 c8 q#define  PING_PONG_ACNT          1. S7 k' N% k3 L2 l' B5 B4 c
#define  PING_PONG_BCNT          8*32*40 + j; p, S3 z  [# z5 b4 f
//#define  PING_PONG_BCNT       1
3 q1 f' _6 D) N8 z#define  PING_PONG_CCNT          1
/ I; D* y4 v' }- ]0 G4 F9 _#define  MCASP_BASEADDR          0x01D00000
4 P# Q/ x$ _; z# A) H#define  Mcasp_RXEVENTQUE        (0u)& [9 r/ D3 A. N/ U% o
" h" [! @6 ?# L2 V  Y
/* OPT Field specific defines */- J! i* Z" a, I2 P1 U# X# [
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)0 U8 X! W. P- ?# ^; L' B4 D5 Z: t
#define OPT_TCC_MASK                        (0x0003F000u)
2 N5 H  ~/ Y! [#define OPT_TCC_SHIFT                       (0x0000000Cu)0 v( C9 ]( [) P! t; S. F% T
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)" _4 |8 h! ?& i! h+ e- m4 D
#define OPT_TCINTEN_SHIFT                   (0x00000014u)5 X/ Q1 M& m2 m; h

; I5 A# k* x# r0 P$ u% ~char ping_buffer[PING_PONG_BCNT];. m4 n+ _. p1 q& R7 D/ x" a4 w  y
char pong_buffer[PING_PONG_BCNT];
6 U0 ?! R# v8 k- E3 B, T+ d. {1 T2 A5 B5 c5 x3 Y& [
( o0 V1 _1 w5 f; X+ S3 r- V* B* x

7 d& t' v, _6 T0 r: j, ]; x) f/ R7 h( i( i& C+ a
static void ys_edma3_init()
7 m3 S6 q) }( a, y{
0 U) z9 I6 w& J9 A" p$ _7 I! _        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& G6 |0 A( V2 @/ S        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
( \3 l+ x* Q% L1 r8 N3 G3 Y- K7 |        EDMA3_DRV_Handle hEdma;
1 d7 c# V2 |' J( X6 p* f2 D    uint32_t chId   = 0;. q! z7 P: \& }9 ]/ q) J7 }3 G
    uint32_t tcc    = 0;, d9 A/ m# R& k! N1 f" V" K& C
; q/ Y0 O: X6 M5 N* S: S2 r
    print2arm("edma3 driver init...",0);- H+ G% \1 Y$ p! V: }

! F& O! q# Z: o' d- |        hEdma = edma3init(0,&result);- \9 n$ M- W+ y. C0 P
        if(hEdma)
# E' D. M, }2 h" f! n        {
# i. ~+ N; w: B( I- u: V0 A                print2arm("edma3init() Passed.",0);
: e) [1 [3 h! C& p! P- Z0 Q        }
: c+ c! Q; S0 _: M        else
, H- u, T0 @+ P! @; u# h3 W' A1 u        {3 L& }0 B9 f7 f8 n
                print2arm("edma3init() Failed.",0);
9 X8 f9 y8 U1 j! ?; w! R5 u$ X5 R- K* n        }* {! i: n  f5 p; V' X* e3 {; z
       
- H' h- i% n" W' S5 A( u9 }        if (result == EDMA3_DRV_SOK)- O5 b5 \3 ~; j, R3 W. i# m( H( |
    {
9 x5 T. y* N9 f, x, E5 T3 L                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
% g9 \+ ?. |% z8 }6 T+ B9 E                                                       (EDMA3_RM_EventQueue)0,
- J' J7 ?6 e1 O+ t, x7 p                                                            &edma3_isr, NULL);
& w. s9 Q2 f5 i; a: K# ]8 S    }& i4 A* l9 Z( q8 u# J
       
# I( s- V, w, B0 G" g* `1 Q        if(result == EDMA3_DRV_SOK)' `4 _9 [& M8 N, Y
        {
* V) C/ \0 C4 n+ k                paramSet.srcBIdx    = 0;
% u9 Y5 G) B: a* m                paramSet.destBIdx   = 1;
8 @0 T# z0 X' F- b; n                paramSet.srcCIdx    = 0;
! v5 M' c( g6 S0 G3 W                paramSet.destCIdx   = 0;
( A5 j% r; l4 k) N; F                paramSet.aCnt       = PING_PONG_ACNT;
: L  \# p1 k3 B3 w' [                paramSet.bCnt       = PING_PONG_BCNT;" Y; a5 J# e' O" Z9 E. |
                paramSet.cCnt       = PING_PONG_CCNT;
- }% A; O1 W8 c# r                % A- B* S  U6 F, Y& m% t- u* _  }3 X
                /* For AB-synchronized transfers, BCNTRLD is not used. */
. C+ ~5 ~1 V+ ?                paramSet.bCntReload = PING_PONG_BCNT;9 x; J  @3 {. P9 ]5 T
  h( Q1 w, q( `" g% v0 v
                /* Src in constant mode Dest in INCR modes */
: o! l4 K, M0 e& d0 L                paramSet.opt &= 0xFFFFFFFDu;4 N2 t+ H( ^7 [& K( G  r
                //paramSet.opt &= 0xFFFFFFFCu;7 Z0 i3 a" U( X: U7 D3 z
                * f7 L( e7 `$ s$ k- N- Y
                /* Program the TCC */( D+ c$ \  X# X- i
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ O/ L" {- ]8 \6 H& z% Z3 g$ m
. j+ _" P& ^; g" H' c" J# R
                /* Enable Intermediate & Final transfer completion interrupt */0 ^3 l3 `- |9 i% G# j1 M2 D
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; y( V% O* C+ f$ F! e8 N( M                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);$ }: k9 N3 S& b
7 E: {6 H" Q; u* O5 i/ N; V) \
                /* AB Sync Transfer Mode */
$ J* V9 j# J. M2 X" e0 o8 m                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
: i% Z" F1 x: |( a9 q% c1 R) F               
( _& P6 R( U) Q                /* Program the source and dest addresses for master DMA channel */
7 q" q( ~' v' v, S, S' A  ~                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
7 F% B# I# p  a# \5 f                paramSet.destAddr   = (uint32_t)(ping_buffer);) T( G% h# I$ k' l8 A9 s, F& w) b
( q8 ], A  h. F$ y* L: ^( w. A
                /* Write to the master DMA channel first. */
! U8 r2 k+ d% M( q                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);7 u7 l! x. T0 L8 B6 r- b. F: E( U# i$ }
    }       * h6 ^  O5 ?8 p- f

2 ~1 ^. P1 D7 f" i) z# o6 @8 O) H        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 A$ i+ D0 B& g! q" e
       
. a' Z+ N+ m- B, z" L; m    if(result == EDMA3_DRV_SOK)
8 V, r  ^7 \) U6 E6 q    {* Q3 A. X7 d$ {. p- H1 h$ D! q9 s9 a
            print2arm("edma3 driver init success.",0);- U* I( [! R0 n/ t: d" q3 x% S
    }
- G0 R# C  V; N" B* G* L# z1 J}, W# Q3 ~8 w) c" p, i
, Y* d* O8 Q/ b( y5 \

0 ^3 t1 U) s  ~+ BEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 L9 t: a8 g+ w* L% o0 e9 P- w0 L4 R
" M5 ^+ P, l0 M& U$ j( n; C- W9 T; _3 e! A# u8 G

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
/ z5 w8 x- O; U7 V每次DMA传输完成后都要再次使能传输

$ l$ M. |+ z4 k% C- q4 R原来是这样,我明天去试试,谢谢了!




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