嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 b- J  g# ~: y+ F, O9 }
#define  PING_PONG_ACNT          19 ^& e' B' Q0 i- H1 P7 e0 i" ]5 p
#define  PING_PONG_BCNT          8*32*40 # I1 ?( f0 \4 O5 z% L& I( X
//#define  PING_PONG_BCNT       1 % @9 `" z4 W* {' B0 \4 l& l3 F
#define  PING_PONG_CCNT          1' j* G1 V- `! T/ y; z* H, z
#define  MCASP_BASEADDR          0x01D00000
5 P2 g' o9 ^: M9 l# n. G1 P- n0 S#define  Mcasp_RXEVENTQUE        (0u)
3 g4 u$ X+ A; V; p
, V6 R9 k. B: X- M1 p/* OPT Field specific defines */
) W- \" N; Y( |6 ^9 {' t. N#define OPT_SYNCDIM_SHIFT                   (0x00000002u)! N/ F  H: ~  o2 @! ~( u; r) |
#define OPT_TCC_MASK                        (0x0003F000u)
! j8 B3 c- k2 h+ {: i#define OPT_TCC_SHIFT                       (0x0000000Cu)8 N" V) q/ ?' X- d( \* n- h
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
' T0 c! o7 S3 D( F6 i& a0 `#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 e0 i) T1 ?; P4 ~8 t: G& l' F' W% E. D, u$ S1 G
char ping_buffer[PING_PONG_BCNT];
4 E: v$ N6 Y; V7 d7 r6 w5 ^! h/ echar pong_buffer[PING_PONG_BCNT];4 u9 n- {+ v% E. @4 w$ E4 ^

2 W* u% s9 Y% X7 ~: p) ?4 ~* z, a. _
" M9 }2 ^: y( o! z5 I
1 F9 x6 e/ E; r* M$ p
static void ys_edma3_init()) c! w+ M4 Q0 m. l# w& v
{
' G  }5 ?1 g+ R        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- o* C5 O$ m: w* V1 ~( ^
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 M) x) V, z& L) H  d; n
        EDMA3_DRV_Handle hEdma;
* i( C& n4 s; n    uint32_t chId   = 0;
: ?$ y, u6 V; t* Z    uint32_t tcc    = 0;
: ?6 U; ]) k8 f- J4 z" o* J, S  a! B  r* Y- [& w% D* B+ z
    print2arm("edma3 driver init...",0);
! E+ C) h1 ?0 c, n
5 O: P$ k- e' R, m' _* w        hEdma = edma3init(0,&result);
7 Y6 p" Z  F& @0 Y        if(hEdma)
+ S1 \' d% C; l5 A$ }        {/ G( S5 t  ]0 @( O( k2 S
                print2arm("edma3init() Passed.",0);& |# \( j# ~7 s4 u: C/ r& b% c8 ?
        }/ f8 u3 T* b4 a+ S
        else) i8 H) C* w$ y# t* H
        {" @) u. z% _1 F
                print2arm("edma3init() Failed.",0);3 M8 c" o; [5 Z- j9 _" Q1 k2 o
        }
+ J* k! Z  g7 o0 C        $ T+ b% S( K, h* L. p7 Z
        if (result == EDMA3_DRV_SOK)8 K" A" C: V  S0 d' C: P2 {
    {# T2 ~- m/ O6 d! U8 _0 H  P
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,  O$ x3 M, p: S  ~$ l3 E: G3 w
                                                       (EDMA3_RM_EventQueue)0,
2 _6 f3 u7 [: S( z6 |3 Q0 h                                                            &edma3_isr, NULL);9 L3 [5 i- N6 `% [
    }
4 l+ U0 z$ Y7 x3 E. @        4 z& |  N" B& \) N) c7 G* K" N9 i
        if(result == EDMA3_DRV_SOK)
! L5 c3 k+ y- c& @/ h* Y( R        {& q# l; E% _8 O. U5 j( C
                paramSet.srcBIdx    = 0;0 J2 o! E; u3 G) p9 ^- K  j
                paramSet.destBIdx   = 1;
0 }: Q. N& Q0 N7 ?: y                paramSet.srcCIdx    = 0;
3 _2 M: t0 M. c2 q                paramSet.destCIdx   = 0;% D  E( ^% m- ^
                paramSet.aCnt       = PING_PONG_ACNT;+ {0 k( X- z8 b. ~. \
                paramSet.bCnt       = PING_PONG_BCNT;
. y/ F. G* u+ ]                paramSet.cCnt       = PING_PONG_CCNT;1 D5 G% N  y+ Z2 i; N9 ?" @
                ( A$ p2 j; A7 A7 i9 N4 O
                /* For AB-synchronized transfers, BCNTRLD is not used. */
5 P9 m; u2 m/ N# E) X$ R                paramSet.bCntReload = PING_PONG_BCNT;
- N1 I1 @. E7 w: Y
& I0 [5 @1 B% N# o0 i; p                /* Src in constant mode Dest in INCR modes *// G3 j3 {6 x" C
                paramSet.opt &= 0xFFFFFFFDu;
' c/ a- v/ g9 W$ z) R' ]                //paramSet.opt &= 0xFFFFFFFCu;6 G  i: _! H; v) Z6 Y; m0 `
               
& l8 J" E- t/ k3 {( s; n8 ]                /* Program the TCC */
$ K/ N& _& z2 r% q                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
" J2 x5 \5 e! C( w2 e5 @0 a7 N9 G8 C! x; K  }
                /* Enable Intermediate & Final transfer completion interrupt */
) e9 ~5 X  [" j8 x6 S                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' {9 J2 w& M" Q* p% l                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);7 \6 A, o) s) P; E6 ]  \8 F7 ~

# m$ \& B% [8 U, j' [; M4 W$ u1 U                /* AB Sync Transfer Mode */
) n9 J; l/ _  u* ?6 s                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);  v1 I8 r5 ~; c  I% i0 M% j6 m( B
               
* D( a: P5 s1 w% ~% N                /* Program the source and dest addresses for master DMA channel */
4 N7 Z, h& @. h2 g                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);/ k% e# b; ]- k1 X9 R7 }- Q
                paramSet.destAddr   = (uint32_t)(ping_buffer);; M! D5 q8 ?* c* y1 h
# D& k, g( g* E; w* d
                /* Write to the master DMA channel first. */
+ o5 l( d- c' Y) B: d$ [4 k                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);. k5 U- l. W+ M3 g$ K- G3 u' t
    }       ) c4 c- G* h8 A3 j9 e" s9 c

$ a6 B: V: t/ d5 O( y. j( n        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& J4 ^. l- G; S5 E) [       
+ P- ~2 p, A" M, i" o    if(result == EDMA3_DRV_SOK) * q4 X5 k+ o" M% F% Q2 ]# O8 \2 O
    {9 H9 X4 x; e% `% q9 ~* e& n# O3 j
            print2arm("edma3 driver init success.",0);: w) C& O& j9 O  `; |
    }
1 O* q/ I3 f4 a' i+ ~5 L}6 f& H% d2 O4 P5 I* U1 }6 i7 ]3 ^

. T) Z4 T  z' p8 |1 }( k2 r1 L6 p' Y$ C! b% s( v# z5 i# C
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
( q, {! L5 Y/ v+ _1 V6 k: R0 P" V& F& t& x
4 b' ?7 x3 K8 o2 G/ L

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47+ ]$ i" `( s% }0 d" c3 F: R$ h
每次DMA传输完成后都要再次使能传输

# A, v# c5 f$ w5 _; T. ^+ m: I原来是这样,我明天去试试,谢谢了!




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