嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
& k$ I) R- L2 a2 v  g#define  PING_PONG_ACNT          1. u1 ^$ J7 s% Y# \
#define  PING_PONG_BCNT          8*32*40 ! r, y) R: D7 X& @
//#define  PING_PONG_BCNT       1 ; d# y. T) H5 J9 y+ a, Y
#define  PING_PONG_CCNT          1, `6 Z9 u% b) O' j
#define  MCASP_BASEADDR          0x01D000004 b5 @: n  T) k" Z
#define  Mcasp_RXEVENTQUE        (0u)
0 L, Q0 g2 z$ Y" u* v5 ^4 F2 f+ ~3 u7 u% A
/* OPT Field specific defines */, B% N5 r; ]) b. k( \% x! j
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
  ~/ m+ O0 b, v' Q4 i# x# b#define OPT_TCC_MASK                        (0x0003F000u)1 X7 I, y) ?1 h% d
#define OPT_TCC_SHIFT                       (0x0000000Cu)
: T" j7 x) f4 f: H" L#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
  i# A0 j  x: U# |9 z" _7 K; ~#define OPT_TCINTEN_SHIFT                   (0x00000014u)( k/ s# c$ X# z" @8 O

) {! J& y& ~) k  i- l! jchar ping_buffer[PING_PONG_BCNT];
; f% T  Y* r/ [# C& ichar pong_buffer[PING_PONG_BCNT];
; X8 U1 j: _) I" o/ N; C) F
; n; T& V+ u' t9 t! u+ b
8 n' o1 ]- Q* W0 R+ S+ j) l: H6 s; \/ Z) N* o+ n
4 o9 h( v; S3 ^$ }# f
static void ys_edma3_init()
9 \' ?4 @+ J7 I5 ^" X1 Q{
; A7 m( k  p) }        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
8 g1 A" h2 T; x$ L+ |  T# T        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# j" U; j' f" z+ u2 [+ l        EDMA3_DRV_Handle hEdma;
  x: p" z) l$ X. u4 q    uint32_t chId   = 0;
. g; g* O, t: A# D% b2 p  X  Z$ D    uint32_t tcc    = 0;! @/ u+ U2 _. |% y( {3 `# B
- Y0 a: ^1 p7 m' t' X. j; D
    print2arm("edma3 driver init...",0);
) }$ X/ W( t/ u. s
: P* f; c6 }& |: u4 ?* E        hEdma = edma3init(0,&result);
* {( V& H6 ^6 U1 u$ t9 P        if(hEdma)4 x- l6 j; s6 e! x8 v" ~
        {
) e% Z4 F9 y* h& _! o                print2arm("edma3init() Passed.",0);. B! `5 r! ]! b6 j. `( f! q
        }
; f# W' s' Y# t: I7 F) v2 t* {        else4 z8 J9 e2 u! {$ F5 i$ W9 K! O
        {; J8 f5 q/ ^. y! s9 N# I1 p5 A+ i
                print2arm("edma3init() Failed.",0);8 S9 K  t5 Y% y  d
        }
# e. a; ~" L9 ^# H" h) T        6 M6 P$ i5 [+ U+ v
        if (result == EDMA3_DRV_SOK)9 A2 k# }) g3 P( C, u
    {! l6 Q: d0 f( v* V" k% I" L
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 P% F" p+ H* {/ }                                                       (EDMA3_RM_EventQueue)0,9 W: E4 R9 u, a
                                                            &edma3_isr, NULL);9 v( e4 X  O7 |/ I3 U7 V: I8 Z
    }$ W/ e( ~! @0 l4 X/ @# F6 F. A
        : }, c/ }+ J' k+ x
        if(result == EDMA3_DRV_SOK)
; D( T& s  G: j5 z  x% e        {7 o; ^8 V5 k1 ~
                paramSet.srcBIdx    = 0;: n7 {% I: Y# w6 P2 h' U0 A
                paramSet.destBIdx   = 1;
" k' e! F, }0 E. j1 a3 h3 R                paramSet.srcCIdx    = 0;1 Q# w' ^6 ~1 w9 w$ W) s& I0 M
                paramSet.destCIdx   = 0;% C3 R$ h; F' R) `) p
                paramSet.aCnt       = PING_PONG_ACNT;3 W% N% N" C0 T7 g( q/ B0 x: v' A
                paramSet.bCnt       = PING_PONG_BCNT;
% I9 I+ e8 K4 k& z" F                paramSet.cCnt       = PING_PONG_CCNT;
, _, R5 N- r- q                6 p! B' F$ K; W
                /* For AB-synchronized transfers, BCNTRLD is not used. */3 C+ J$ Z* S( |6 s7 O% N
                paramSet.bCntReload = PING_PONG_BCNT;8 @' e% o* q# y
9 P* X/ {7 ^3 c. |  ]+ [
                /* Src in constant mode Dest in INCR modes */
2 k& T( E# N# g; d                paramSet.opt &= 0xFFFFFFFDu;& {0 G: O# r3 M- R# n1 h! @( D
                //paramSet.opt &= 0xFFFFFFFCu;/ e+ G; K7 l1 {+ v
                ! q' _! O3 O+ S% J2 u: P
                /* Program the TCC */) h/ Q* M3 Z' C4 P( L1 q
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
, A, A- U# l" S! Y' w% J& G* T
1 W6 `) F; g3 }9 [9 `                /* Enable Intermediate & Final transfer completion interrupt */: |4 J- ?- O* c$ K0 [; i
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);* [; _- F) o' U
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);& O0 ^" x! S+ k! r1 |* s8 f  i

' @+ L( C2 B- t* M                /* AB Sync Transfer Mode */& u- ]' _! [% R9 k: g
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- b/ S8 [9 R3 Q/ |" x8 \" _               
5 E2 X) L: h0 P. n                /* Program the source and dest addresses for master DMA channel */" [* B+ W. f( `: e0 P$ ~
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
" B  t. D5 V# S' Y0 ?. r0 H% O                paramSet.destAddr   = (uint32_t)(ping_buffer);
8 D  o8 Z7 W* E. [& v: V" k) p6 p% T/ Z
                /* Write to the master DMA channel first. */
: c7 T3 v& k- p& [                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
) r. j# F4 E$ z, s    }       1 y& H$ J8 i5 b+ G; l9 t# E

9 T/ f& d# [9 h2 m# d  f" v6 ?        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
+ U; @4 S; Y/ H* \; U  V        $ Z) M) j% O  j7 R: F
    if(result == EDMA3_DRV_SOK)
/ u/ r" H" l4 ]9 n$ f9 o    {4 H- i; w$ X* O7 {
            print2arm("edma3 driver init success.",0);
/ ^3 S. y( D, {% B) H8 i    } 7 l4 \. O5 ~+ P# z
}
+ L4 b! b7 T/ w4 x5 H- i$ I
8 \2 ]5 Q3 q9 n3 B) v' p# g" C  m, R8 \: P0 g2 T5 Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。/ \) b9 s8 L/ I1 M
+ S) @- Q, X2 Y- l
! r9 d! q6 g) d( e& O; S7 Y* g. \5 A3 A

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
( v) k) J& O" M1 f- r每次DMA传输完成后都要再次使能传输

! o8 P" ~! b2 q0 i6 I( C. |8 t原来是这样,我明天去试试,谢谢了!




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