嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" O8 _" B! U  D  @; m  }/ M#define  PING_PONG_ACNT          1
' D2 W) _- t( z/ h9 Y9 v8 n0 b#define  PING_PONG_BCNT          8*32*40 ) Q- e  B+ _( j+ z; r- w
//#define  PING_PONG_BCNT       1
1 ~( f. D2 f$ d3 J  P- Y" Z9 R#define  PING_PONG_CCNT          1& e' k/ i# ^2 P( Y# |4 Z! a
#define  MCASP_BASEADDR          0x01D00000
7 O2 X2 }/ c) O0 L2 U' c#define  Mcasp_RXEVENTQUE        (0u)
. V/ H$ o7 G" s
8 j. k0 s0 S) e, c+ j/* OPT Field specific defines */' O8 u# D! T- F
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)+ Q+ w; |9 X) c9 w+ V) s
#define OPT_TCC_MASK                        (0x0003F000u); \; I1 W# o! D  {# X) ]" u! j
#define OPT_TCC_SHIFT                       (0x0000000Cu)
* ?" Q$ J/ O5 c" M$ ]- Z6 l+ G#define OPT_ITCINTEN_SHIFT                  (0x00000015u)& h, Z8 z! S) p0 A
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
! k3 e) U& n9 M5 k
- j3 m, k9 T- i4 x& f, Lchar ping_buffer[PING_PONG_BCNT];
$ B$ U, R+ X2 F0 [' ?char pong_buffer[PING_PONG_BCNT];& @3 l0 L+ W: h

  |" D/ x4 H; C! q. H3 U
6 F8 [  {9 P" k; N  z- h) W6 T! l9 T( Y9 |% ^8 O

: o( n+ v5 W  d3 ostatic void ys_edma3_init()
" H; d4 E6 a, A, D{  p) y- O+ L# j9 r0 W4 k
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- ~! ?  H' t: i3 E& o' R
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;$ D. X' X; Z; |+ Z* s
        EDMA3_DRV_Handle hEdma;$ \7 k/ P/ f) u4 \
    uint32_t chId   = 0;
6 i7 C! H. r* M& y    uint32_t tcc    = 0;
7 p: [7 B3 B* r6 `
, H) _- x7 R" W$ ]    print2arm("edma3 driver init...",0);
' g$ H% c  e# q/ H+ L7 P+ N* ?$ F
" K1 V+ G$ B# x, w3 T        hEdma = edma3init(0,&result);* Y, p4 D9 A( d& X1 r/ x
        if(hEdma). c5 W7 n9 R' r4 ^, X' P2 N
        {
: J, F! M8 Q2 w0 ?+ B' f8 P  _( `                print2arm("edma3init() Passed.",0);/ j* p; `- Q9 {
        }
" P! O/ R) N; ^  Y1 ^7 a7 [$ {" i        else
' V  t  p% L# `2 v5 d$ K        {/ |& j( X: O5 @7 J) L) _
                print2arm("edma3init() Failed.",0);5 h! I) Q7 I, \" _9 Z3 |/ B; G
        }7 T! a4 S- W! \2 f# E! }; x: L3 N* q
       
( G" X, c( o7 s3 T        if (result == EDMA3_DRV_SOK)
: N0 t3 r# b8 Z2 ~% w, b2 q    {
5 x  I7 k1 K7 C7 i                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) s6 x& H2 A8 `2 d  ^7 ~% |# ?                                                       (EDMA3_RM_EventQueue)0,0 G+ u# s) |/ F
                                                            &edma3_isr, NULL);
* E* \3 g" h: G  H, D8 q3 o3 [    }, F) Y0 J- \9 T) _' i$ o
       
4 V) R6 _, @9 S7 @# v9 U6 t7 N5 }        if(result == EDMA3_DRV_SOK)/ p" p  ~. N. S6 z' W4 {) w
        {7 Y6 A/ @$ q3 g  a* F4 D
                paramSet.srcBIdx    = 0;$ r5 ?0 Z% T/ S5 P
                paramSet.destBIdx   = 1;. q0 q$ m! J' N; c2 v7 _' d
                paramSet.srcCIdx    = 0;
8 _% j6 ^$ D; ^( O1 d) x                paramSet.destCIdx   = 0;5 S0 \9 q' {5 Q/ b% _' p) w0 h! ]  e9 F
                paramSet.aCnt       = PING_PONG_ACNT;$ _" U) ?( E" W+ ]( d( O
                paramSet.bCnt       = PING_PONG_BCNT;
& T& B( g1 D0 f# @9 N3 R) y7 G                paramSet.cCnt       = PING_PONG_CCNT;; w2 ~  @9 k' B
               
4 U  H4 s4 Y2 z" l- F                /* For AB-synchronized transfers, BCNTRLD is not used. */  m. \. t$ g/ F& O/ R+ T  {
                paramSet.bCntReload = PING_PONG_BCNT;
6 T; c2 `  |. t$ ~/ A* @1 h6 s
% e  [: y0 q+ l  c% u( x1 n                /* Src in constant mode Dest in INCR modes */( j: p0 l9 f, p5 \4 B6 c
                paramSet.opt &= 0xFFFFFFFDu;
9 F+ x- H/ r% \+ Z: n5 l1 f  r. m                //paramSet.opt &= 0xFFFFFFFCu;! ^# M7 D  v9 o; i4 O5 f
               
" o$ |$ T. p1 [" w$ e/ F2 h                /* Program the TCC */3 o* z" H' F4 M9 ]5 K/ H0 g
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( O( u0 t9 F2 I% V
7 e% q$ n) x5 L2 m: ]  |  A; q
                /* Enable Intermediate & Final transfer completion interrupt */  O  g$ Q5 V2 R
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& S$ _' `$ N7 X, ?1 O' @3 y  {                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 K, o: L* h1 Y) J, m% L
% t+ E: s  C7 Q- r& h# [
                /* AB Sync Transfer Mode */
! ^* L! s4 j! {4 W. V) o4 g( j" k                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 ]9 Y2 k. o7 u; X) S& m( [                  g6 m9 [" d9 i) K6 ^
                /* Program the source and dest addresses for master DMA channel */
- c" k- K$ Q! h( N- z0 u( i1 h                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
: J) |8 Q5 J& ?- i                paramSet.destAddr   = (uint32_t)(ping_buffer);% W, _; S4 Z7 A
, d5 W1 I8 A. Y6 J" {1 |
                /* Write to the master DMA channel first. */
$ W* m8 o8 ~4 m                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
/ T6 B# g! f- z    }       / M. |- F% H& `* t3 z4 `  I& W( Z0 D/ t

# e2 o4 K7 y+ k9 v        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% e$ U( q, H, z3 A
       
) o) e3 w" n% i6 r; G    if(result == EDMA3_DRV_SOK) ! v, B% ~3 C: l! S6 m
    {
  [% S3 J1 |$ L. H8 P" }' K            print2arm("edma3 driver init success.",0);
6 K0 X* S, Y, U( L2 t    }
& T; H& Y; n- x& c" o' f) M}3 G1 {- Z: f3 H9 Y
  |- L, `$ C0 B/ [' s

7 ]  g% r3 b( h6 v; T* _/ `EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 W) I' z" E4 S* W9 g+ C( l6 Z! L

) Z8 \2 \6 C! m! B
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47% |+ W9 t' ]+ I. t2 V  p
每次DMA传输完成后都要再次使能传输

& B8 I& C4 A" M% W* w) c" h原来是这样,我明天去试试,谢谢了!




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