嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
+ v5 X5 {8 j7 B, y4 T#define  PING_PONG_ACNT          1& V" U0 k% d" }7 B6 G% a$ v
#define  PING_PONG_BCNT          8*32*40
) ]" y1 W/ O( l6 I. f//#define  PING_PONG_BCNT       1
: j" y$ p: h. a! v  @) I#define  PING_PONG_CCNT          10 j& y; \6 D0 u6 T1 q* _
#define  MCASP_BASEADDR          0x01D00000  D/ F( [! M( e
#define  Mcasp_RXEVENTQUE        (0u)
, t9 q' O( m& Q( A" @( W% Q
! S8 F2 Z4 D; b: t- p- j6 n/* OPT Field specific defines */
- ~! C+ l+ A' u9 B0 w- n#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
& I4 X/ m  r7 p0 _# p* X0 B, B#define OPT_TCC_MASK                        (0x0003F000u)
8 p6 h0 P6 R( m0 s& P( u1 U#define OPT_TCC_SHIFT                       (0x0000000Cu)
- M8 ~+ D& y: a) q3 Y#define OPT_ITCINTEN_SHIFT                  (0x00000015u)3 a+ d, x5 d- e( M2 U4 o- ?
#define OPT_TCINTEN_SHIFT                   (0x00000014u)9 W4 }+ O& A% m/ |( O( t; }
: B/ E( _" y  M
char ping_buffer[PING_PONG_BCNT];9 \7 z6 [7 {3 t' D: g+ T
char pong_buffer[PING_PONG_BCNT];% }! x8 ?3 W, X8 E) a
! H1 |& g9 M1 j- [9 q

' j  e( _, J( x- f/ M* ?/ M7 F) e0 b8 ]
) m& u5 l5 |5 l+ B+ d- w  R
static void ys_edma3_init()
/ `7 d9 ]# {" g* a{$ p1 c$ A' R7 B, H. o
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};' A1 [, a8 Y5 Y
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 v, d" ~; n8 @# D! i7 g        EDMA3_DRV_Handle hEdma;
$ o& W6 ]! u% |$ c& L; p    uint32_t chId   = 0;
2 b# Y. M9 v9 F+ m8 E/ N  O3 Y. l; f    uint32_t tcc    = 0;0 A4 E- A4 t' s( L5 X
& W: k1 }% n9 I
    print2arm("edma3 driver init...",0);/ [. i' X2 L; }2 P. r; r

+ q) U  |8 J! Q        hEdma = edma3init(0,&result);
8 S. G- L8 F2 z" N0 i& e. z        if(hEdma)7 X- w5 [! F* A! b
        {* f; B& X7 w6 L9 p! ?
                print2arm("edma3init() Passed.",0);) g' e7 B7 R) u* H' j
        }! u$ E+ J! t* {& T- T' Y
        else
. @5 n  i; A! g, j' o) X( J        {
  U/ E7 {* L* g" I% Q% V                print2arm("edma3init() Failed.",0);
% f* M7 r5 t! t6 T# [# J        }. [; e' V/ [6 O6 Z
       
4 n  t. O% e6 F+ ^: [) W  g        if (result == EDMA3_DRV_SOK)
5 E8 z5 P* |* k* p& ~5 H, D- j    {& j4 j5 M+ P! e( ?8 i7 R
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
4 x: D- k  U' {1 l* y4 S  |* r$ P& V                                                       (EDMA3_RM_EventQueue)0,
/ _' n( P9 H, h) L' f                                                            &edma3_isr, NULL);2 |, Q) ~! r" x# g$ K* C$ [
    }5 n6 m/ r, D. s" n
       
8 f: o% l2 R8 ]5 F, Y. s+ Y+ X        if(result == EDMA3_DRV_SOK)# a) k: G8 i4 `/ L- O
        {/ n* z8 {0 _' `" [7 m6 M
                paramSet.srcBIdx    = 0;
$ F: ~. i* O* {4 x' O/ E( w                paramSet.destBIdx   = 1;9 Z& s6 N8 Q' x4 |- A* J
                paramSet.srcCIdx    = 0;/ o% s$ _7 b" b0 n- m/ x5 S
                paramSet.destCIdx   = 0;
# J7 C( z( c7 i$ I3 e                paramSet.aCnt       = PING_PONG_ACNT;
0 V4 X& |, x2 I4 E                paramSet.bCnt       = PING_PONG_BCNT;$ \( j3 u4 i1 Q0 U
                paramSet.cCnt       = PING_PONG_CCNT;
- o8 c; o7 l. F/ s7 ^3 g/ E2 {               
7 a0 n* |5 u# ~2 N6 h( W; ~5 [                /* For AB-synchronized transfers, BCNTRLD is not used. */
4 a, Z, e9 b# Q! M, s3 q8 e                paramSet.bCntReload = PING_PONG_BCNT;# ~! @5 Q) L% D3 h+ |" K. O

* |1 r. f/ _' R: P2 e7 Z                /* Src in constant mode Dest in INCR modes */
0 X5 L% A& A9 H                paramSet.opt &= 0xFFFFFFFDu;5 B% v% E, B! _+ t5 y# ~, }. M
                //paramSet.opt &= 0xFFFFFFFCu;3 d2 H- z% W9 \5 S* g
               
9 N2 t' C. }2 D; s6 p8 x                /* Program the TCC */' O5 ~  g  X  ?1 O( S) j
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);% M* c' m4 ~2 }3 F6 O3 ]
: W9 @3 _. c0 N0 C. M5 Z! b1 e
                /* Enable Intermediate & Final transfer completion interrupt */
7 P8 ]& B0 O; G  W                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
) }5 E# B- i% B7 j                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
9 g5 B! j, i3 A( U) K2 A5 V! i+ s2 O1 t. A) [: o' W. u7 ~
                /* AB Sync Transfer Mode */% @  U- B) n( s- n
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 ^' S9 M0 h. _2 j. f
               
1 z- I7 K7 @  \9 z                /* Program the source and dest addresses for master DMA channel */6 S8 i; B. K8 H! Y4 W. F. T5 L
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);$ M' r3 h( Z# r' @! z' B
                paramSet.destAddr   = (uint32_t)(ping_buffer);9 p" f8 y- E! U9 d) F  [: F$ T
* [% l0 _7 C# I- f3 ]
                /* Write to the master DMA channel first. */
& q3 K* k0 e$ S& `( F$ Y                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);. O1 L* b) d4 K. \9 ]
    }       # N* b5 w! E1 a6 U9 q$ [9 a: l7 f

  ?: G7 ^, x2 ^0 M8 c) T$ r        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ f' e- i) q2 A( L" \" |4 C8 p       
* C/ M; |. _: q* i2 R2 I" @# P    if(result == EDMA3_DRV_SOK) - ]0 k1 E3 }! {
    {) y, w, Y; R4 I5 F) E+ A
            print2arm("edma3 driver init success.",0);% B+ w7 G1 S: w( `. K* k) {
    } ' G1 V6 m- z8 O; `2 z
}
3 l, S4 O) E" K9 }3 H" d- N
" ?( ^& G% Z8 b* Y6 o1 z
5 u3 W# I( n; F) Q7 hEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。& N2 p6 F3 {! X0 u/ J' D6 h
5 I  N* l. j1 H: D/ a7 W- F0 p" B4 L

$ b* O* T( _8 Y- L7 ]+ _
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47! ]; t/ k: t5 h; u$ W+ L2 z
每次DMA传输完成后都要再次使能传输
7 |' f, \8 ^5 s. H
原来是这样,我明天去试试,谢谢了!




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