嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; y7 V9 E2 R% i, ^, C
#define  PING_PONG_ACNT          16 i( p. f0 ?" O2 c
#define  PING_PONG_BCNT          8*32*40
, I  k2 `( b/ V, {2 s6 D//#define  PING_PONG_BCNT       1
# o/ a3 T5 U1 H  T! I: u#define  PING_PONG_CCNT          1! n# V8 |- D- v! h+ s
#define  MCASP_BASEADDR          0x01D000006 @' r! @7 I. Q
#define  Mcasp_RXEVENTQUE        (0u)
$ X  R4 t" K; x
! [  l- _: X. k0 S  Q/* OPT Field specific defines */$ l/ u8 D$ B8 t4 f+ w  @2 i6 m1 t5 I1 v
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
% K* L( {4 E8 R% G* ?' i9 _#define OPT_TCC_MASK                        (0x0003F000u)6 }3 ~/ |2 _, ?1 x
#define OPT_TCC_SHIFT                       (0x0000000Cu)
8 {- x" r/ Y" p$ {; V#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
! ~7 U% f' V1 `2 \#define OPT_TCINTEN_SHIFT                   (0x00000014u)
2 O' n# |/ X* L% H1 x6 c9 ?3 i1 c1 d: Y
char ping_buffer[PING_PONG_BCNT];! i7 X5 ^+ m* d6 [
char pong_buffer[PING_PONG_BCNT];1 x- y, e6 H2 r/ w1 V% H
( l" J; r  \% n# c! @- d5 m/ z0 H

( {% t$ l$ X" ]( ?; r7 `5 e
4 {! Z$ I' W+ c, [
3 t4 }* X- m* Y( Q  D* ]static void ys_edma3_init()2 o+ H# {" p1 @( r4 y# c( g1 o1 c: u2 T
{' m7 `0 ^9 P. q+ X% B0 T7 A( k( z
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& s% D7 I2 y! n' R% O3 c5 ]        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
9 G. R8 O& V$ W  o        EDMA3_DRV_Handle hEdma;
( o7 I4 \( E9 L  W    uint32_t chId   = 0;, N8 _5 z4 b. {
    uint32_t tcc    = 0;
' B+ I+ M, c- }% ?! |* \$ N; [9 Z8 E6 j
    print2arm("edma3 driver init...",0);
4 ]2 q  y, a( t, l# K7 x- _( Q7 Z% d6 K2 w! T) R
        hEdma = edma3init(0,&result);/ y$ Y, m- n. n9 y% d! V* N
        if(hEdma)5 G5 D/ {. ~; Y
        {$ E; P: W- N, I
                print2arm("edma3init() Passed.",0);5 k2 Y, K4 H0 ]( r# U
        }
, Z( Y7 ?* y! ?! b4 w" Y        else: V" t. `! Q$ n
        {1 K) G5 R% z4 _7 u9 _% j
                print2arm("edma3init() Failed.",0);+ a1 f% p% m8 U1 |8 W$ M2 I
        }
7 w0 _3 t2 ]) d  V) ~$ \       
$ M; g( x& j) n        if (result == EDMA3_DRV_SOK)6 l) c8 }! L9 ^8 d; Z
    {
( z$ {% O2 I: k5 |" A; z) l                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& ^* o5 f- D/ h+ K% K8 L                                                       (EDMA3_RM_EventQueue)0,
5 ]* I4 ^% C& d/ n+ F* @4 h  d7 i                                                            &edma3_isr, NULL);/ P! |6 F' s2 X; N8 @* M0 ^
    }9 c/ l# [7 v0 a" X/ j. Q2 r
        # {* b! T, K- c' v
        if(result == EDMA3_DRV_SOK): N. q2 @( J# U
        {
: }, Z- j5 P' k+ Y6 ^& q+ M" x2 ^                paramSet.srcBIdx    = 0;
- H) Z: u! F) u- I/ U                paramSet.destBIdx   = 1;
$ e: n, v+ l, D                paramSet.srcCIdx    = 0;
  T; B5 @/ O" |                paramSet.destCIdx   = 0;9 i% a+ t& w3 i' H
                paramSet.aCnt       = PING_PONG_ACNT;3 \9 ~/ H0 c6 n( j% @3 d
                paramSet.bCnt       = PING_PONG_BCNT;
8 o7 `7 W/ {6 G8 F" {& |                paramSet.cCnt       = PING_PONG_CCNT;! x- L! p: |. M5 I* W, ?
               
3 I6 S$ R) ]9 b8 b) i                /* For AB-synchronized transfers, BCNTRLD is not used. */
$ m! i- c- S- G& c                paramSet.bCntReload = PING_PONG_BCNT;
  E3 l8 v9 D: B! W% w: g$ Y3 E$ C2 N
                /* Src in constant mode Dest in INCR modes */2 w  t( q4 Z% T: b
                paramSet.opt &= 0xFFFFFFFDu;
; R0 l1 ?  U: M5 r) {                //paramSet.opt &= 0xFFFFFFFCu;
( f5 ?+ @) c. Y6 `% A               
, i: f' T- h) M4 K2 p0 W% G7 ?  S                /* Program the TCC */- C$ A2 X! w( q2 e" F+ Q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ H( ^$ O; n; y- p* ]5 o
# e9 Z$ b) w+ M/ R9 T4 r                /* Enable Intermediate & Final transfer completion interrupt */
' M$ T: r3 o1 s                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% _# W) w, t7 F8 \1 a9 ]6 x4 i                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);4 J! p" e5 \3 P: s% `

: k5 d( r- x2 b: r                /* AB Sync Transfer Mode */
; I7 O' w2 q2 h0 J# r' ~2 }                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% t- \8 y; A/ s4 ?, c               
. y, K6 ?6 s" m! s& w                /* Program the source and dest addresses for master DMA channel */- ^  U/ Q. C5 }: J9 r# Y( |) i4 w
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);% `% n7 ^  e9 C
                paramSet.destAddr   = (uint32_t)(ping_buffer);
( M9 B( d" m" i
1 P/ c: j1 w0 x+ f                /* Write to the master DMA channel first. */
; W, d: A/ K, C% c, }6 w                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% K2 j( [) y' o3 N& I$ U4 b/ d
    }       ) w* s% {% K% f
( i4 C- |* f/ }3 G" y$ R
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
8 z; T3 [9 h! [  l6 u  j7 E# y       
+ R1 y9 u. ^! J$ F. c8 v    if(result == EDMA3_DRV_SOK)
/ g7 S+ A# q, k( @+ M& k! B    {# ^; D4 D# }+ n
            print2arm("edma3 driver init success.",0);; _: p- L: @+ Q/ J
    } ' \. }& ^  a  V! v9 ]
}" D' O) D# I2 H9 K$ ~) |

. s, [) h$ K: }1 t, ]+ S  n! y7 p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。" }/ B# u# O# [

6 p4 v& X+ c" v- s$ c
; S4 W# ?8 x6 }  u3 f
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:477 {( j" H, m9 d! r  w' o! l2 N
每次DMA传输完成后都要再次使能传输

/ R* S; J) O( ?( V原来是这样,我明天去试试,谢谢了!




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