嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 b$ n  m+ L2 A+ Z; u1 @
#define  PING_PONG_ACNT          16 |/ Z% n  j: ^  g# ~9 R% W
#define  PING_PONG_BCNT          8*32*40 9 Y6 K- ?2 K' j* q5 S
//#define  PING_PONG_BCNT       1
5 m6 m+ ^: C% L; Y: G1 u4 a4 J' k#define  PING_PONG_CCNT          1" k5 z1 B5 N/ y  e+ R
#define  MCASP_BASEADDR          0x01D00000
" c1 \4 Q/ x* p+ w6 b7 v#define  Mcasp_RXEVENTQUE        (0u)
& o/ ]3 }- z% L3 B9 B2 f6 k7 F! Q$ x7 X2 P! T2 S& F
/* OPT Field specific defines */6 M3 x# u$ C+ V- f8 l; D% m
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
% M) z1 J! [' M( L2 A: E#define OPT_TCC_MASK                        (0x0003F000u)
# @' V& V& H6 ^& _#define OPT_TCC_SHIFT                       (0x0000000Cu)
3 M- T+ C) C/ b6 ^#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
# R, O" H) [9 W( [: G9 c#define OPT_TCINTEN_SHIFT                   (0x00000014u)3 w8 R+ p5 a' H% |2 l3 a
: w) E# H3 B9 K4 o$ y
char ping_buffer[PING_PONG_BCNT];
! |- i! ]: b) Uchar pong_buffer[PING_PONG_BCNT];4 t) T  o! n8 \" s; c2 _8 T/ H

4 i6 c$ v9 G. T9 h$ e5 p9 u7 }- N$ `& P0 ]. F& u
9 P0 k; p: v1 x# I. B
% w" K/ i+ P3 H- u3 J
static void ys_edma3_init()+ A4 Y; o7 ~# O9 D/ d
{
9 ]$ u4 u' E  q1 O9 }) T        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};  x6 k0 U+ ]% F, F
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ J" Z% Q8 X& n        EDMA3_DRV_Handle hEdma;
: @+ e% B9 b0 M# v5 [: r; u" s/ W+ ?    uint32_t chId   = 0;
* B( E2 N; V% N# x) S    uint32_t tcc    = 0;
' Q3 h" Q  V( c! w/ f3 W7 [% D4 y! R" x
    print2arm("edma3 driver init...",0);) S. n6 \$ n9 q. U& u  h& w) {- e

$ c4 r0 K$ O/ @" R        hEdma = edma3init(0,&result);( g! ^6 \5 B0 n) v
        if(hEdma)
4 X0 N1 ]4 S0 H( K, c: C: R; T        {
) ]4 z+ x8 T2 f: Q9 g8 \% J8 j                print2arm("edma3init() Passed.",0);
3 }2 d$ |# u  i5 u& Q        }
  ^( r6 z$ C" f- u        else
9 T6 S% d$ b' |        {
* Y$ G% i+ A5 X                print2arm("edma3init() Failed.",0);
; X8 M' ~) @$ t  g7 B        }
1 W- Z4 w: Q: H% n! J        4 Y) K% k' p- \8 o) c$ E1 U
        if (result == EDMA3_DRV_SOK)
3 V( X) b5 ~; S9 k! \    {
$ O0 Q7 M6 c% D" R, x                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,' d1 U4 N; f1 q/ n" {) X
                                                       (EDMA3_RM_EventQueue)0,) `0 M5 K# f5 o8 ^
                                                            &edma3_isr, NULL);
6 Z( L* l# i, S    }
( Z6 _0 I0 C# d/ y' R1 [       
' x$ i2 @2 [9 y, n        if(result == EDMA3_DRV_SOK)4 a( \# [% O/ n" L# B* }* o
        {, N2 o% G( Q' X6 ~4 z
                paramSet.srcBIdx    = 0;
- h4 X: I) ]% [. r( K. K                paramSet.destBIdx   = 1;
- R' Q7 k" L0 b                paramSet.srcCIdx    = 0;4 W* X- n* [$ E8 h# ?8 w2 b' h8 r( a
                paramSet.destCIdx   = 0;# k! y  @; g. j1 E' O
                paramSet.aCnt       = PING_PONG_ACNT;
4 W" V- u' J/ ?                paramSet.bCnt       = PING_PONG_BCNT;0 i& g3 K* h1 A* l/ `1 B* n( w
                paramSet.cCnt       = PING_PONG_CCNT;
. @8 K5 P5 m- h2 U' |; a/ v* d                0 G$ S& F& Z2 b8 l4 W: c+ }9 O
                /* For AB-synchronized transfers, BCNTRLD is not used. */0 O' W7 w$ A4 s2 b3 K4 d
                paramSet.bCntReload = PING_PONG_BCNT;7 W2 x  P! |- G
; f  T$ G; H9 q8 R% [* \
                /* Src in constant mode Dest in INCR modes */
( }# F% m% z1 r                paramSet.opt &= 0xFFFFFFFDu;
+ e$ X5 Y9 T" q( J                //paramSet.opt &= 0xFFFFFFFCu;
7 F9 Y& t: Z2 `" X               
8 a9 A' j) q, N& P                /* Program the TCC */' @' H9 y! w- x! M- w& P& R, n
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 H+ _9 w5 w3 v7 P5 S6 ~: J, W; y( h% g4 g( q) W8 _: w- _; n
                /* Enable Intermediate & Final transfer completion interrupt */8 |% p8 S/ [- n
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);" ]8 X  U' T1 T* c- M
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);/ P0 `6 c& {' w

. L" K# ^5 l" l# d/ H6 L                /* AB Sync Transfer Mode */. q$ M5 }) }- H. g8 y; ]: p
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
0 C0 h$ S' j! O                - t6 |( r5 S+ _
                /* Program the source and dest addresses for master DMA channel */
1 Y8 A% H/ K! U7 v- O                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
/ M- `+ ~4 _  X                paramSet.destAddr   = (uint32_t)(ping_buffer);
! q% I6 {; P1 L6 u/ L3 h, \+ p1 v4 H6 S$ ?( q
                /* Write to the master DMA channel first. */
( V: M/ \# ]" }8 j; t; A& S- \                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' @4 [* s' J+ y' g    }       2 @$ n$ t, g% w$ b4 K" v5 |
6 ~) r) Y; E+ s
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- b: Q5 M2 t1 ]
       
% @2 W- O( ^* f    if(result == EDMA3_DRV_SOK)
6 q9 v  T* k+ v# S2 d& q1 {    {
5 c( b6 B# B4 V+ F9 ]- z/ S* q            print2arm("edma3 driver init success.",0);
- i% `; H- U: d! F  p( ^; m    }
  h% B& A5 x; b}
+ s+ C; [6 d+ Q% v
  T4 b) q1 D7 r
9 y7 A+ q0 E' Z0 @) v( T  \& s& E- `EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ Q+ r, K  T6 C. I/ J! u9 @6 l, F. i6 `9 F2 E) o" E

& {9 x3 K. I7 V8 v  s4 |& s
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47) t8 _3 v( @6 r$ b- k& f/ F8 M
每次DMA传输完成后都要再次使能传输
+ G+ }/ D9 \& J+ W+ g' i/ F0 s6 X
原来是这样,我明天去试试,谢谢了!




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