嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
6 `. Z- `1 {" i, G0 _#define  PING_PONG_ACNT          1; u% i5 @' t0 a2 L
#define  PING_PONG_BCNT          8*32*40 5 {* f; j% q" z' x
//#define  PING_PONG_BCNT       1
$ ~5 D7 d+ O" s* [8 E4 p! c#define  PING_PONG_CCNT          1! D. i: f5 q' U: ~- U0 b) F
#define  MCASP_BASEADDR          0x01D00000
4 K! `. ?& L! }7 ^#define  Mcasp_RXEVENTQUE        (0u)
. D7 K$ c0 u& z1 \1 y+ \' i) i% ?$ m( p/ J  }  |
/* OPT Field specific defines */9 n6 L) c7 ]9 p0 ~. {
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)6 T& N/ `3 _7 n9 T- `6 W
#define OPT_TCC_MASK                        (0x0003F000u)
2 R! a# ^& M" ^, ~& X9 t#define OPT_TCC_SHIFT                       (0x0000000Cu)4 N. ^. N  Z* N: n  S2 m
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
3 q! O' h' N9 F& o* v& @3 r7 M#define OPT_TCINTEN_SHIFT                   (0x00000014u)
& j1 C/ J/ `$ j- {: `/ u% [% _! l& Y0 }& U
char ping_buffer[PING_PONG_BCNT];- J0 \3 S3 H1 x9 Z. w& K& e
char pong_buffer[PING_PONG_BCNT];" Z2 a, |) M9 \( X5 a
8 y( ]4 Y2 P8 L: b$ q' w1 Z

' Q& l! g+ j6 P$ i9 [  b$ [/ ^8 e
6 C' `' N% A( T: r8 s+ v% A$ @' u0 w" D
static void ys_edma3_init()
3 X, `* v" X" S, `0 @( N9 D{
. H" B" D" u6 U$ u. r) K% e: {        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
  B. [% s5 t# r3 `, M: E+ h        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
  W) r4 @" q; {8 F, j6 B0 @        EDMA3_DRV_Handle hEdma;
" F5 z3 s4 O2 v2 v) v9 p    uint32_t chId   = 0;1 }, L& s' n% l. \# [% l. ^
    uint32_t tcc    = 0;/ I6 {( k( }- `) b3 D( Z

8 g& L0 s$ H5 k- k$ S    print2arm("edma3 driver init...",0);
* z$ U  c! d+ F) Y0 B, Y2 N! {: M( J7 n
        hEdma = edma3init(0,&result);
$ B- t% ?$ P/ X        if(hEdma)
5 q) P! c, O9 R& ~: P        {
) p$ D  W5 @( I                print2arm("edma3init() Passed.",0);
6 Q) S! }9 ^9 H- a/ A% K" F        }
- k) z& y. o9 o- a, a5 g* G; [        else
( u+ W, m8 J. q) l, q& L% M        {7 a- ^# Y, r* y; A. O3 S2 ~" B
                print2arm("edma3init() Failed.",0);
* L9 n0 P/ `4 r6 w: o7 v0 z# O$ T        }0 \4 g" l0 G- z; }
       
; g5 x6 y  w) i8 P9 i# N& D        if (result == EDMA3_DRV_SOK)6 P+ {- }# a3 y, f/ y/ g" y
    {
' j) W9 t! o6 T; c/ q                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,6 {1 s/ i" f0 }3 a+ ]. m6 ^
                                                       (EDMA3_RM_EventQueue)0,0 R3 _7 g6 x6 n5 Q# U% R1 Q) U9 p0 s1 `( Z
                                                            &edma3_isr, NULL);
% c3 N* x) P9 r- f/ N. Y# T    }; d5 |* z& z5 Z5 U- x
       
3 I9 o# ]$ G! n$ o  L: S9 G- z        if(result == EDMA3_DRV_SOK)
  i  T. I0 ]! v6 e7 \        {
- o9 A  a& M7 f5 P' H                paramSet.srcBIdx    = 0;
' `8 U& C; V4 @* n; w+ J5 B                paramSet.destBIdx   = 1;4 c0 M! q7 J: n9 z0 S; B. K
                paramSet.srcCIdx    = 0;7 b2 C& p. |7 C) d
                paramSet.destCIdx   = 0;$ n% z6 Z( y( a/ S6 i" `3 m
                paramSet.aCnt       = PING_PONG_ACNT;
0 I' b- p9 c* \7 W$ a& @5 N0 L                paramSet.bCnt       = PING_PONG_BCNT;
9 @! y2 T/ D! Y                paramSet.cCnt       = PING_PONG_CCNT;
  Z" P" Z# a1 N" W                $ V/ U5 b2 Q4 {
                /* For AB-synchronized transfers, BCNTRLD is not used. */. V) P" l# U9 g  p+ p2 Q
                paramSet.bCntReload = PING_PONG_BCNT;
# J7 P/ B/ Y+ R9 K
. }( l( J" A3 H% z  P+ u( d                /* Src in constant mode Dest in INCR modes */5 i4 I+ h" B, h. W
                paramSet.opt &= 0xFFFFFFFDu;  r& n4 D" A9 \2 g0 ~5 X
                //paramSet.opt &= 0xFFFFFFFCu;3 q" z( Z- r, l% m
               
3 f% W" U  L5 _3 ^5 N8 `) F1 S+ @                /* Program the TCC */8 @9 Z6 j- }) j. |' P* A
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
  G. L/ y) \# ^# X4 u
8 c* ?$ _" _' N& A+ Z                /* Enable Intermediate & Final transfer completion interrupt */
6 S. P1 v. A8 ^: {7 K& ^                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
7 o, p" K6 m+ q7 n1 I                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);) E$ _1 K4 `  ?% x: E5 J; j- s7 I
* F8 z7 k( i& D9 E6 W" `
                /* AB Sync Transfer Mode */$ ~, X' w' w3 V, x6 x  f
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);( `8 v: Z5 A2 V. U* n
                : y7 C9 N3 e  i
                /* Program the source and dest addresses for master DMA channel */( `2 `" E% g0 X
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; U/ W& x5 o& a4 l3 o
                paramSet.destAddr   = (uint32_t)(ping_buffer);( U* h+ N& v# D+ W+ _

: W3 Z( c* {1 r4 U( N                /* Write to the master DMA channel first. */
( F0 l$ A' J0 _6 L& V% n" ^                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
: U9 g1 {8 c0 J# j0 J    }      
6 [5 w2 t) x  m8 N% Y! d+ \/ I9 o/ \* v8 A: W
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 \/ G, Z; s& }3 N       
$ W2 g( E4 N) e6 a( \* X8 B    if(result == EDMA3_DRV_SOK) 8 g8 O8 r% ?/ g# ~; I. H
    {
2 r$ W. `9 V; @8 k9 l! b            print2arm("edma3 driver init success.",0);
! e2 z  p! z5 w: [6 s    }
- t0 j: J; v* s( R}9 ]* I. ]4 V: N, [" U
/ K, T, C- B* |
4 c  ?, c& a- E6 z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
7 l6 V! p" e0 S- F, n0 g% z# u# z3 ]$ R4 k8 M

# d0 Y. y0 Z7 f8 _
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:478 F- y. L& i  E
每次DMA传输完成后都要再次使能传输
% }& t0 u0 Y8 `' O8 j: d! E0 V
原来是这样,我明天去试试,谢谢了!




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