嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
4 E2 c' [; w* Q+ {$ C# V1 J+ Y8 `4 q' X#define  PING_PONG_ACNT          17 m( G; c! J  }4 A' @8 |  F
#define  PING_PONG_BCNT          8*32*40
/ B* p. ^9 v) [, d4 P//#define  PING_PONG_BCNT       1 ) N! p" |: k9 B) V3 \( z
#define  PING_PONG_CCNT          1
" ~5 k; b+ f! S#define  MCASP_BASEADDR          0x01D00000
9 y/ D6 r( P$ p#define  Mcasp_RXEVENTQUE        (0u)
, h  u; q% A! w7 _2 z
* Y. ]5 t4 q- m$ U/* OPT Field specific defines */
; Y& O( u. p( i* l( z#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
! T  k" i9 M/ i+ S& a#define OPT_TCC_MASK                        (0x0003F000u)7 Y- u) x6 o; Q% N
#define OPT_TCC_SHIFT                       (0x0000000Cu)) |# m9 G/ f3 u3 R2 o  X7 n- b, E3 T$ f
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
& q  ~& F0 N& i6 ]& s#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 N9 U0 Q, r0 E8 \% h0 S2 b5 e% p4 k1 X  G3 `' n
char ping_buffer[PING_PONG_BCNT];
. }3 @' W( p5 c# g3 k# W. @6 L4 Mchar pong_buffer[PING_PONG_BCNT];+ D. k: ~5 E; C; M; ^  o
# F9 T' ]% J# j9 f; k( {

4 B4 @+ D7 ^: L$ t
; ^- X! M6 f6 G' @: }4 |1 ^; W
) ~/ J0 |3 t1 F- k5 k- }. [% Wstatic void ys_edma3_init()) D* v3 @4 H, q; W( U
{
7 x! O) ^" e$ \        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% F, `! G, v1 s        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 f, J9 J% H; y6 A( x6 V  b        EDMA3_DRV_Handle hEdma;5 X4 h9 o3 c  c$ b/ q( D- b
    uint32_t chId   = 0;  O! Y4 m/ f. S% R
    uint32_t tcc    = 0;
3 i* c  T! R& z/ T) O) {- i. h3 a. H. `: q& J8 @/ v
    print2arm("edma3 driver init...",0);2 o- b" M" g9 y: J, @, R

3 }- H, i6 x; `6 i        hEdma = edma3init(0,&result);
3 ^) s* e+ j- M) d# s) w& ]% R8 R3 D        if(hEdma)/ ~1 H/ c# d5 M" d8 f
        {
' B) O" M; D  _                print2arm("edma3init() Passed.",0);
+ U1 ~$ k4 n, H  k1 n8 K5 m+ z' |        }
& W+ o  t" T/ {2 A- L: z4 d        else
: b1 B/ T  h! \9 g4 w        {& F3 s4 I4 ]5 I% b
                print2arm("edma3init() Failed.",0);+ i+ j, ]9 @% d$ }; ?5 B4 U; p
        }8 S$ s% ~6 w( ^* U1 K9 Q/ b0 O8 {
        ; W5 H; Q/ S$ h- [! a. b
        if (result == EDMA3_DRV_SOK)( Z/ F% u" e, B% b8 P
    {3 ^, e3 Y7 h  ^2 T- w; }$ j
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
2 m& S* T( @  Y# g                                                       (EDMA3_RM_EventQueue)0,) |: R) l6 z! g
                                                            &edma3_isr, NULL);
( X9 E7 S7 ^# ?* [    }! i8 L; r' j9 M: f0 l
        8 j  j7 ~( j6 `, e; P, k
        if(result == EDMA3_DRV_SOK)
5 A# W# u" ~* Q# a        {
% P2 l( K" |9 p6 b& ]                paramSet.srcBIdx    = 0;
5 @# T: P+ V& `                paramSet.destBIdx   = 1;
1 L9 U2 q3 ^; ~( _, l                paramSet.srcCIdx    = 0;
3 H3 O5 x' m  W: f3 d9 d                paramSet.destCIdx   = 0;. m: H4 J0 L2 y3 S
                paramSet.aCnt       = PING_PONG_ACNT;
$ W4 ~! Q: d4 @! E                paramSet.bCnt       = PING_PONG_BCNT;
# f0 w$ L# K7 y                paramSet.cCnt       = PING_PONG_CCNT;  k6 x5 Z% r8 \' F
               
* n' S: `- \& g+ R' I                /* For AB-synchronized transfers, BCNTRLD is not used. */
# M% b0 r; J* u                paramSet.bCntReload = PING_PONG_BCNT;
! C1 a+ e8 ]6 }1 V! l, k$ q* H
7 ~9 e2 M' c6 t9 h                /* Src in constant mode Dest in INCR modes */
. ^0 y! Y. w/ z1 X                paramSet.opt &= 0xFFFFFFFDu;! @% c+ H  z  _+ j
                //paramSet.opt &= 0xFFFFFFFCu;( M9 {2 A2 n$ U, u9 |
                5 x/ f4 Y5 x8 f/ S3 X
                /* Program the TCC */
# r  |# q% Z, k                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
1 B4 _/ K0 S/ b  ^1 T  n. F3 l6 m& F
                /* Enable Intermediate & Final transfer completion interrupt */
( \1 b2 n# o$ Z6 P7 s: G+ }                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
& g: j& l' X  b. L  Y                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) q( F2 q7 a& D8 s! @" n
# c+ q9 f/ m9 K                /* AB Sync Transfer Mode */
* E; p0 b/ ]& z" P. Y/ `5 {2 F                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
1 F1 N. |: U- N7 {0 E/ ~- J               
- l# z9 o9 T3 N$ B( u; Y; P                /* Program the source and dest addresses for master DMA channel */6 Q9 v7 L* W% r$ N& j# w
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# O& }8 o5 t: Q! _
                paramSet.destAddr   = (uint32_t)(ping_buffer);
: f2 A3 i8 ]) Z8 P' \5 a7 x: I) t
                /* Write to the master DMA channel first. */
! @8 C/ n( b  F1 d! Z* ~/ R                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);. M$ z5 p: O! u" a1 c
    }       # N- [. y- ]( g

4 Y6 Q$ _( s' ?6 d9 M        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, E! j- S2 b- `( J/ W       
4 U0 z- S7 \4 l    if(result == EDMA3_DRV_SOK)
. z  |% i; q' a; P1 j  J% x    {9 R! h0 A! @# {- d8 x
            print2arm("edma3 driver init success.",0);8 o5 g5 `. B3 b6 b: `( }
    } * @( h# o. v: E
}; T2 F9 a# }8 ?$ V

$ r% c2 ~' G! x* y; u0 w5 B3 m
! t$ g5 s( x/ ]& c/ G7 w7 [EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ a" X0 R5 _4 m/ \2 t
* M5 e# n( N. j* r  _" b. u% e1 C1 \6 I5 S0 @: c- g  ~! q

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:478 s" _8 k! O7 L! S! f0 _
每次DMA传输完成后都要再次使能传输
7 N9 f3 u( U! J& m. \
原来是这样,我明天去试试,谢谢了!




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