嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
  O& I$ O: g) C5 v#define  PING_PONG_ACNT          14 z  N0 X# k9 x, I* L4 E
#define  PING_PONG_BCNT          8*32*40
$ F* c8 l/ v. f- y0 D//#define  PING_PONG_BCNT       1
- K& k8 n2 c, z! y* s" g  @#define  PING_PONG_CCNT          1, @4 p# v! T$ s+ \0 U
#define  MCASP_BASEADDR          0x01D000008 `& X( x4 ]/ V" A: b
#define  Mcasp_RXEVENTQUE        (0u)( V# o* i4 E% P2 K

! M* [9 p$ D4 D4 `5 h2 w% o/* OPT Field specific defines */; F: A8 {* u+ R$ {4 v) H3 b
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 n; N* M$ B9 A; I, C" J#define OPT_TCC_MASK                        (0x0003F000u)/ k2 Q* j7 F' X. S) ?
#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 E3 B, S+ [" r6 g#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
6 t5 _5 i, I8 _3 r) s1 G5 w! c- `# O#define OPT_TCINTEN_SHIFT                   (0x00000014u)0 \: @: ]- y9 R7 X
9 \, Z% ^  A7 h5 ?4 X. r1 }; E
char ping_buffer[PING_PONG_BCNT];
; N; b, n2 m0 p! Z/ m" M- T4 Mchar pong_buffer[PING_PONG_BCNT];7 J- ?4 E/ P  a# ^$ N% j7 W. o5 D

: _0 l5 z8 V$ o+ C" G* x+ y: x! S- a+ k  ?& _' S/ n0 i
5 \( N. b+ b. _6 J  m# l4 _

+ K" @; C$ Y/ c' Ostatic void ys_edma3_init()
0 {' K# D6 V8 X( ?% [+ ~) y{
4 j- T3 J9 |8 h% M8 |4 [! s4 Z  q- s        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" z. ~+ q  b0 _: B, X$ ^7 a, U        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 Z* Q( v) I+ f$ K( A5 r        EDMA3_DRV_Handle hEdma;9 ^. u" U' s0 i3 v; }
    uint32_t chId   = 0;; ~0 k: D: E) s- |1 R
    uint32_t tcc    = 0;
9 z: g& ], k' r. S/ L/ X5 \4 \; O# }7 P  ^0 e3 G) n: B- i% a" m; L
    print2arm("edma3 driver init...",0);
; E$ J+ {; F2 W) [' @2 {
, i: E) H( y! A        hEdma = edma3init(0,&result);" V# J/ \  N3 ?5 E
        if(hEdma)3 t4 d7 Z# I% A% L5 \
        {' n/ z. U, V* z4 A7 W
                print2arm("edma3init() Passed.",0);& |! T# t8 O% e) Q$ F. i6 x3 v
        }- V0 _+ {- O4 ^8 ]1 X
        else
+ r2 ^9 m' R$ \& s        {
7 \( Z) p3 A& c. Z% R. q$ Q5 }                print2arm("edma3init() Failed.",0);
2 q$ I, S$ ]0 t% N: n7 ~  R  d% z        }" c8 z* W; A) Q) _
       
5 g+ G5 J( E. d/ `/ b/ h        if (result == EDMA3_DRV_SOK)
: \& f5 }( ~# R/ K0 L2 g1 h9 @    {
* l4 u! {* f6 X4 R& x                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
1 n2 V5 g! D& L1 t                                                       (EDMA3_RM_EventQueue)0,
# d3 f( M" L% a- {                                                            &edma3_isr, NULL);8 A/ f* G# n2 y4 R5 F9 i+ C
    }
" {5 H: o& h9 y; z       
. J7 S$ |$ K: p. C& Q8 d- r        if(result == EDMA3_DRV_SOK)+ ?. D: @- V1 r" q
        {8 ^0 z5 a; x- W, b& A# ^
                paramSet.srcBIdx    = 0;
# [- o( i( f, p3 I, M% |* A5 l2 _                paramSet.destBIdx   = 1;3 Y0 b, u# {( d& [: I2 a
                paramSet.srcCIdx    = 0;0 o8 z, H# L/ S9 ]6 i# Z0 I3 f
                paramSet.destCIdx   = 0;
% g) B0 B% q. p4 B' i3 Z                paramSet.aCnt       = PING_PONG_ACNT;
, U' w2 ^9 H9 p7 S$ k- g9 `                paramSet.bCnt       = PING_PONG_BCNT;
7 v, z5 X- h9 y                paramSet.cCnt       = PING_PONG_CCNT;9 x3 F4 y  j/ D% e- A; `
               
4 }( ?/ b' I0 v! u4 X5 l5 X                /* For AB-synchronized transfers, BCNTRLD is not used. */
4 T1 Z8 p% n! v. L4 ^$ b' w                paramSet.bCntReload = PING_PONG_BCNT;; N  ]! @9 K2 c
6 p9 L, ?9 P' j4 T9 H5 \0 o' @- E5 }; x
                /* Src in constant mode Dest in INCR modes */
  W  t6 c2 c+ G( t) g6 ~: m                paramSet.opt &= 0xFFFFFFFDu;
1 Y0 P( j# H, o                //paramSet.opt &= 0xFFFFFFFCu;
" a) b1 n, F; E, Z- T6 K               
2 G8 L" \6 S2 c- [9 C9 r; e. K                /* Program the TCC */4 `* i" s, S) b2 u3 l/ @0 M2 c
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% l: m, a& C9 m6 o; V" Z
# N( J6 _  e4 Y/ Z                /* Enable Intermediate & Final transfer completion interrupt */% ]3 s9 v3 g4 R+ f$ f' F
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
* u- z2 r& Y# R* G* j9 L                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
  t9 V7 ]0 O3 A) C
1 ^7 ^9 S+ H" R. C+ D                /* AB Sync Transfer Mode */9 s% q1 I! w5 y9 B
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);+ t/ W5 U, ^! Z: d
               
& \& {) q" d$ a9 N7 Z, F                /* Program the source and dest addresses for master DMA channel */3 h; g- r( i7 z( H# Y9 l; ^9 _8 Z. p
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
, a  B% A+ |0 `6 k2 B                paramSet.destAddr   = (uint32_t)(ping_buffer);
2 }& \2 g3 B- v' ~* }/ q5 p# {0 u" ?5 Q9 ~8 q
                /* Write to the master DMA channel first. */7 p$ Y. f0 H6 r* z2 P
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" E. ]' S% X! B: {* |) e
    }       & N1 \* Z0 Q. x' \

. w9 f) j+ n4 e9 [6 e        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
1 J% D& A1 ~5 V4 e        5 D: G0 Q7 @/ `$ Y/ Y! G
    if(result == EDMA3_DRV_SOK)
  Z0 S% R/ a( b# Z5 C    {; \2 X% v) _- g3 E
            print2arm("edma3 driver init success.",0);
! `8 j5 X4 y2 Y4 {    } / Z7 n& V! l) h2 U% u
}
! g1 h2 ^- b/ q( @8 p' u( ^: o$ d; ^6 Z. A! F8 P. @

4 q0 t+ ?% a+ fEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。+ g8 A0 G! Q. p3 M

+ @2 i3 e  M) p2 ?" k+ Z- R) G3 W' Y

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 Z9 {2 \9 x8 {每次DMA传输完成后都要再次使能传输
* Z- i* N: N4 M# ?- }" u
原来是这样,我明天去试试,谢谢了!




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