嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:* w2 U: w) X5 e9 p1 t+ v/ O" [
#define  PING_PONG_ACNT          1
  b0 O  P# R+ s; B: a$ z& Z#define  PING_PONG_BCNT          8*32*40
% T& l; l* z' }# N2 s//#define  PING_PONG_BCNT       1
$ ~: x. D1 ]/ v+ B5 H3 ?: [( T#define  PING_PONG_CCNT          18 d4 c" _3 d* u3 _" V
#define  MCASP_BASEADDR          0x01D00000
* H. P7 k( k0 w% o- }6 m' c4 T0 k/ p#define  Mcasp_RXEVENTQUE        (0u)! C+ c1 @: e& w: Z% N2 [

) ~- N; a. [9 }3 s/* OPT Field specific defines */
0 s7 m& M5 O  A) J4 @#define OPT_SYNCDIM_SHIFT                   (0x00000002u); u, i$ X* |9 {2 @% R# i
#define OPT_TCC_MASK                        (0x0003F000u)
9 t: W. t- k0 @4 h8 q; f6 I#define OPT_TCC_SHIFT                       (0x0000000Cu)- u/ f5 e6 G8 o" u) W( T. w
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)! ]# F2 o7 q6 m7 ?- k& ?
#define OPT_TCINTEN_SHIFT                   (0x00000014u)6 Y6 s7 o/ S$ a* `' |3 y

4 @$ ]; v# o! `: i. n" [char ping_buffer[PING_PONG_BCNT];
" K8 ]4 g8 a8 ^6 uchar pong_buffer[PING_PONG_BCNT];, ~  i8 Q+ Q1 f0 F0 C& v) H
6 E1 q/ h' c% A* l
% R7 W" e* w# g& V+ _/ t

$ k0 J) p4 [, b; I/ ?* S, ~. y
# n2 G. \& w5 E8 Estatic void ys_edma3_init(). c8 N9 B4 ]: ^- F9 u
{
4 F$ v. F8 q6 c: w        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};5 }/ m; _# @2 @7 N4 w6 Y- e4 [0 ]
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;1 _+ n* r9 A# q1 L% d' m( h
        EDMA3_DRV_Handle hEdma;
8 q* ~6 P) V1 L" I* d# M' Z5 _    uint32_t chId   = 0;% P* }3 d8 ^+ }" U
    uint32_t tcc    = 0;* d* V+ Q; \4 W$ n/ r

: S( `9 ^+ T# \7 @& Z    print2arm("edma3 driver init...",0);) ~' ]! P0 R# k( x$ _
$ J0 G$ L. M6 c2 V6 J- k# l
        hEdma = edma3init(0,&result);
" P7 Z# `, {0 V: x        if(hEdma)
5 d$ S2 @% P7 @" K5 _4 {7 q        {
  t. Q$ c; j! l5 I8 K                print2arm("edma3init() Passed.",0);
/ v% a$ p5 ~, m        }9 w# n5 B% F% V9 T" N
        else8 ~, B7 P% f8 Y! k; A
        {
# x0 P5 [5 d( p5 j                print2arm("edma3init() Failed.",0);4 k$ Q- h$ v" K, P
        }
6 x/ {" d, {' d" T1 M       
) D. X# |/ ~6 F/ i: {* W        if (result == EDMA3_DRV_SOK)7 r7 v/ D8 o7 G2 C$ ]
    {2 N/ o; B, e, u. T8 G
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,: A: S$ X1 |( X, o* Y  j
                                                       (EDMA3_RM_EventQueue)0,  m- {& N( Q1 E, y' `& f
                                                            &edma3_isr, NULL);
% K( {! v/ N4 a$ U: B; E    }
+ f) u! R0 P6 E- A& ]$ q# r       
9 p% k) G. I1 k+ O0 R        if(result == EDMA3_DRV_SOK)4 k8 H  U2 J, k+ {  L  H$ a$ m; c5 x, e& L
        {% Z- Q8 Y& M- q) e! Y0 m
                paramSet.srcBIdx    = 0;  G7 ^3 D5 G- S
                paramSet.destBIdx   = 1;- q6 d# r; R0 L, J: p
                paramSet.srcCIdx    = 0;
: X; s+ Q3 K( i4 J( O* y9 C                paramSet.destCIdx   = 0;
$ R  i7 i8 D8 M" \  m. T: k5 R+ h                paramSet.aCnt       = PING_PONG_ACNT;
8 [; q% O) M2 b! L7 ]  r2 z                paramSet.bCnt       = PING_PONG_BCNT;
1 n) ?; F5 v4 y! X6 M0 F7 [                paramSet.cCnt       = PING_PONG_CCNT;
5 T4 o) B1 k' T5 J! e) m2 V               
  ?, F! s1 u; U                /* For AB-synchronized transfers, BCNTRLD is not used. */1 x# p5 F* L% e; R
                paramSet.bCntReload = PING_PONG_BCNT;# ~# Z% B8 |+ p. v" b4 l  f0 S
( ?2 T$ ~$ A7 s" t: u- K" y
                /* Src in constant mode Dest in INCR modes */
$ j2 I. [# V9 s                paramSet.opt &= 0xFFFFFFFDu;
" L# n' d9 K  ~( {                //paramSet.opt &= 0xFFFFFFFCu;
  O7 K- n8 G5 {& J                , F& _1 [4 R" l4 ~' h$ _4 c- s
                /* Program the TCC */4 i6 x2 Q, z" d% }+ S
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 z) y6 z* u" B3 {* e
& J  h1 b  j- T* Z% k
                /* Enable Intermediate & Final transfer completion interrupt */
) Y% j& c: x" i                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
, R8 }0 A' D6 B                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
$ _, f- ^4 k+ S' g9 a3 X/ W  n8 w9 s8 T
                /* AB Sync Transfer Mode */  Q6 l: L- j/ I7 S- c3 R' S/ I4 Z0 [! e  D
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" a2 K3 D8 ~+ U  l0 q2 f1 c               
) F* a7 `. R( X9 V                /* Program the source and dest addresses for master DMA channel */* J4 N2 {) b: a9 W# Q) }/ U! Q
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
! |! {# G8 \) f9 f( G5 A" @                paramSet.destAddr   = (uint32_t)(ping_buffer);
5 Z6 o) r! [' F& E! T. J
, w  d4 [8 B+ w5 `% p- r                /* Write to the master DMA channel first. */. I. u+ P9 \3 A: Y) ]. J5 N2 E6 E  U
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);+ g& t. {5 P. G; `" ~: y
    }      
2 v$ |- ]( _" {, S
+ v2 d5 @& w4 m8 o% b4 D        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
( J8 P+ {% O9 v; A       
3 v  ^/ T  S% F8 @# i) Y9 W0 X: r) c    if(result == EDMA3_DRV_SOK) : S# d$ @5 F  n, ?- C
    {
  y5 ^: m. O& Q# r/ z, w            print2arm("edma3 driver init success.",0);
6 r: p; ?. p, T' H9 Y    }
) Q0 o+ C/ @2 P, @: l5 L/ L: m}) e% _  d9 M+ L9 ]! r
6 [, m& X0 I7 O" @; o
3 _/ i. X3 o. [7 E- Q# K- N
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
8 i7 d" \6 m5 x6 y3 O' s
" Z. }0 {  l3 j  t/ {3 a
* p+ J1 ^8 O% D* R2 H+ z0 R7 D
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
5 O, x# E8 Z; T. Q, q; k7 L每次DMA传输完成后都要再次使能传输
. H( C( j8 N" j  y5 S: M
原来是这样,我明天去试试,谢谢了!




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