嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:+ m6 ~* @" Y5 _4 h! X: P+ R7 S' i
#define  PING_PONG_ACNT          1
2 h: g/ L: B+ M! R( p#define  PING_PONG_BCNT          8*32*40 . G7 ^0 z! \+ X. c. E
//#define  PING_PONG_BCNT       1   D2 A( Q1 v* e3 x* D& i
#define  PING_PONG_CCNT          1( l* ^' e0 }3 E, o9 R  X; E/ F' Q
#define  MCASP_BASEADDR          0x01D00000* L3 V0 x3 W* w8 t
#define  Mcasp_RXEVENTQUE        (0u)3 z$ }# ?- E( S4 @
! L2 K0 [( C" Y% G7 c7 p
/* OPT Field specific defines */
; N2 c8 y( K0 v1 b2 S#define OPT_SYNCDIM_SHIFT                   (0x00000002u)* a, \" j. @0 F& L1 Z. K+ P5 Z
#define OPT_TCC_MASK                        (0x0003F000u)
) O3 V. \1 l6 d8 B7 w3 w#define OPT_TCC_SHIFT                       (0x0000000Cu)7 O0 }& d% S  a2 ?$ l+ `1 F* y
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)6 w5 P0 J; ^5 w: q, G* W, H1 h
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
7 S  e- ~- ^! h, K& ^. G) @3 U; {+ g# m/ W3 m# |3 ]1 P7 |
char ping_buffer[PING_PONG_BCNT];
$ h. [0 n) p4 D" D6 f* |5 s9 l; echar pong_buffer[PING_PONG_BCNT];5 K2 Z& ^7 o" P2 E* \

0 D# `8 W) d6 k8 w' e$ T' E
. f$ z+ R/ r1 N) U
( O6 ]1 r( f6 g; G# m
0 c! S  t5 x' K# @3 ~static void ys_edma3_init()& G+ d5 m, p3 L  R& N2 `- |
{+ L: F( x  Q. K/ |% ~3 D9 A
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. D' m4 R& g0 B3 X# A7 q: O        EDMA3_DRV_Result result = EDMA3_DRV_SOK;2 U$ h6 ^( ^4 W1 ?
        EDMA3_DRV_Handle hEdma;
- o* q- ?! m4 {! c8 ~    uint32_t chId   = 0;
* x3 G+ W# I9 ]1 ~3 J- w    uint32_t tcc    = 0;4 N6 E7 ], K- M/ E1 N+ S. x1 e

7 j6 P) M/ o! F# x8 k! c0 @0 w    print2arm("edma3 driver init...",0);& C6 f/ I# P: r. R4 n/ B

3 J* D8 O7 O4 T: m3 Z: C# G9 S        hEdma = edma3init(0,&result);; d! r" h$ O6 I1 M0 |! o& C
        if(hEdma)+ B& V5 P& k$ F& _
        {4 X. @' R8 i: t9 l0 ~
                print2arm("edma3init() Passed.",0);9 P* [6 n1 O9 \! b- u
        }9 O! `" K* A. |
        else# l, V& ^6 o/ x" _
        {
) L" I2 [4 f" m, m1 c/ ~5 @                print2arm("edma3init() Failed.",0);
* w) c3 t7 E4 z! h; G9 z" k        }+ T1 b! L2 c. w4 P
        ) A, j& Y8 m9 a
        if (result == EDMA3_DRV_SOK)5 O# T- f# }) \3 W3 [5 R$ b
    {9 v! d! T$ s& L0 r, e
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," [) M* F4 w& y- I3 f+ z$ E
                                                       (EDMA3_RM_EventQueue)0,
& P* |4 |3 G' q/ E                                                            &edma3_isr, NULL);' i- a- o; R7 v9 U* ^+ y( ~% T2 H
    }( j5 Z* E6 e3 W* D
        # y1 c3 s& B* F  X- v; B
        if(result == EDMA3_DRV_SOK)4 ~* i: u: H4 I# }
        {9 E* ]  m! f4 ]" p' S/ `9 }
                paramSet.srcBIdx    = 0;! m1 N9 _5 C7 G# V6 [
                paramSet.destBIdx   = 1;
+ d/ R1 W1 q( T/ z) E3 N0 E                paramSet.srcCIdx    = 0;9 {% E0 [( u! j. Q- b
                paramSet.destCIdx   = 0;
  N. p' s' q0 Z2 V  z8 R                paramSet.aCnt       = PING_PONG_ACNT;
9 t' Q* {+ ^3 C                paramSet.bCnt       = PING_PONG_BCNT;
+ g; O% k5 X6 }' L% g1 M/ Q                paramSet.cCnt       = PING_PONG_CCNT;# O* D# q4 E0 D  n6 K5 O* g% @
                6 p/ a3 Z% i1 I8 Z
                /* For AB-synchronized transfers, BCNTRLD is not used. */& j; Q+ }; V) g
                paramSet.bCntReload = PING_PONG_BCNT;
' z7 G# [! r: u# O7 V# L7 w% o- N& s! X) {
                /* Src in constant mode Dest in INCR modes */
0 I& g  |8 w6 E                paramSet.opt &= 0xFFFFFFFDu;
  n: R+ }1 V0 Q6 ]                //paramSet.opt &= 0xFFFFFFFCu;9 j9 a$ R6 m; `& ]6 b
               
% O% R+ {2 j  Q  `( G6 u                /* Program the TCC */' T) `6 n3 ^/ x! t+ P
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);/ o% |, A. ?$ Q: f
9 F( |0 y% |$ u
                /* Enable Intermediate & Final transfer completion interrupt */9 e, i7 f8 l' a0 b
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# i# e$ q  w6 |0 b3 Q3 r                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 T3 Q) q) H. V6 K
* a/ v" |8 {& B* H, z0 V                /* AB Sync Transfer Mode */$ q' F( l# }( n( w0 X7 v
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
  t6 l) Z8 y' {6 [' w4 r' g               
* g  Z1 p4 C7 F! b. [                /* Program the source and dest addresses for master DMA channel */, H4 h, }2 r: G. [) j; {0 i; T
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);* M/ H9 [; N. B2 V9 E
                paramSet.destAddr   = (uint32_t)(ping_buffer);
3 n* ?7 r: h7 d; L- e- C
: j# ^) s7 }* x1 a: A. ~                /* Write to the master DMA channel first. */
/ H' n0 ^& G- _; U                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);; L" U3 m# q. l6 R* w" l" {
    }      
+ ~6 O0 w& |: O- W; M. W" u! {7 d  J3 p6 [; V
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 ]7 J! I! l; ~0 J3 T/ ?
        . f. O- d5 x' @) W6 S" c0 `7 D' k
    if(result == EDMA3_DRV_SOK) ( Y' A% x7 N, M' ~  @: T# C
    {
# |1 r; L2 b+ O* d+ {- I7 `            print2arm("edma3 driver init success.",0);
( Z4 r  T7 Q8 Q! I$ y: K    }
* d: L" n0 k, ^) X. S& O$ }3 B9 f# b}8 w; p" ^% b. S

! s& k& R) [) U; j5 M% f2 z. I, I$ v. l; R" A# I& q
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
1 M& b3 d- }4 Y
  y0 K6 E9 z) f9 {4 P8 i! b: ~% A  o. J: j% o, |

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
- a2 F( G$ v0 w" w" G- Q% Y" V1 O每次DMA传输完成后都要再次使能传输
" I* G8 S- S$ a/ ?" M
原来是这样,我明天去试试,谢谢了!




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