嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:2 u2 N& ?: k, Q
#define  PING_PONG_ACNT          1+ \& d& U8 j# y, n$ h& D
#define  PING_PONG_BCNT          8*32*40
9 D" H* u) T0 P9 ^6 u! T//#define  PING_PONG_BCNT       1
9 r/ Q0 Y2 ]) s#define  PING_PONG_CCNT          1/ f1 A3 D3 T# ]' d  F
#define  MCASP_BASEADDR          0x01D00000* g! b% {0 l& L$ Y
#define  Mcasp_RXEVENTQUE        (0u)  I$ Y) F; z7 F

0 E- X+ G! J- @! c/* OPT Field specific defines */$ Z1 T" c! [. z' p" t" c
#define OPT_SYNCDIM_SHIFT                   (0x00000002u); g6 `1 Z0 y0 b
#define OPT_TCC_MASK                        (0x0003F000u)
/ Z& k* f+ k  y1 g( h( S#define OPT_TCC_SHIFT                       (0x0000000Cu)) P& K. F) Q4 ?7 r8 G4 b. f8 ^
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
$ ?2 F2 L# D* l: M+ P#define OPT_TCINTEN_SHIFT                   (0x00000014u)
) V4 h) A3 v4 t8 x8 D+ b% }5 _; f/ e  K* c, M/ e, a9 q
char ping_buffer[PING_PONG_BCNT];
" I7 }% L  Q" ochar pong_buffer[PING_PONG_BCNT];
* a' w, p# n: T1 n9 q
+ A. k) o& ?9 J5 s( [) C6 q% A
* W; s* Z5 f4 }: R- J9 Y3 S" U
  f& G% s7 O0 w6 [( A5 g4 e
& l7 a. L- D! O/ m8 v1 f$ d9 Sstatic void ys_edma3_init()
# q4 `( R9 F4 o$ n8 f+ p! b) G+ O3 ?{
3 V0 T: G) N/ T- B- f" z        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};( D% m3 {' g( M: d
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 J. O, v7 `) s* R9 T& |2 p! T        EDMA3_DRV_Handle hEdma;6 z, J. D- e$ ?  p$ y6 j6 Q8 o
    uint32_t chId   = 0;
2 u6 G  x2 A8 f, O& V    uint32_t tcc    = 0;5 P8 L6 J' A) m. ~- l

- y* ?3 E7 a4 u! U  Z9 T) C. D    print2arm("edma3 driver init...",0);
8 {! D6 a# J' o$ V1 ~" g# n5 L. k' S% A* E+ J9 a
        hEdma = edma3init(0,&result);
- M2 e+ O7 `3 [+ ?+ J' @. R2 q        if(hEdma)5 h9 E1 p9 a  y9 e
        {
& ^3 e8 ^( J1 ]! N; T! }) U                print2arm("edma3init() Passed.",0);3 S7 \: i; H+ Y/ s" }; G
        }
( ~" E  c4 y" f7 c$ L! v        else
/ r+ a* r' a& u+ o: r, l& l( a        {" x% J" m/ v& F7 J$ X1 o  t
                print2arm("edma3init() Failed.",0);# u- T  v' q, x4 R, v
        }) m: [! r: d0 Y% _( |
        , \" u  a( j: M" M
        if (result == EDMA3_DRV_SOK)( `$ D0 V) P0 L
    {- s- ?" L+ _3 G/ m; [
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,; e: Y- b. H$ d- n2 ^9 X% W7 O
                                                       (EDMA3_RM_EventQueue)0,
7 n2 p9 X' z( W, v4 e6 W                                                            &edma3_isr, NULL);% H. ^+ M9 S; c0 L1 q2 q
    }
8 R: ]( o+ ?( y1 J2 A       
9 Q0 r/ e7 a" j% X6 A1 A        if(result == EDMA3_DRV_SOK)  {& H; i( e. s2 @) V
        {
$ X' D# @( g+ _, H                paramSet.srcBIdx    = 0;) D0 @: ]$ h( X) Y# m- c
                paramSet.destBIdx   = 1;
; k* u8 j% a4 A1 X7 o' i# \                paramSet.srcCIdx    = 0;
, I7 @" F) @) E                paramSet.destCIdx   = 0;
- T- F0 i8 j6 U. Y9 t* i                paramSet.aCnt       = PING_PONG_ACNT;
" y8 l) ]5 t+ {                paramSet.bCnt       = PING_PONG_BCNT;
- \! E5 P" b. |( `8 b1 h/ N7 H                paramSet.cCnt       = PING_PONG_CCNT;! l: a+ E; j0 d1 J( p/ X
                # t+ |1 {0 [0 |+ J7 `
                /* For AB-synchronized transfers, BCNTRLD is not used. */
- Z( y- P: r. w5 F  g; c                paramSet.bCntReload = PING_PONG_BCNT;! O- |, w0 A! L# ]6 Y& J9 p

# N; M  A$ w# t                /* Src in constant mode Dest in INCR modes */+ l; X" {5 O& b0 H) j' @1 [
                paramSet.opt &= 0xFFFFFFFDu;0 K8 i0 H; C+ w
                //paramSet.opt &= 0xFFFFFFFCu;
7 l- m# ~; o9 B               
* d" f9 H+ |) S& l" ]& u' {                /* Program the TCC */
9 ?8 u6 O' T; X' S                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);2 _5 B' I7 L; C2 n5 d' X- x

6 `$ l- q) f  P8 B; _' M( G1 {                /* Enable Intermediate & Final transfer completion interrupt */& V2 ?5 n2 o% A! N
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);# C; ~* M7 I- C1 S. p
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 p1 H4 O9 a  V$ `$ V8 ^
; b; h* }. @% i- u2 K
                /* AB Sync Transfer Mode */+ o0 j1 v2 I3 _" l$ u0 v
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);) _/ T& W9 u7 u+ G) }
               
  y% W% I6 h* m7 X                /* Program the source and dest addresses for master DMA channel */
* m% ~/ ^. f9 p( T                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
0 F/ \! p) N9 D9 M" p7 R                paramSet.destAddr   = (uint32_t)(ping_buffer);
  ~$ C5 y5 ]" S2 N' I9 h8 o
  W. h" z9 ~' L! ~                /* Write to the master DMA channel first. */
" l" z) ]; P+ |6 u4 k                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);" K' d; H6 z! Q- G0 L- ?
    }       $ o2 j/ L" l! e2 C( i4 T7 w

3 I6 b4 Z! [- v* j        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 y) w' w7 X8 [        % B, @& Z2 u* V$ i8 L
    if(result == EDMA3_DRV_SOK)
' g9 \& R/ ~/ D# p5 j    {3 }7 P3 ~* L8 y" T7 e9 L
            print2arm("edma3 driver init success.",0);$ b( |  I& J+ a
    } - i8 c: a  B2 g7 d% X( O' j
}5 w- W  {! K" I4 y, o6 h

6 f+ O2 g/ w/ E; k7 _* L7 ~! z, k4 E) d) p0 q  Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% z6 e" X, J" f# x
. w# \- q' ~& M* ^9 `! |1 r
5 I1 p8 p- ^% v/ ]# v
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! _4 S' H5 m0 J每次DMA传输完成后都要再次使能传输
- c! G9 m, l; y! k7 R
原来是这样,我明天去试试,谢谢了!




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