嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:" j; R% B, U* y
#define  PING_PONG_ACNT          1
. i; ^% j2 n4 i' K% g+ N#define  PING_PONG_BCNT          8*32*40
8 p( `  m. Y" s9 h! m2 G5 |+ a//#define  PING_PONG_BCNT       1
7 {) l# J. Y6 N2 P#define  PING_PONG_CCNT          19 _+ Z9 H5 w0 j" O! U
#define  MCASP_BASEADDR          0x01D00000
' _9 n, q$ ~. C' Z8 Y#define  Mcasp_RXEVENTQUE        (0u)( y; f8 z+ ^# F1 p% w

8 S2 N' g# k/ E  @' j- j% g/* OPT Field specific defines */1 T3 q% z0 ^4 c" R, |) _
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
- V% Q7 h2 ]3 f& W- ]  D#define OPT_TCC_MASK                        (0x0003F000u)
7 `! D  ]- p2 B# `#define OPT_TCC_SHIFT                       (0x0000000Cu)9 ^6 L/ |' f" r# k- J
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)+ ^( U% C/ v/ v  W/ S
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
1 O+ D# c5 ?# a$ G! C/ I, u) t4 G# o0 S2 @9 I; K
char ping_buffer[PING_PONG_BCNT];
9 A: Q  h7 \/ K: f, W6 pchar pong_buffer[PING_PONG_BCNT];
6 Y2 W: ^8 a8 W4 B# J# ~+ p2 _$ o7 h

& n4 L0 c. ^" r: N
9 i2 {: }; y$ K' j' M" W! Z* ]: ~; y% v
% R1 D' \9 V' a6 q1 ~4 @0 l' q' gstatic void ys_edma3_init()8 L+ ?0 V. N. T) H! B0 V! h
{
0 `( T/ [& Z6 M9 u  U% i( D+ k        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};- ]) @. a, `4 d1 Q
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# ^7 n& e+ W$ A% n8 u) b0 L        EDMA3_DRV_Handle hEdma;
6 m9 f" r5 t' ^# B    uint32_t chId   = 0;
5 a. v0 Y6 H( V    uint32_t tcc    = 0;
& K& `0 R9 p, p2 X) Z% R: S6 x+ ]
    print2arm("edma3 driver init...",0);5 g% K4 [5 W* o1 V# [9 @) u
. P6 U& F# Q" @( V7 n" W
        hEdma = edma3init(0,&result);
% R& U& L* K* w# L        if(hEdma)
) Y! w2 B, r- v6 M6 v! a5 L$ x- n        {+ r) G1 x+ r* X  H8 \' h- L  @
                print2arm("edma3init() Passed.",0);
5 g" m$ |$ _9 V        }: g1 N9 C; }( e: \8 C6 d% d
        else) b" e" `9 M8 ^" E
        {
4 x; [7 k/ P! N# r; s                print2arm("edma3init() Failed.",0);& m+ r# y' C5 B" Z1 Q! g1 ?7 X& i' c
        }
5 t0 T) a' I0 i; K! u  S        9 |+ r+ o4 ~7 V* r& F8 m
        if (result == EDMA3_DRV_SOK)
0 k+ z" r4 m) {    {
& k7 \& p! |  s$ e                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,5 q- ]  p  G. k; m; j
                                                       (EDMA3_RM_EventQueue)0,
* c. s1 C6 O* z9 t                                                            &edma3_isr, NULL);9 C. I; G5 t2 p- N' m
    }
2 V, i) t- M. r5 \- v- D3 T5 O5 T       
; L1 t) t3 v( J& E        if(result == EDMA3_DRV_SOK)
, \0 u, X9 l8 |4 r        {
5 e- a' ~: s7 S                paramSet.srcBIdx    = 0;
2 i* v% R! U1 A/ a7 y& H                paramSet.destBIdx   = 1;6 A8 G/ M( I* q2 a8 }5 P( O& O& ]* {& \
                paramSet.srcCIdx    = 0;& ?' ^( k4 I# d7 M: z
                paramSet.destCIdx   = 0;! `% t( C4 [. L% w2 |5 d) L
                paramSet.aCnt       = PING_PONG_ACNT;
- T6 U+ M1 [8 Q9 X                paramSet.bCnt       = PING_PONG_BCNT;9 z7 Z$ @9 u$ F+ Q3 S
                paramSet.cCnt       = PING_PONG_CCNT;% v. ^4 B, h8 h* c2 \
                5 m! F2 ]/ [2 J! D7 L- |( L( c! z2 S
                /* For AB-synchronized transfers, BCNTRLD is not used. */
# c2 F# P+ ~( a6 P                paramSet.bCntReload = PING_PONG_BCNT;+ I: q/ X" @. [3 c& w
' ~3 v0 x* s8 w0 a4 R
                /* Src in constant mode Dest in INCR modes */& f) ]" D! y. g5 J  s
                paramSet.opt &= 0xFFFFFFFDu;
) R" G' a* @$ A4 n) z& s  D0 i                //paramSet.opt &= 0xFFFFFFFCu;9 X7 \; ]- l$ C# B
                # t  o  F* y+ I) z# r" e9 r/ g
                /* Program the TCC */
4 {* c7 l. `3 s. o2 i8 f* x                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' e. _: s! D: ~" Y# s# k# p" ^0 l! }6 U' t6 X. L) q" Y" N% q) H
                /* Enable Intermediate & Final transfer completion interrupt */. X: A! w2 R5 P, M' b5 t5 i# I
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);. x6 f2 s( m- ~7 _2 r- k: b
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);0 R8 I3 Q9 x5 Z4 H) y  ^

4 r2 ?+ @8 ?+ H- b* H                /* AB Sync Transfer Mode */
4 H+ [) x  ?! r, s* |" R                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
& Z, @" B0 S0 t( y. L5 P6 [' z               
/ r6 y. P- F. p9 b# m$ Z* x# h                /* Program the source and dest addresses for master DMA channel */
8 k. h0 X! X! H                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);4 ~* u5 E7 i/ m# X
                paramSet.destAddr   = (uint32_t)(ping_buffer);; W3 `4 z1 d" ^1 [. g( J
9 p  k6 Z; R  T1 x1 C+ i
                /* Write to the master DMA channel first. */
8 c9 ?' s6 f; U# k                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
% K' A8 I  `+ x$ v& \    }       # [! ]" t% x( d

8 P. c- D7 ~+ s) I; f0 p6 A/ o  v: c        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ g! j: G1 s6 V( [       
, N1 H1 {' m; m4 T9 w' J    if(result == EDMA3_DRV_SOK)
. Z4 g& V& ]6 r% G+ t    {# v  {& Z4 }/ J  n  N
            print2arm("edma3 driver init success.",0);
  _. M6 v1 ]0 i7 j% Q8 @4 G    }
0 e- `6 n5 l6 D3 a}( w5 j5 v+ u. t% U( E
. G) Y& g. E: d5 |/ S. v
) t5 D% T+ A- n5 I8 v( f7 u8 P' _
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 C- p+ S  A7 l4 \5 j" t

/ s1 [) d* C- y8 t) |
- u0 a  t/ @% T0 @& ^9 Y
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47; `. R( d( [. V) U+ X, F
每次DMA传输完成后都要再次使能传输
0 q' Q: P: w5 }" O8 {
原来是这样,我明天去试试,谢谢了!




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