嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: m* r; ]0 Z) L$ X# P1 G, V#define  PING_PONG_ACNT          11 g) U2 w1 V- v, s5 u. x8 i% N
#define  PING_PONG_BCNT          8*32*40
  z" a3 a5 D2 O$ s, u4 ]//#define  PING_PONG_BCNT       1
' [1 l( q! k( w6 t/ ^/ m#define  PING_PONG_CCNT          1
; [! Z% J( c- J' k#define  MCASP_BASEADDR          0x01D000001 n" @( E* r  c9 v8 B3 l
#define  Mcasp_RXEVENTQUE        (0u)
6 a% s5 j) V" ?! a" ^- x4 q; b; `+ N" K0 Y
/* OPT Field specific defines */# _) E/ u3 s) U3 S7 V
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
4 j2 }# S0 x$ I9 N#define OPT_TCC_MASK                        (0x0003F000u)  D) [8 E" }* [: m/ y4 v
#define OPT_TCC_SHIFT                       (0x0000000Cu)
- z5 {8 Q' S: d: g8 ?2 _#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& c/ O! B' O6 f' P( `9 @
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
* i+ L) j3 D' e2 D9 v9 Y9 Z- G
. q$ U. z; {  I, }char ping_buffer[PING_PONG_BCNT];
% X5 [7 ]2 [* K: ?  v4 s4 {char pong_buffer[PING_PONG_BCNT];
, Y9 v+ q! [( ?3 K
2 V+ G3 F$ z% Q% o6 u* C$ J  W& A( ?' Y8 i% ], p5 W( @
5 X1 {* w& w; c$ K! H4 i# p

' O9 a8 A  L! p, I+ Sstatic void ys_edma3_init()
+ t; E1 |& n8 G7 z; B{, x% t' ?' h& j7 Q+ e
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};$ B4 y; |: k* g* a" c) {  x
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;% h  e5 v1 s. }. B+ R% P5 z1 _2 F
        EDMA3_DRV_Handle hEdma;
7 ^3 U" N" `+ |; ^    uint32_t chId   = 0;1 F/ a/ j# R1 R5 [$ S1 r
    uint32_t tcc    = 0;: k. ^5 J! o: p/ R
6 D( _! g% k7 P" G6 O- R# F" T
    print2arm("edma3 driver init...",0);
; \5 F5 l9 N) o9 V
- Z! [: E2 A, X' N  d; T. Q        hEdma = edma3init(0,&result);8 \: Y: W5 g! Z3 ]8 I8 V+ h
        if(hEdma), v6 C$ L, m- g( e+ E/ j
        {4 j  w, {, k* w% z+ N/ S# q
                print2arm("edma3init() Passed.",0);- Q8 }. ~" L  k& m& i
        }' [, W* l5 j7 z4 N
        else
7 M  P, O( z3 u: C  m* |5 }        {
5 h- a4 ~3 ?! h0 k7 H                print2arm("edma3init() Failed.",0);& X0 E8 \% ^$ e2 b
        }
8 i+ \# U& A1 O9 Y       
; R4 I2 u) Z3 o3 ~6 k% N* I1 Q        if (result == EDMA3_DRV_SOK)
" M. T8 q) {5 H9 ]0 ^2 g& h    {# k8 w7 A) L! M
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! U$ t* o. A% X( X+ ?6 ^- }4 q0 [! P                                                       (EDMA3_RM_EventQueue)0,
2 F2 d$ I& B$ B, }. w' G4 i                                                            &edma3_isr, NULL);
* H+ E2 n# e; I9 ]    }/ m6 [4 A) Z$ i' V# o. X
        " I3 l9 M7 h/ _8 T
        if(result == EDMA3_DRV_SOK)
5 r" o3 J0 I4 x% }1 Y        {
& x' _5 ]/ f9 Z( A) k( j& U                paramSet.srcBIdx    = 0;% D8 c; u  {& B; O
                paramSet.destBIdx   = 1;
( h( ]9 c5 n* I! X: P                paramSet.srcCIdx    = 0;6 p6 }! r6 m# l. B
                paramSet.destCIdx   = 0;
5 ]6 v7 R5 e, f( T) B& o0 c) ^                paramSet.aCnt       = PING_PONG_ACNT;5 S" V' Q- _" q+ Z% l: O6 J
                paramSet.bCnt       = PING_PONG_BCNT;
/ h) n+ x2 H, @                paramSet.cCnt       = PING_PONG_CCNT;
% N3 D+ |4 ^; @: D7 T6 ^                ! ^1 J) h! |" Q& G& H; @8 |
                /* For AB-synchronized transfers, BCNTRLD is not used. */
  J: _! D+ F+ X) w9 S: Q, G                paramSet.bCntReload = PING_PONG_BCNT;% a& B9 S% ^* P

2 n' U! D; ^, I) J4 E8 R& N7 `9 S                /* Src in constant mode Dest in INCR modes */) N* ~' W3 K1 P- g, m
                paramSet.opt &= 0xFFFFFFFDu;0 P) E2 r! p, ~( `" ?" {0 d
                //paramSet.opt &= 0xFFFFFFFCu;
+ X8 p; T6 z2 d+ p4 v                # O# _# S' [2 c' c
                /* Program the TCC */% m' D) [7 v2 q. @; x
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ `2 v. [% i2 o7 J. r' `' ~& j' f
( ?" O! _2 e. a) W. L5 _
                /* Enable Intermediate & Final transfer completion interrupt */4 d5 B" z. [! i7 R; I
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
" Q( b/ Q- m( W5 B                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);1 M3 L, \7 I2 O

2 X0 O/ m* o" w9 `- k                /* AB Sync Transfer Mode */% Y6 @- Z! y6 n" H- l& m) d
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ c8 Q, p( j; p* U) Z8 O               
; `) m2 F" r) y6 s0 ^' d                /* Program the source and dest addresses for master DMA channel */
! @/ `5 D# U/ U3 b- M. I0 ]                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
) O. r7 u: |" P- U' Z& c/ t                paramSet.destAddr   = (uint32_t)(ping_buffer);
6 n6 X" H  w, n8 t2 v- g# W3 |. S6 f4 V8 X# B$ g
                /* Write to the master DMA channel first. */2 M; f$ Y8 m' B2 Z9 V% h
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
7 U, }* K9 I* ?) ~    }       % x) x; S+ ?- e7 Q
$ v; a4 d! A( ]; F4 l
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);5 @$ t# H! }( n
        ( E% L) ?2 v6 b$ I8 [$ K8 Y2 }9 [
    if(result == EDMA3_DRV_SOK) . `# H# k2 S: V/ B9 a: |% v
    {! n5 f8 b: ~4 a* C; F
            print2arm("edma3 driver init success.",0);
- A6 V0 Q$ f7 _+ f: n0 e6 L    }
2 M8 J$ j7 c! s5 [6 S  J4 i}
: [" A( z6 G# S7 n! r$ I5 }: E
  [5 N! i' Q% I, R3 A% K  t% m: O  H4 `4 ~) Q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% V1 P1 r  p5 d  d8 q2 h. m4 `$ Y/ N5 a  }8 B

' ~, v- j+ F, I, K, F$ c
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47/ s3 B  }8 u8 M9 J' M( x% a$ G9 g) _
每次DMA传输完成后都要再次使能传输

) Z- m9 A* X6 L原来是这样,我明天去试试,谢谢了!




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