嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 u0 ]3 d1 N2 u3 w, f- g#define  PING_PONG_ACNT          1
" P; c0 p5 t# U) z4 q#define  PING_PONG_BCNT          8*32*40 7 b1 a8 g3 V# I5 ^5 O
//#define  PING_PONG_BCNT       1 & ]. n/ Z% p! _' j
#define  PING_PONG_CCNT          1
! K+ h9 H' @, {2 R6 A, _#define  MCASP_BASEADDR          0x01D00000! O( f% e5 U2 |! z, T2 R$ M# q1 x
#define  Mcasp_RXEVENTQUE        (0u)
3 V' Z% M* E: M2 p5 |( O
9 Y! A- y, R* m' Q  {+ e, v: Z2 g/* OPT Field specific defines */2 H& n& E1 ~5 d# L6 S% b
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)* ]$ x+ }# X' H) f% m9 {9 b
#define OPT_TCC_MASK                        (0x0003F000u), x8 N& t9 V0 w! H: Y$ L& C- I6 {
#define OPT_TCC_SHIFT                       (0x0000000Cu)
  K( |" i" X- u9 q# i" L#define OPT_ITCINTEN_SHIFT                  (0x00000015u)/ w& ?2 {' C# _$ k9 u0 ?! a
#define OPT_TCINTEN_SHIFT                   (0x00000014u)) _1 q+ h1 w  B4 [4 I

% T) Y/ H$ C) L( H! a( Dchar ping_buffer[PING_PONG_BCNT];! V( I4 m: r3 [: K2 b/ [
char pong_buffer[PING_PONG_BCNT];
. a  `& P, P; w- j
4 M' K3 ~5 A- I) v- O1 D$ j# h6 z8 j! n. _! D3 n6 n  v

3 l( ]1 K5 p0 A1 D! |0 a0 I3 o% p' N, j, t$ @
static void ys_edma3_init()  U& X9 ~8 f; O& ~; P+ E1 S; f
{& r. `0 x" z1 {+ F6 I7 s' m/ ?
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- r: j. l1 X3 P. m# }+ E; B
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;: e/ l3 ?- s2 z6 m7 \3 a1 F
        EDMA3_DRV_Handle hEdma;
) ?# }: \/ J0 \  _8 [    uint32_t chId   = 0;4 k2 \5 h3 `- M& `! E' H
    uint32_t tcc    = 0;
* `7 J0 i' c5 J6 x' o- R# G
4 o' o$ Y: d$ x' z    print2arm("edma3 driver init...",0);
" V. b2 J; u# F$ F0 [4 A' n1 o* ~  N6 M, w4 v
        hEdma = edma3init(0,&result);
* H# O+ N9 i4 v8 u9 [3 a* y4 l: [( i        if(hEdma)) I* I( L' ~# r8 @  D
        {; a& K. P7 `6 N2 \( c& }
                print2arm("edma3init() Passed.",0);( y: {" n0 B% h9 X
        }2 D! D0 s4 C( d7 F0 {& `" _
        else
; g- d- t. q3 r        {
: J1 j7 j+ t: J2 b% v                print2arm("edma3init() Failed.",0);
  M5 h6 F. _4 r+ D2 u( Q6 g* A7 C        }
8 S* R% ?6 d" L; o2 O$ P" j, h       
3 g( i; {4 s8 p( ?8 o& p+ ~% e        if (result == EDMA3_DRV_SOK)
  H: u7 E( B( S9 {    {
7 F$ G0 R* [! D9 ~- `: m                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! [* q) s" g% _# Y  |                                                       (EDMA3_RM_EventQueue)0,; D( M  G3 R% V0 i# q/ i
                                                            &edma3_isr, NULL);* r! I8 U. o3 i( i* r3 k0 o
    }' }* Q1 g: `0 H9 c
       
, V* o, b+ d, C3 [9 F& M        if(result == EDMA3_DRV_SOK)
: ^% a! n9 k+ R; \        {
6 S  p5 u$ k7 y+ o; Y                paramSet.srcBIdx    = 0;  j, M6 _! P5 y& ~* z; B  t
                paramSet.destBIdx   = 1;: _) o/ }: d6 {: p: C; U
                paramSet.srcCIdx    = 0;
; e6 d/ p6 ?" Q) W                paramSet.destCIdx   = 0;
$ P  C# v2 o4 t, r& [                paramSet.aCnt       = PING_PONG_ACNT;
( f( L7 R! C. w                paramSet.bCnt       = PING_PONG_BCNT;
- T7 `7 x  a9 O; ]2 V6 Z% r& Z2 K! J                paramSet.cCnt       = PING_PONG_CCNT;0 T3 v8 r8 \# |3 W! k( R
               
; H; Z5 ~; c$ x' @  M5 i6 Q# w                /* For AB-synchronized transfers, BCNTRLD is not used. */7 \  P6 Y& P: {& H
                paramSet.bCntReload = PING_PONG_BCNT;/ _3 f5 F; ~5 D

8 B- `3 ?& K; {0 T: U; |                /* Src in constant mode Dest in INCR modes */
) Q0 \( P! ^/ q" x                paramSet.opt &= 0xFFFFFFFDu;
' V; V0 o  r+ E; h3 Z& v, C                //paramSet.opt &= 0xFFFFFFFCu;
1 a/ I% C3 r5 B# _$ v                . o! M/ u4 k. ~6 D2 u
                /* Program the TCC */0 C, Q2 ~5 ?  Z8 z6 @; r9 F+ L/ h3 Q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% g5 _  u% j) ~$ p7 e8 x+ ?; c) x
, b/ H5 q* y5 U. U! q                /* Enable Intermediate & Final transfer completion interrupt */5 [, a/ J( }# @$ u) x) z( P7 ^7 c
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);6 ~9 S* `. k5 |9 F+ f
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);. K( ~3 L: J9 Z! D: u' M: Q

* S& I+ x. w. O3 k- c+ ^0 c0 U0 w                /* AB Sync Transfer Mode */
9 x* Q7 ~$ d8 I6 o) a+ M/ S                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; o: I: t* T% H3 A                1 ?* X; H# J8 @$ E1 @" _
                /* Program the source and dest addresses for master DMA channel */
! u& |& |# @* p2 |( h# M+ n                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# U0 x* c% y. R6 }3 O7 U5 m- ]8 Q
                paramSet.destAddr   = (uint32_t)(ping_buffer);
% E- ?8 ^4 \& w6 }: n5 a: `
# k: }% U$ V: {/ y6 [+ \! E  D4 @                /* Write to the master DMA channel first. */" p' o9 s. ^: f' {6 J8 i: Y1 ?1 I* y+ m: O
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
% b9 a5 O9 `5 m# Q) n    }       8 x3 k! I2 A# k6 z

  c5 g+ {. T5 e. ]8 G" f        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);+ _8 f  M# q8 ^
       
. a6 E% o: o: `& x3 y$ a    if(result == EDMA3_DRV_SOK)
7 x* N7 K- \; l% @- _+ y( t2 `! l; {    {' |" N7 G' c. u/ R
            print2arm("edma3 driver init success.",0);
1 ?) N9 C( `. [! R, M    }
, Y! ?. }3 Y6 Y$ g5 K6 z1 L}
) t! i# Z! _5 \' S2 i
( t4 }1 r4 H7 ?0 m' ]7 M( P
* O! D8 d( F( c' g! bEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
+ I" U9 j2 C) Q: T8 O( Q# K* k! W6 |
3 V% m- v" h5 j/ k

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
; p& N$ q% v9 x每次DMA传输完成后都要再次使能传输

7 h9 E3 I# R9 j: g1 X原来是这样,我明天去试试,谢谢了!




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