嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" I0 l& _; i* J) E5 U
#define  PING_PONG_ACNT          1: b. o8 W, R4 w
#define  PING_PONG_BCNT          8*32*40 5 \2 k: a# j1 Q+ x
//#define  PING_PONG_BCNT       1 + Y- a% E' u& }% i( _& @( k8 I9 H9 [1 b
#define  PING_PONG_CCNT          1
# b1 h# X% y1 [: \8 h#define  MCASP_BASEADDR          0x01D00000
/ }' a& C/ V# Y" s4 a9 @& H#define  Mcasp_RXEVENTQUE        (0u)
" h7 i8 g6 l  U( f+ v
7 w: \: X, J! Y% e& _8 J6 H8 _/* OPT Field specific defines */
- K' k) v9 ?& A( V; T! ?- f" U) C5 r# g#define OPT_SYNCDIM_SHIFT                   (0x00000002u)" n8 [" O; j( r' a# R$ C% ~
#define OPT_TCC_MASK                        (0x0003F000u)
# `0 _9 K" T7 F& R% l- F#define OPT_TCC_SHIFT                       (0x0000000Cu)/ X* s- {+ L' c1 `# z6 h1 c
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)7 U$ b0 A4 m& X' [! F: m$ f
#define OPT_TCINTEN_SHIFT                   (0x00000014u)# Z, z4 V) s  i) R* }
6 Z- N5 I, J1 m6 a$ U1 Q
char ping_buffer[PING_PONG_BCNT];
: Z$ v% E8 @1 K5 S1 H# vchar pong_buffer[PING_PONG_BCNT];
- I# r5 \2 H+ w1 v4 K/ M5 \  i  w8 M" N! |- f8 g3 t

* @% u+ R. |- s( n4 U8 I; u
6 t: `8 G( v+ P: O; q  Q$ d! C& M5 k" l7 P3 `! ^
static void ys_edma3_init()
2 D% l$ H  ~* }' X{7 p0 n/ T: c) p% o
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};+ @3 o! T; T1 A! N
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ q9 t2 `3 a2 i        EDMA3_DRV_Handle hEdma;
6 O- k( d; m. B8 f" \3 K    uint32_t chId   = 0;
3 J, t- `: v! w1 F7 j    uint32_t tcc    = 0;
% E! w. J" S# `3 b1 P: h; w0 }+ S7 H
    print2arm("edma3 driver init...",0);8 x' `3 v; C. s# h% F$ x

( H+ @: b' E" c- o2 B        hEdma = edma3init(0,&result);
5 g) s( G" @4 ~9 F! r        if(hEdma)7 a, W9 ^8 h* x, U  G' {& N# i: _
        {; X- h6 `) h: h2 K
                print2arm("edma3init() Passed.",0);% H" w/ k  H. Y9 M2 P8 e* u
        }4 ?1 r+ r8 b3 a3 ?- q
        else1 H9 Y' p0 m$ E0 z% B
        {
& M7 h, F4 @- h( Y. M4 K                print2arm("edma3init() Failed.",0);2 R' `+ w. Q% f, d
        }
! K( n' Z& @+ J: L       
: v- v9 j6 @; h" w& b! V! H' p        if (result == EDMA3_DRV_SOK)6 |# F% O% y, I3 A( U( `9 Z; k
    {1 Z$ f$ Q* z  Q5 a2 `0 e
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
* {9 o2 B' f9 b9 {                                                       (EDMA3_RM_EventQueue)0,
" G0 l1 R* x: N, C" |                                                            &edma3_isr, NULL);6 [/ p/ T8 t* D
    }
) C5 a* [5 T6 W5 S          b) p6 b8 M& \
        if(result == EDMA3_DRV_SOK)
3 c( h5 I! z1 c: u+ g8 \' T& c4 D        {
) J8 P8 D3 b( \" j# E$ G8 s1 F4 ?                paramSet.srcBIdx    = 0;& B. d5 _) E* u+ t
                paramSet.destBIdx   = 1;
& m, X$ w1 J1 j. T6 a                paramSet.srcCIdx    = 0;5 u, n6 C6 w8 k
                paramSet.destCIdx   = 0;( Q9 X2 c6 ~* r, c
                paramSet.aCnt       = PING_PONG_ACNT;+ r- o& n9 g# P* }( C7 @
                paramSet.bCnt       = PING_PONG_BCNT;
1 O6 S8 a* E5 E7 [                paramSet.cCnt       = PING_PONG_CCNT;
& H: L( b" }' G, L: i8 ^3 r' ]               
! P+ l& ]8 o0 @. g( u                /* For AB-synchronized transfers, BCNTRLD is not used. */6 ]$ ^( B8 `% m
                paramSet.bCntReload = PING_PONG_BCNT;
" ~/ J9 }" u: g1 [% ^8 w2 D6 F5 B3 U3 z7 d" w6 k! h
                /* Src in constant mode Dest in INCR modes */
5 e4 N6 w& ?6 C                paramSet.opt &= 0xFFFFFFFDu;
/ G5 P3 C$ p/ _) k8 O( B) I                //paramSet.opt &= 0xFFFFFFFCu;2 e. p. s/ u9 c" R/ e
                & E# ~! b+ f+ R- {9 X5 e7 F9 z7 X5 ^
                /* Program the TCC */
4 P% h8 a9 O, f- X9 O# k) q5 L+ R                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! s7 v% y8 @) ^: [, d$ G

: K/ n5 P& f8 Z; r& `- s4 N                /* Enable Intermediate & Final transfer completion interrupt */) s% W6 p* J, Z: Y6 K
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);, V! t, ~0 [! M# L$ z
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, X4 V$ @" `) ~/ n3 N% ?" K2 W3 N' N) r
                /* AB Sync Transfer Mode */
5 U: j& R: [+ J$ V' ]                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ k6 i# Y: T! O; B5 O               
3 q/ Y9 v  p, @& L: G' f5 q$ t7 o                /* Program the source and dest addresses for master DMA channel */! j% Q# ^( W% ]9 }
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);4 `8 m- |5 M' ^( @+ W5 m: z
                paramSet.destAddr   = (uint32_t)(ping_buffer);1 g5 N1 _: L3 y  h: _

" F. F6 T- k* L                /* Write to the master DMA channel first. */
  t5 ?2 k& L& `4 w, K                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);1 ?/ }3 x- M5 I6 E; ~8 Z( p& o8 |
    }       5 b* r0 G# V/ _$ \  q8 t

( T+ I- c/ ]# \2 }- L3 E        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
" g  F# P- r; f) ^       
# c* B. r1 c  h& W" X7 [    if(result == EDMA3_DRV_SOK)
2 Q+ q, K) U, Y1 t- |    {* d0 m* h6 m. Z3 \4 z
            print2arm("edma3 driver init success.",0);7 [8 }4 a7 g; h& _" T, t- D
    } # l6 e* Z# M% e5 q3 \: Q4 y
}5 _1 |3 A7 ~, X
. R; E9 s8 m2 y2 ^7 R  _, k: d( k) J* O

: Y2 Y" j* o0 P; j, ~3 Q' PEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 q5 Y5 R8 L/ |, s) S& `# b9 Y0 `7 @* N4 m4 F* G
% P9 Q: {( W9 Z* m! x

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. E" i4 S/ x0 C2 I; @1 z每次DMA传输完成后都要再次使能传输

% b% D+ d1 `" ?% N" }0 O3 @原来是这样,我明天去试试,谢谢了!




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