嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; Y* T0 h6 v4 P3 T
#define  PING_PONG_ACNT          1+ Y+ r# k/ Y# y1 W: L; H: a
#define  PING_PONG_BCNT          8*32*40
: X* d' J4 }3 G//#define  PING_PONG_BCNT       1   L- c) o* m! [  [( @8 d5 J
#define  PING_PONG_CCNT          1/ C5 ^0 \8 v0 g% N9 i
#define  MCASP_BASEADDR          0x01D000006 M" ^- F  S5 ?5 Z# d5 b! o( l9 \! s
#define  Mcasp_RXEVENTQUE        (0u)
& ?  h/ h; j! D# k( F& @. ?! x4 c
/* OPT Field specific defines */
% k6 P/ Q, n5 b* |. F8 M, b9 s#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
" B' V% Z4 H3 ~/ e: {, h  K#define OPT_TCC_MASK                        (0x0003F000u)
8 s' K" Y6 v8 ~! S#define OPT_TCC_SHIFT                       (0x0000000Cu)
% c# W! h  p. {, K# \#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
) W  _5 x4 C- E; @2 \0 B6 e- w; X; z7 E2 n#define OPT_TCINTEN_SHIFT                   (0x00000014u)+ V8 w* E: ~( T- K6 N, w0 D+ i
+ w3 I4 Z% q0 F0 V8 @
char ping_buffer[PING_PONG_BCNT];* [2 ^0 o  D* P
char pong_buffer[PING_PONG_BCNT];" `  H% j) |+ K8 k# _4 d& R. L

  P5 [% k8 x: L- E; }7 |
% h) `& N0 R- I( o) s5 f' x$ B% k. r5 |* M8 ?/ n
# k% D/ H: v/ f+ W" ]$ ]' p
static void ys_edma3_init()# d' p0 q& U0 A4 Q9 L
{/ f2 X% t( L, T+ R
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
+ k$ ?+ u# t% l, F& M3 A! `        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
2 ^" U0 T& L/ C        EDMA3_DRV_Handle hEdma;9 b* H) e* {4 b. j! R% r- n. ~& n
    uint32_t chId   = 0;
" k, z* C  \  O    uint32_t tcc    = 0;! s7 A$ H: X* I1 P8 J7 ]" Q2 t

# s! H# w& ^4 j- }) F    print2arm("edma3 driver init...",0);
0 l! s* E5 U  t5 B: S4 ]) P
$ N# o! ]' i' D% v& R) q        hEdma = edma3init(0,&result);
0 V9 W% {" n* G+ D        if(hEdma)
& n" `7 v/ q$ U7 E' R& ^        {
, j* j1 @- s, W: e                print2arm("edma3init() Passed.",0);
2 s4 d- ~5 ~* V' _' C5 F        }
3 z- a6 D8 t! m3 h9 e4 l$ V7 J        else# J! L' P6 n- Z2 f0 ^" z
        {
9 u  f' l0 v7 T) H) B6 \- ~                print2arm("edma3init() Failed.",0);3 Q8 J5 W( R5 G0 j0 I2 f
        }  _& r$ W# q3 Z5 c4 N/ a
       
( j( G& A7 w7 c4 F( q% }        if (result == EDMA3_DRV_SOK). u$ \$ B/ j+ j( w/ {/ h) g
    {
. k: s7 r) N7 N                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,6 e8 Q9 y( }. a6 [, T! G
                                                       (EDMA3_RM_EventQueue)0,- K% E1 G7 B7 U9 H
                                                            &edma3_isr, NULL);, o% D2 K' K/ r6 w2 `' Z: l& ]( O. n
    }
6 ]+ z1 q2 _% F' N# F& p- x* w        " @9 X8 p. A4 O* k; ?5 y$ |  i
        if(result == EDMA3_DRV_SOK)7 e/ z7 q  A0 `) h) V
        {
5 n) ^  e; D& R3 s% h1 _, Y                paramSet.srcBIdx    = 0;8 ^$ A9 {. e/ N; q" l
                paramSet.destBIdx   = 1;. S7 a" Q4 D1 I+ S' X* |' O! H  f' Q
                paramSet.srcCIdx    = 0;
3 J! V6 _  A$ Q$ Z7 B$ G                paramSet.destCIdx   = 0;% ^/ M* b1 }7 ?5 |/ j" z1 [/ a
                paramSet.aCnt       = PING_PONG_ACNT;
0 E8 L/ U  u& \9 ^5 w( v5 Y                paramSet.bCnt       = PING_PONG_BCNT;. V, V5 B+ w$ s6 ?' B+ z! ^3 o
                paramSet.cCnt       = PING_PONG_CCNT;
& }- c, i3 Q( O( @5 B' H; e: M1 `" f                5 m  }5 `' {# i# D9 f; F& z/ I
                /* For AB-synchronized transfers, BCNTRLD is not used. */
" I% g4 {" g9 V; G1 Q0 G                paramSet.bCntReload = PING_PONG_BCNT;/ O: G3 i- W( k& _( t) l8 D. F

7 _) w) Q. N! P, P) l1 V' n1 v                /* Src in constant mode Dest in INCR modes */
  l# Z! U: L2 r  i+ o                paramSet.opt &= 0xFFFFFFFDu;
7 x- Q3 k# H, T; l                //paramSet.opt &= 0xFFFFFFFCu;
6 K7 L2 C  A8 |. ~, V- m/ x: H  M                6 ?' o8 \4 p. e: {0 l
                /* Program the TCC */
# O0 j$ A5 o# {$ a3 B8 S  p9 j* Z- d( ?                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ r: e5 f: _# m0 E3 b# B5 h8 U# G& L9 _$ y; K# `
                /* Enable Intermediate & Final transfer completion interrupt */
' s8 e/ g, c1 E# d6 y( p                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);8 v* x" x- t; {' p3 C4 W% i
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 K* D1 Z% `' F: M
( O. i- f  M8 M: T7 P1 B) P* d( S
                /* AB Sync Transfer Mode */
/ K$ f* @2 Z- M8 U' S                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);3 Z5 t5 g1 z3 I
               
) h, k. C8 c& E- t, k                /* Program the source and dest addresses for master DMA channel */
8 }1 h( t0 f" T& T6 a  Y! ~                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
+ o! y* Q# d5 S! h$ i                paramSet.destAddr   = (uint32_t)(ping_buffer);1 Q/ ]2 _* P& e( _
+ k5 T; U+ [- c, w' b% z" t0 m, t
                /* Write to the master DMA channel first. */
6 d) j0 e+ u8 ~0 m' W: k' c* Z                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);6 c$ e$ i! i/ l) C
    }      
$ d6 L* P! C& c1 x/ C0 S
% _8 ~# o- D0 t# b0 w        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
4 k+ h  c+ [# u: X% n4 a' ]       
' }3 d# Q  X* g" @    if(result == EDMA3_DRV_SOK)
* T* ]" t0 ?  V6 H0 i    {, b" C, ?/ J" `2 C1 x) I( S! o
            print2arm("edma3 driver init success.",0);) }7 P  w+ Q2 r. [
    } % D8 s+ b. M1 O+ s$ V2 [( v3 C
}$ }1 P/ R/ \2 ?8 A
$ Q, B% y' E) C; ~% ~+ s2 q3 f" R, X
$ j- Y, Q# V2 c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 ]1 j- C- @7 b0 i7 i
* i, G) k  n, d7 a6 z7 e7 _" P

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
: q! s# b0 F  P1 I每次DMA传输完成后都要再次使能传输

0 W6 P9 D# I# B9 D9 {0 d( H原来是这样,我明天去试试,谢谢了!




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