嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 R" J0 o' x0 G0 \7 @; I: }#define  PING_PONG_ACNT          1
. H2 K8 Y  G0 z! _#define  PING_PONG_BCNT          8*32*40 + D) |- P2 @# X. C" h
//#define  PING_PONG_BCNT       1
0 ?, W2 g# f4 @#define  PING_PONG_CCNT          19 W4 }8 [5 Y( u/ L" D. r2 E
#define  MCASP_BASEADDR          0x01D00000% B3 G" }) q4 B, E6 k/ W9 `3 y
#define  Mcasp_RXEVENTQUE        (0u)% _% n/ o" L0 h' [: T- t/ l; j2 I- Q
9 q. f- V5 p  N* i
/* OPT Field specific defines */) ^+ K# }% h! Y/ b. l$ A
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
9 i  X) K: Z& M# J/ ~& ^#define OPT_TCC_MASK                        (0x0003F000u)8 f* n! D% B* e  @; ?7 i
#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 I: c8 z( z, W3 H# R% u; i* d#define OPT_ITCINTEN_SHIFT                  (0x00000015u)* p4 S% w- @! V7 q3 S3 g6 \
#define OPT_TCINTEN_SHIFT                   (0x00000014u): }2 \' b0 ]  G. _

& V- e+ [, B' w1 C  A/ hchar ping_buffer[PING_PONG_BCNT];$ F0 [+ [$ W1 g1 e: b6 H3 y. F
char pong_buffer[PING_PONG_BCNT];
6 t) ?& A9 x2 X- J# k5 q. i* }. O* s, k% Z; S

) l: L: j$ k8 T& h) ?- \! A+ @& \% [0 T/ ]) G

9 E, C2 c5 k7 L2 J; Vstatic void ys_edma3_init()
0 R9 o1 L# N% n# I& O9 g. @) l2 A{
4 y" p: p/ i5 y% L% p& p        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
# b0 F' W+ `! f6 T7 N) j        EDMA3_DRV_Result result = EDMA3_DRV_SOK;9 m$ D  [5 O& S1 m
        EDMA3_DRV_Handle hEdma;+ X+ ]/ H3 Y. M2 k% c
    uint32_t chId   = 0;2 u. L% J) g+ A0 G' A6 F" H) T
    uint32_t tcc    = 0;
) s4 x8 Z7 h4 e& v' c- h8 M, w3 l+ t0 c, M  Y7 W
    print2arm("edma3 driver init...",0);, o; f0 I" p+ d6 G# }/ O
* W9 @% n7 |# n! ]. D
        hEdma = edma3init(0,&result);
) \" _2 _4 |- q+ P        if(hEdma)
. }. y; c) Q1 k* n' _        {
1 P4 {2 b$ q! ]/ k- j9 [7 M                print2arm("edma3init() Passed.",0);
$ w) C3 U$ F: Z0 t        }
% A6 q- y5 i. W        else! e. b# f+ L' |7 q" [2 W
        {; C$ m; E) N* z; L/ n7 m
                print2arm("edma3init() Failed.",0);% ~3 A+ x2 p' ~& F. W
        }; j* p2 L+ q/ c! L; z; W$ O* e; i
        / `1 o% z4 |# s  J, q
        if (result == EDMA3_DRV_SOK)
4 u- |7 p  Y9 N! t6 j! _" v( H/ f( R    {' U& ^* d* N& J
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,4 X& l8 e" a1 I: G1 a
                                                       (EDMA3_RM_EventQueue)0,0 o2 X: h# {# y; J) b+ o
                                                            &edma3_isr, NULL);/ N8 b6 k# _+ F) H
    }
: u* q4 M$ q; u8 x4 P4 b& R7 t, U       
/ ~" O) P/ [/ _1 G7 L        if(result == EDMA3_DRV_SOK)1 `+ {6 M% N: p0 }
        {4 q! S. e! C  \" y+ _
                paramSet.srcBIdx    = 0;# w( U4 c% n8 V
                paramSet.destBIdx   = 1;/ y" {5 n. f/ z5 w! l5 g
                paramSet.srcCIdx    = 0;
, J% R5 H' L3 |0 O8 `                paramSet.destCIdx   = 0;1 N+ P6 I  I% D
                paramSet.aCnt       = PING_PONG_ACNT;
: S- k1 {! H( C1 C. y                paramSet.bCnt       = PING_PONG_BCNT;
6 F/ p  h' c* B/ f                paramSet.cCnt       = PING_PONG_CCNT;
6 b, j/ Q  P9 c' M. ?4 ?6 k                ' B. g9 A! v( z' j5 C# c, q6 }$ d
                /* For AB-synchronized transfers, BCNTRLD is not used. */
' G2 ^) n, K) `; b, v( u" T( W                paramSet.bCntReload = PING_PONG_BCNT;& k  W# [$ C2 I! I4 w8 Q% S

+ g% V) k' H' q9 G" d                /* Src in constant mode Dest in INCR modes */- ^) V. F, G! c/ i
                paramSet.opt &= 0xFFFFFFFDu;
/ n; e) O6 U1 e                //paramSet.opt &= 0xFFFFFFFCu;5 }: [. Z. R, Y! N9 d0 C
                ( l9 E8 {% h# n2 \9 [& d
                /* Program the TCC */
5 f: N1 h# t2 y% Y: [+ y                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);" {6 x) T7 T, x( g0 k/ Y

" O, J2 R: U2 a1 d; G                /* Enable Intermediate & Final transfer completion interrupt */+ k/ O: U! C3 _/ A! U  R
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);/ O) d: u0 u% S  o  R4 y
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. [% H) [/ t( {+ X% B: l
& p- I2 z$ F( D& X' {
                /* AB Sync Transfer Mode */
% x* k# n. m* X  {1 D4 J3 [                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ v: f1 J/ z2 _& I                7 u, }7 s- _+ B3 h4 }& \* P; ]; e
                /* Program the source and dest addresses for master DMA channel */
3 w2 e2 T( {; D1 x                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);, W7 Z. u! Q, \) R$ B% K3 F
                paramSet.destAddr   = (uint32_t)(ping_buffer);7 c, ^7 Q8 n& A$ J; \

: n+ h4 T0 j- _5 m$ K  }0 V                /* Write to the master DMA channel first. */
4 l' W7 K: R7 {) g1 M* G  l                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
# H% m- u+ A, x9 \( A% B    }       3 A, d# r7 i7 p" Y& [' y0 |8 w( H
! f: A; E5 o' g
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, W' V5 N3 V; _. W" M5 w/ {       
, j- k' j( g  e    if(result == EDMA3_DRV_SOK)
# }0 n- k1 n6 Q! d    {8 z# b# p$ g- U" c" z
            print2arm("edma3 driver init success.",0);, I' p& O3 s2 L8 _+ x0 ]6 D
    }
9 C& h; C7 w+ \( W}
  \1 S; _& a3 X. R% I9 V5 T8 W$ w9 r6 H8 v+ i2 L

- }8 ]- O5 o+ S: Z- YEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。! z% {% j! Q2 e3 q( P( V% f
: P+ M/ Z) x" l8 t  Q- }- r
# g  u" M5 q1 ^2 r$ r3 S3 ^+ P

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47# }. `  W3 V- s6 R4 q; l
每次DMA传输完成后都要再次使能传输
3 l' U( v9 S& M6 n: E- R! K
原来是这样,我明天去试试,谢谢了!




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