嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:8 @! v6 }- i3 V
#define  PING_PONG_ACNT          1
. ]% {$ B2 i2 n3 a+ m/ y#define  PING_PONG_BCNT          8*32*40 ! |: ^) i% }. L/ s6 B# B( P
//#define  PING_PONG_BCNT       1
0 c8 P" O+ z/ u* W: m#define  PING_PONG_CCNT          1
- J2 T/ p/ S5 T* b#define  MCASP_BASEADDR          0x01D00000
& H0 f2 S& Y9 b' c#define  Mcasp_RXEVENTQUE        (0u)/ [/ G4 s% j# o& \: `1 ~
$ D& N, U* ?: W  Q' ?. R
/* OPT Field specific defines */
  V# u* K9 o7 I#define OPT_SYNCDIM_SHIFT                   (0x00000002u)# L. q' V( a0 ^# k* _
#define OPT_TCC_MASK                        (0x0003F000u)2 m3 |3 i7 `$ M" g, b" F% i* c6 _
#define OPT_TCC_SHIFT                       (0x0000000Cu)$ P$ u4 s9 i6 l  N
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 g  S% i2 V& {* I
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
/ S- G2 H3 _" u' n) h: B. B+ r: C5 N8 _. `' D7 n
char ping_buffer[PING_PONG_BCNT];5 I: a+ ^* O8 ^# m5 s) y" u! H
char pong_buffer[PING_PONG_BCNT];8 N- ^$ N0 d. x4 k
# H+ ?" S) C3 h3 S6 j

1 ^; M/ a8 W% {, q5 Z6 E
9 {) j4 @$ e4 V5 M$ h7 t: o% G5 j' d5 M3 s
static void ys_edma3_init()6 F% ^9 m1 U5 f& Q
{2 t0 A2 S% B/ @3 Q4 f4 I5 A
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ Q$ I3 p  [6 e5 K2 M" p- P* F9 l
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 a% w/ U. t6 x/ K( Y# O" Q        EDMA3_DRV_Handle hEdma;
( F& h: s) m8 z/ v. J: X    uint32_t chId   = 0;7 P- t0 w" R; F
    uint32_t tcc    = 0;* h* j! l1 W8 q+ t. G
7 J: l6 s9 i. G3 ~
    print2arm("edma3 driver init...",0);
+ h5 v5 Z. L, W3 K8 t3 K# L5 d: n. X( y
        hEdma = edma3init(0,&result);
% C$ n4 J1 ]- u& r, X0 Z        if(hEdma), U) w* `; p9 Z
        {, U1 e# W6 f- P$ N4 k
                print2arm("edma3init() Passed.",0);2 S$ D* x  ]/ K, o- ~
        }
% D+ K  j. @! f* C* p. b        else5 f9 N/ s: Y+ v, K
        {
8 E) S7 f+ P& U( F                print2arm("edma3init() Failed.",0);
& ~. X7 j. R0 y0 ], ?        }
; k0 s- S5 I  a) I. x2 i       
- J( Y; }% E& H7 ?3 E6 V        if (result == EDMA3_DRV_SOK). u& C  N5 s9 `! E
    {
- J0 j' r! N/ p                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,  z: s: R" Z4 c- H  M; I" @  W
                                                       (EDMA3_RM_EventQueue)0,, e# C* R! c6 K! M
                                                            &edma3_isr, NULL);
  t' m/ Z9 y# D7 a& ~  @2 t    }
/ X  ^9 n9 v. t; x: L% ~: R        & }4 W9 r, O. i$ b2 o
        if(result == EDMA3_DRV_SOK)
+ U. ]& n1 m) Q1 f/ C- w        {
( Z1 R$ c* H) z/ W7 h                paramSet.srcBIdx    = 0;) v! X, P/ S' F- Q; z7 l# R
                paramSet.destBIdx   = 1;
% X( T+ u1 W4 v" e$ n5 O4 T. Q( _                paramSet.srcCIdx    = 0;/ O* k" B: {+ b6 W' |) d
                paramSet.destCIdx   = 0;/ N; @8 U- H4 M" u: {  @8 c
                paramSet.aCnt       = PING_PONG_ACNT;
" ~: A% W) _6 t! ~* r                paramSet.bCnt       = PING_PONG_BCNT;$ H3 L, E$ \  W  q" I
                paramSet.cCnt       = PING_PONG_CCNT;2 q) x* }; g, k) a6 q( K
                . o2 F4 Z" t. O" j: ?
                /* For AB-synchronized transfers, BCNTRLD is not used. */
1 K# d+ o% o* X  Z: e3 G! R3 ~                paramSet.bCntReload = PING_PONG_BCNT;
3 s1 v  b( ^0 J& q! G) Q5 n; [* Q! b) ^) k. L
                /* Src in constant mode Dest in INCR modes */
/ Z2 g1 F3 r8 D5 l! U1 b9 t# H9 d, u                paramSet.opt &= 0xFFFFFFFDu;! M8 j" S- A* v9 e9 p/ y$ F% j
                //paramSet.opt &= 0xFFFFFFFCu;
" ~. V& z8 m" N& i" |                ! u1 M  l8 M6 Y) @! L# ]0 @$ S
                /* Program the TCC */
) s: s* l% t1 e/ B                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ s0 |: j1 _. r& ^: t; L- P' P: a) C; J( g# y; |
                /* Enable Intermediate & Final transfer completion interrupt */5 W0 p1 n0 z. G- ?+ B8 h( h8 w
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, _3 o! L; q: u4 G
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);* Z6 |/ l) A. q" `6 @8 f
9 o( L# p* i; m$ T* o: V7 ?: R- k
                /* AB Sync Transfer Mode */- D3 w$ A" i. v' S& I
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
# |! H; ^7 G# f: n9 Y; V               
) e" e2 k: f  s" H# h: p; U                /* Program the source and dest addresses for master DMA channel */
( y/ N( `" `  @+ Z                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);7 G% G& `; T) R2 I$ S8 h$ `2 @$ |' Y& T
                paramSet.destAddr   = (uint32_t)(ping_buffer);" \9 S- h5 S6 B* H2 G8 r/ v
! W  q4 K& E5 i. N
                /* Write to the master DMA channel first. */6 q2 C% A+ Z/ q' q
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
( e0 i4 T# l/ \4 Z9 |& b3 L! U    }       6 d/ [, P" O) t) p5 }: H

+ `# n# G7 L# W, `" f; b        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);7 `4 v7 n9 y2 q
        ( y& m& U, v6 j$ X% r( I
    if(result == EDMA3_DRV_SOK)
& z# Z7 ~) U* E' F' Y    {
' o. C& c6 I# ?$ |9 `            print2arm("edma3 driver init success.",0);
, q0 v1 M3 G4 O! J' j1 c    }
' Q, I6 p/ f9 ~9 {  s1 c9 x) e6 a}" F: p" Z7 M; X$ P% [; O2 o

2 u& O& J4 d; S0 r3 c. \. z- L; Q' R9 h- [  w
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
5 I9 }2 O' s( W6 E' Y) u, p( c$ t3 S
  w$ Y8 _& ?  @; _

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47( V1 J- l. P/ d
每次DMA传输完成后都要再次使能传输

- G7 D/ N  O) ^0 }7 a& J% n原来是这样,我明天去试试,谢谢了!




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