嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:; U2 j7 w# T9 S
#define  PING_PONG_ACNT          1# B3 x+ M$ |! q3 p8 z, ?
#define  PING_PONG_BCNT          8*32*40 ' L  P: z& K1 P" A3 ~8 m
//#define  PING_PONG_BCNT       1 1 M5 T$ o, a3 F8 |% U. L
#define  PING_PONG_CCNT          1
. ^2 r. Q, W- h. z. q1 ~#define  MCASP_BASEADDR          0x01D00000
% H# U1 `  l. `4 ?' G#define  Mcasp_RXEVENTQUE        (0u)0 e: `9 D" ?- H$ E1 g/ L
  i0 \- ]0 d  A! Y" q+ X
/* OPT Field specific defines */
  j5 z! \! ^! X% F% k#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' }  H9 j  N, B#define OPT_TCC_MASK                        (0x0003F000u)# ]2 E; r% E$ x5 G* D
#define OPT_TCC_SHIFT                       (0x0000000Cu): D6 _* }5 I" n4 Z1 Z7 b
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)  v; D5 G2 Y6 ~. x
#define OPT_TCINTEN_SHIFT                   (0x00000014u)( g- l4 r, H. O+ V5 t8 E

9 o; E# g3 q, u. ]+ A7 m- rchar ping_buffer[PING_PONG_BCNT];0 x/ k0 s$ |: B; h) P' D
char pong_buffer[PING_PONG_BCNT];
: H( X3 z( z" l* m" O' i8 a% L) d5 `0 d* I1 G- I9 w1 Z# A' L
8 B. \+ t: d: H6 F1 t" H' w/ o

+ }) o% p3 P) B  {( D) Y9 E$ T9 z: T
4 n! i/ x/ Z3 H; d: Tstatic void ys_edma3_init()+ I. @0 `" h9 `8 e$ ?/ O/ {
{0 l5 n0 j( O5 l% A" j# _8 z; N
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};/ R: ]8 i; k+ ?/ _! w/ q) H; @
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 T0 c# l% O. y        EDMA3_DRV_Handle hEdma;
# }) c4 a. z& m, [1 t% F! I    uint32_t chId   = 0;
, z  z2 l* f. V9 h$ c1 i$ c" o! {    uint32_t tcc    = 0;; T  N8 H" Q6 H) k

% C2 ~0 j, p4 R" |- l! K8 q    print2arm("edma3 driver init...",0);
4 R' E# ]$ Z: K3 S* ?' X6 l
4 |3 @8 }# F5 E8 ?" o5 g. r# _  E1 A        hEdma = edma3init(0,&result);' K* q( A' ?! X! |
        if(hEdma)
, O# X0 Z+ L5 u. R% J5 c        {
, B( t6 K# @* _) ]                print2arm("edma3init() Passed.",0);! H) ~0 S9 k3 F/ A' ^
        }
, f* j5 k4 f6 I( @0 ?6 E! `& ~        else8 W& {: m' h% O4 u& z3 [
        {
! H: y7 O$ m0 q( a7 c6 p* q4 G                print2arm("edma3init() Failed.",0);- E2 U0 D1 K# }" p3 t7 }
        }7 X; ?) u) ^7 f5 Q, ?
       
9 D( c4 V4 c( J& D; \: C        if (result == EDMA3_DRV_SOK)# S. J8 A* j' A5 z$ D7 M$ D
    {
/ \. j9 g: i8 e8 H+ K- S# M                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
  D* z# I1 k$ E, ?& r                                                       (EDMA3_RM_EventQueue)0,
3 }$ {% {* }) r) L3 @                                                            &edma3_isr, NULL);1 C& x4 t0 b3 K( ?1 R
    }; L) l9 ^9 u: K! P" I) b; ~
        2 `2 t+ N0 c' X$ |
        if(result == EDMA3_DRV_SOK)
: R$ Z+ B# {; R        {: t! d% v( a7 r) W8 }! p
                paramSet.srcBIdx    = 0;
! W5 g4 F% N6 h/ ^) c5 q                paramSet.destBIdx   = 1;
% c, r( a: |, X. x                paramSet.srcCIdx    = 0;8 Y& y4 ?# B! k5 k8 P
                paramSet.destCIdx   = 0;( S' u, G& Z! @# d
                paramSet.aCnt       = PING_PONG_ACNT;5 ?) a  j5 F' r4 @
                paramSet.bCnt       = PING_PONG_BCNT;0 j& f& u' e& F2 K+ K: G, h  e
                paramSet.cCnt       = PING_PONG_CCNT;
/ r8 v$ `" Z* j9 B4 d8 ]) ]               
2 n1 [, D3 a# F                /* For AB-synchronized transfers, BCNTRLD is not used. */3 k1 w( Z8 x% C3 p4 @( u% C# k  ?, n
                paramSet.bCntReload = PING_PONG_BCNT;! o7 e' Q" A' c8 f

6 `) |3 s4 D8 B+ U! H3 E% O                /* Src in constant mode Dest in INCR modes */* T0 F: x# t9 y+ a! ^( y
                paramSet.opt &= 0xFFFFFFFDu;( P5 F' _! y# S
                //paramSet.opt &= 0xFFFFFFFCu;7 x2 v+ ^; w* G0 M5 j1 Y  o1 F
               
! g5 |' W9 k1 U; x9 v$ s                /* Program the TCC *// F+ k' ^- z/ J$ C  m( Y- ?5 t
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
/ f: q( Y& u: n# N9 l5 y) j
: ]: x9 \( s4 U( I7 i. P. D                /* Enable Intermediate & Final transfer completion interrupt */3 }  Q6 u3 `* E/ C1 G) b
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);; T1 z, B3 ]7 z. L- p6 _6 R5 M/ n
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 Q! e# d3 y0 B* {) M3 c. S! `0 L6 \) M1 x+ K8 R' W% i5 A  q
                /* AB Sync Transfer Mode *// f, c" r# |+ @3 L
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);! N8 l( w, M; ^& C
                1 O1 c5 n7 B# v* r
                /* Program the source and dest addresses for master DMA channel */" P7 W& |; M5 b) J" e, `6 a
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
+ `/ g* O5 B$ u% N                paramSet.destAddr   = (uint32_t)(ping_buffer);
1 G8 n5 y( }7 b" }  }# I7 Z+ C
9 V7 O) T* \4 J. w                /* Write to the master DMA channel first. */8 }* g' r( l+ d: I6 Y
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
! u$ i  U0 l4 ~8 Q7 a) v% B1 N    }      
) z6 B! ]' @  p, f* [( H9 E' @! W( ~: g. ?5 i
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 u' Y5 v7 |. d9 A( B. S$ y       
- R4 ]% [7 ^" C. b    if(result == EDMA3_DRV_SOK)
* z# _1 T" D+ W2 [6 N    {
+ \  S# i. W/ k            print2arm("edma3 driver init success.",0);
& K( s! y. q# F; H4 K; I/ W1 k% [    } ) C5 B4 k7 P0 h$ C4 }8 _, U
}: p6 b/ Y& Q! H

% O* N% K7 A: c1 f
# ^6 }) q- L6 ~& s# ]$ j8 T/ eEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。6 c0 Z4 l! \+ a& S
4 o: |4 @# U& i! P2 s

- Y1 J4 l: S, I8 R. [1 V% b3 Q
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47, V! `8 V3 L; f+ n, q% z
每次DMA传输完成后都要再次使能传输
1 a& J8 F& z$ S& z) d
原来是这样,我明天去试试,谢谢了!




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