嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( I( |+ b4 H6 H8 }* a# s#define  PING_PONG_ACNT          11 m9 x( z% G. Q
#define  PING_PONG_BCNT          8*32*40 4 R: Y7 {- x+ W/ I6 |0 }
//#define  PING_PONG_BCNT       1 ! R! B3 [+ O+ z* B
#define  PING_PONG_CCNT          1) _& j* d* j0 X; {8 U% I+ W
#define  MCASP_BASEADDR          0x01D00000
& p7 f1 ^: L% Q9 o#define  Mcasp_RXEVENTQUE        (0u)! J1 h$ b6 e  l- z

; A( h- d6 c+ W& x; V" B  P2 N/* OPT Field specific defines */$ e4 n/ h( |2 N, K. K7 z: @
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
+ {0 ~5 l: T4 B& c7 p" K; N7 U#define OPT_TCC_MASK                        (0x0003F000u)
; Y2 M7 u+ s5 x; `" W% S) [#define OPT_TCC_SHIFT                       (0x0000000Cu)( ]% e- Z7 I; g) x) q, ]
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
; S$ ~4 a* S" K, P* w2 }+ V#define OPT_TCINTEN_SHIFT                   (0x00000014u)
; ~0 `" x! }) W9 y! W1 O' V- I
* H) J: x% P  y0 R8 L& Pchar ping_buffer[PING_PONG_BCNT];
. w* j% U; m4 X2 D5 G. tchar pong_buffer[PING_PONG_BCNT];
& r& m2 o5 H* f+ h1 P/ N2 u+ ~  }. O! m0 q

1 [. y9 }- s  g9 e( s  x2 C0 _
- f" N3 X2 @: i! o9 I5 F" S7 p- N+ p% Z9 ]  S6 `
static void ys_edma3_init()0 K6 v& E* f0 V5 }. O. b$ N
{* T& Y& L+ C) u! ^1 G2 a' @( n4 _
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};. L  D$ D  }$ @2 `
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
" \; b& Y! a- |3 u$ j        EDMA3_DRV_Handle hEdma;2 {* |7 V* \( j/ E8 c; |
    uint32_t chId   = 0;
3 m/ K' t3 y9 s4 A4 B9 \  a    uint32_t tcc    = 0;* p2 q/ u2 r* X, L- c6 R  B4 g
/ \" e4 o& c- W% {( U, `
    print2arm("edma3 driver init...",0);2 x6 |; @7 O6 \6 n) b

9 q( ?- v# s5 v' _7 t1 r        hEdma = edma3init(0,&result);
5 x) R& Z+ e5 Y- {: N, I6 o# p  f        if(hEdma)
# C! K8 D; J/ D8 F5 p1 X        {
. A+ J& j6 K/ t# D                print2arm("edma3init() Passed.",0);
- h. z6 E. U. l$ Z6 o" _: n        }
( c6 _& I- G6 p, F; Y        else
+ v; M! i& L1 T6 B9 |% J        {
; `+ B1 {' N( @' ]+ U7 Z                print2arm("edma3init() Failed.",0);
  y2 W9 s! M, \4 c# Z        }: U, n# u6 a/ M0 @
        1 I, ?0 ^& B- F& O! Q' Y$ U3 U2 B
        if (result == EDMA3_DRV_SOK)
4 M0 v: h' f$ @    {
% j0 E2 B4 V) g% W" h                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
, y0 x1 J5 ~' l" P8 Y7 `                                                       (EDMA3_RM_EventQueue)0,
# p# Q- W1 U3 [) v9 M                                                            &edma3_isr, NULL);: c" V9 A, D$ s0 d% Z9 m4 ^
    }6 ~- S6 O0 L3 D4 m) @
       
! ^3 v8 I3 \' o9 r% M: S- ]7 J        if(result == EDMA3_DRV_SOK)
. @( R# J' o# A7 e# Y- X5 A        {
2 d9 A0 d$ y; [2 z6 k  e/ F$ S                paramSet.srcBIdx    = 0;
" j) X# L+ y; B3 p) v' W9 ~% i                paramSet.destBIdx   = 1;4 v( G7 s! M+ {4 T/ H4 w+ d4 M+ ?8 A
                paramSet.srcCIdx    = 0;
7 M1 U; V. w) [' I1 {3 |3 C  Y                paramSet.destCIdx   = 0;  c3 I1 P+ B, g, J' R
                paramSet.aCnt       = PING_PONG_ACNT;
3 d1 c! N! }% m( y                paramSet.bCnt       = PING_PONG_BCNT;
: D% p- J0 t' v  q* h; B3 L- A                paramSet.cCnt       = PING_PONG_CCNT;6 Q: P% _1 M! t  N
                / ?$ h  k" e* b, b& K) D: G0 K2 p3 w7 k
                /* For AB-synchronized transfers, BCNTRLD is not used. */* @# @& @0 i1 u7 o+ u
                paramSet.bCntReload = PING_PONG_BCNT;2 o! E! O3 ]* h( @6 b/ O

( a2 B0 d$ m) ~9 K! B                /* Src in constant mode Dest in INCR modes */
& d5 @  x+ K- U$ s2 k5 `                paramSet.opt &= 0xFFFFFFFDu;
; T. O  O, R3 U) x7 K  T" \6 h                //paramSet.opt &= 0xFFFFFFFCu;
& B% f! k( ~: _3 j! ^. Y, C  K( |0 U                $ F$ V4 A2 t7 W' C
                /* Program the TCC */$ f+ ~: X8 e7 P) _, `* V
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
# X' @4 v" B" q: ~4 g0 L2 u
' @- E3 e, }" i; ~: W                /* Enable Intermediate & Final transfer completion interrupt */
7 p3 d2 m8 x3 `3 u. J                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);  z" e8 c- s2 Y- U4 k; T$ M. P% i4 u
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% t: k" P2 K  K3 Z7 Y, G9 g: ~! Z
8 y; a; R0 B7 m6 G  c+ D                /* AB Sync Transfer Mode */
5 r$ p6 [2 w& C  ?% i# }- r                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);# u+ v- k6 @8 i4 d7 Q
                + ^% `/ c- _, S; l6 o" U
                /* Program the source and dest addresses for master DMA channel */
4 D# N  T# ]) b% S5 a6 l                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);0 G4 D# E# n% [, k
                paramSet.destAddr   = (uint32_t)(ping_buffer);" r4 c/ Q5 h/ k+ l! l/ x% i

# l1 ]' x% Y/ g7 f! I8 _- Z7 N                /* Write to the master DMA channel first. */
! a# w. y3 `" V. s2 ?                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
8 R$ n8 v. x% |: |$ L# _    }      
/ g& P6 q' |7 `. u5 g3 u. d0 r6 k0 k4 ?) m* C. ~
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
$ S( i, f8 B& |. C$ |" K       
& v  l" r0 \# z+ ]4 R5 N1 F    if(result == EDMA3_DRV_SOK)
. F0 w; h3 F% R, n0 U    {
/ T" M5 d. r  ?3 M# J7 j3 ]; d            print2arm("edma3 driver init success.",0);: b5 y0 L; A5 F! t! y
    } 5 Q0 P5 S" e( n; \5 h
}- v  h4 w! K( m3 f0 }( P" P2 c2 h

* k9 i- A" l/ J8 A/ o  t8 Z& u/ x# C: i. l3 Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。% L9 E6 S& z1 {% L  D. `
. O1 j2 J/ g& E. D2 p( v- ]% @* U
; o+ B7 i0 f0 ~% L! G8 J$ |+ F: D

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* U& L9 q. E5 O) D每次DMA传输完成后都要再次使能传输

  w' K! g( |9 r- F, m; W4 h" H  N原来是这样,我明天去试试,谢谢了!




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