嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, V" p* R+ h4 b) Q% b" [#define  PING_PONG_ACNT          1: d7 ?1 o3 K% ^0 n$ |
#define  PING_PONG_BCNT          8*32*40 1 S( W% \5 G6 W% ^5 R
//#define  PING_PONG_BCNT       1 2 Z/ V- ?% s; A5 o% Z# i" ~/ Q" `/ O
#define  PING_PONG_CCNT          1
6 u& P' R3 q6 J9 o# \#define  MCASP_BASEADDR          0x01D00000, p$ U6 L9 U, a# g. x2 }
#define  Mcasp_RXEVENTQUE        (0u)* r6 T5 n( F9 r0 E
, f# t9 g5 V; d" P- K
/* OPT Field specific defines */
9 D3 v! p$ T* w8 n6 t/ W; ]  d#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
3 l9 z! ?$ _+ b4 S* g! u. R#define OPT_TCC_MASK                        (0x0003F000u)
4 V  ^7 k! a- |; W, f& i0 T% {) J* a#define OPT_TCC_SHIFT                       (0x0000000Cu)7 \/ K( M* v  I3 g7 K$ W
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
; W, f6 D. S3 {9 x#define OPT_TCINTEN_SHIFT                   (0x00000014u)# ^0 l& \. a" B( Z, \* \) y

; a: |/ ~* B2 S. [char ping_buffer[PING_PONG_BCNT];% {) i" \0 D! }" @
char pong_buffer[PING_PONG_BCNT];
1 r# R* C& U4 k/ P( i, a$ J
: {! c. i# ?6 B
# c$ O* J2 q( Z6 ]. ]) M5 g' l0 ~# _% R

. k1 K$ a# ]5 mstatic void ys_edma3_init()
/ o6 R, f' C$ I{( ?  f& c5 H& {& ^" v/ i
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};7 Q$ j. @. m& ^/ b. d: `) f
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;3 b, A% `* {) o. q* \: F
        EDMA3_DRV_Handle hEdma;8 N) ]7 F4 L  Z  n& _9 L) Y
    uint32_t chId   = 0;6 {7 ?: R+ h% S/ u
    uint32_t tcc    = 0;
& i3 D- H7 }6 y4 h+ C( S6 O, o
8 X& z' a( F6 N" e+ R* p& s    print2arm("edma3 driver init...",0);# a' b# e+ |8 q

; t. y& D2 O2 z% k5 i  L6 G4 U* D% C        hEdma = edma3init(0,&result);* U- L% v# }  O: J" E
        if(hEdma)
3 \; H. D% _: C& M        {, A0 l8 N0 b9 S+ j' }$ w0 _
                print2arm("edma3init() Passed.",0);
! [; r- J' \7 c# B  s        }3 ~' C9 Y- `" p
        else, j; D5 @/ q9 }' }) q/ c2 `
        {+ W4 E; E# r; ]% P9 t+ h) T7 L
                print2arm("edma3init() Failed.",0);2 b, B; n$ l3 L" O6 S! @8 M
        }; q7 p1 }; I" ~
       
" `, y- w( u7 {' P        if (result == EDMA3_DRV_SOK)
5 R1 g/ c8 q7 \4 X  g8 e    {! q+ I, Y5 g, l- F3 Z: P8 [) L
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,, }7 W+ C3 [9 |# k
                                                       (EDMA3_RM_EventQueue)0,
9 V4 l' {2 u& Q2 _# `$ C  }: J3 L8 X                                                            &edma3_isr, NULL);
4 G. ~1 u. ~" j6 Z0 Y" f    }
+ Q, r" D+ q- u& A        0 A. r: v0 ?/ G# m" ~- S* ^
        if(result == EDMA3_DRV_SOK)- d; c+ x) j3 P& c. D$ b
        {4 O- Z6 z, G$ s; k- M8 f6 Z
                paramSet.srcBIdx    = 0;% d2 `, X# F7 R6 v' w5 p- b) ^
                paramSet.destBIdx   = 1;
+ m8 A4 U# Y* I6 i' E                paramSet.srcCIdx    = 0;3 {. m# @4 p9 b# B% b
                paramSet.destCIdx   = 0;
, F8 S* u0 o' D                paramSet.aCnt       = PING_PONG_ACNT;  f' N3 E: g+ l
                paramSet.bCnt       = PING_PONG_BCNT;
, Q5 Z" v# H7 O1 t                paramSet.cCnt       = PING_PONG_CCNT;
& I" Z# n, ]9 l) E                2 s" ~% X$ J' ]- A
                /* For AB-synchronized transfers, BCNTRLD is not used. */
! {9 Y7 H' S0 e. W  Q                paramSet.bCntReload = PING_PONG_BCNT;
6 I' E+ M: p' A: p
0 Q; \! ^. |" b4 Y                /* Src in constant mode Dest in INCR modes */
3 N: ]! U& L$ O6 o+ r                paramSet.opt &= 0xFFFFFFFDu;! q9 C4 ^/ d0 Z: U# {
                //paramSet.opt &= 0xFFFFFFFCu;
. t3 f% K, E! w# {8 M0 z                3 s! @: F  ?  _. o( I3 R
                /* Program the TCC */* C7 d+ o2 U2 `" N
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);0 u+ i0 u5 V: C$ }

% w; Q1 [$ Q$ \- h                /* Enable Intermediate & Final transfer completion interrupt */
) y3 L- a. H1 F* L4 q! N6 S7 q, \                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 D+ O! m+ w* y! ~: @
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) w# _4 ~1 ^" T3 M' g' W' N. b6 O1 y
                /* AB Sync Transfer Mode */! _( V& T9 y* e% F$ d$ w3 w2 Y9 T
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
5 Q6 V, Y: S* ]& U) D                ! H" {( A# S# j6 u
                /* Program the source and dest addresses for master DMA channel */3 q+ W7 d! d" T1 V4 t9 a
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
9 X: l( O: J: \7 o; t                paramSet.destAddr   = (uint32_t)(ping_buffer);
0 Z6 j. O# \; _+ @/ t' U. s, P8 t3 B. C0 K
                /* Write to the master DMA channel first. */" j7 d  a- d* p; t
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
' @( p& |9 |0 U( [7 v    }      
/ s- }$ I1 T" ]. a  C& I4 x" g
" V' `3 s+ X7 p) Z& K) r; b. ~2 H  i        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);- x) H* T' }; K1 t* [9 m
        1 p+ ]/ j  n  Z0 y& P
    if(result == EDMA3_DRV_SOK)
, m, X' W7 r% S1 D% w$ e    {9 N( {3 B* j. O2 m9 k- p% t1 D
            print2arm("edma3 driver init success.",0);' ^5 ]9 n1 N) l" N/ r
    }
! q5 m. d0 s' X3 h+ j9 c}+ Y# P% e  D' Z
  J% l, m' A# ^3 ^

5 Y- a1 v/ q6 X. Z0 x6 p4 LEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。6 r$ @- i2 I- l

/ |2 o# `: ?& [* t7 d4 v' h! o4 D" y. ^; o" h

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* ^# i% y8 n* K% a1 b每次DMA传输完成后都要再次使能传输
/ T  ]8 D9 l6 g7 K) x* h' m4 P
原来是这样,我明天去试试,谢谢了!




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