嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' P8 E2 U# `+ T6 _( ^( C- u#define  PING_PONG_ACNT          1! q$ _9 c) F( f1 W7 Y: F
#define  PING_PONG_BCNT          8*32*40 , V6 d* S$ F% A6 X8 M! B9 k# L
//#define  PING_PONG_BCNT       1
5 j3 {& T( O& n7 b#define  PING_PONG_CCNT          1
/ B, ?1 T, ?, o% m( B) B' v#define  MCASP_BASEADDR          0x01D00000
8 R" w: k# J* a: w/ \#define  Mcasp_RXEVENTQUE        (0u)
5 i5 d1 }. R) A7 k& T" u3 r& [, T& x# F6 y7 ?. ^
/* OPT Field specific defines */- H, L! D" \: u/ c
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)) C: T$ f9 S4 _/ i2 P
#define OPT_TCC_MASK                        (0x0003F000u), S9 J! m" w4 S0 D; E
#define OPT_TCC_SHIFT                       (0x0000000Cu)( v1 i, H8 `0 a6 I9 h3 m  |7 R
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)# h- E4 \# @# W) f% N
#define OPT_TCINTEN_SHIFT                   (0x00000014u)* o9 D0 m; p+ \( R2 v9 w1 v

$ R: e9 T4 s# F  g! v8 w1 i* `char ping_buffer[PING_PONG_BCNT];6 F8 X- b: T" w) q
char pong_buffer[PING_PONG_BCNT];& p1 F( T9 D, w: p% [" g

. j9 K1 B: i; Q8 S2 d7 [' s- L# f/ g& j0 U1 x/ w" k' ?4 K
, `  i! f8 s" s& n& x! C- S: [
) O4 j# y, {' d
static void ys_edma3_init()
. R% g/ X* g7 `0 o{
- _! U$ r! E8 P        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};; V8 K  F8 p% H; S6 Z# o: P# E" G' i
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;+ f4 j- e. ~9 A) p! O& A
        EDMA3_DRV_Handle hEdma;
% s# B. I, P3 p% [' W    uint32_t chId   = 0;
% Q9 y/ S7 A7 @    uint32_t tcc    = 0;
9 u4 ]( H+ ]$ s2 n
8 l- w5 r3 z8 A1 \    print2arm("edma3 driver init...",0);9 Y9 V* P& k' o8 H- y

4 t1 r7 Q: E* h5 ~5 a. ]& O        hEdma = edma3init(0,&result);
  p1 p& @) @; f: h% {6 C& ^, I* e        if(hEdma)
3 K; F: o% ]3 ?1 I$ p" o        {
/ e9 n* b0 o* e) a' n                print2arm("edma3init() Passed.",0);4 Z7 C7 r4 r  v3 r9 P( y" e
        }
" L& S5 k; w- e        else
9 M- m* u7 b% n+ [, S        {# [- n0 K$ F. U, f% @$ N
                print2arm("edma3init() Failed.",0);1 H" P- ~- E% l! O
        }2 Z' ]0 J) i" R5 @$ c- _, d
        8 a8 S) U$ C/ Q8 X& q
        if (result == EDMA3_DRV_SOK)1 g- ?/ a7 K: Z  o
    {
# s& {5 X; c" i+ t                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,5 }+ D* I2 h  {9 N% @  k: n9 R
                                                       (EDMA3_RM_EventQueue)0,% @6 l3 m! [( R: t( L
                                                            &edma3_isr, NULL);
5 c6 W) U+ i1 A/ K    }  T7 Y/ i: n5 E( w( [) J
       
: x- L) `* o, i# n        if(result == EDMA3_DRV_SOK)' t) V, O( F+ R" \
        {
- L/ c, e. O. X0 {) ^                paramSet.srcBIdx    = 0;
8 Q+ [* L; Z8 Y, q                paramSet.destBIdx   = 1;
9 F& x% W) z/ ?9 S                paramSet.srcCIdx    = 0;; Q; e3 C/ [- A0 z/ R
                paramSet.destCIdx   = 0;2 I2 }3 a  P0 {( W5 k
                paramSet.aCnt       = PING_PONG_ACNT;
5 ?. c' s7 n. s                paramSet.bCnt       = PING_PONG_BCNT;; i( s" |$ V- j; U1 a; v/ L1 d
                paramSet.cCnt       = PING_PONG_CCNT;/ k% i4 ~& e2 I2 d1 g0 E
               
, |5 p7 m6 @2 z                /* For AB-synchronized transfers, BCNTRLD is not used. */
6 P' @2 R" h# G5 [# c                paramSet.bCntReload = PING_PONG_BCNT;
9 u: M  l  q0 ?+ e# Q, K, f& p' ^  I0 o8 @
                /* Src in constant mode Dest in INCR modes */
6 O6 Z, v- C8 K: V# z+ T# r                paramSet.opt &= 0xFFFFFFFDu;2 Q" T' k# {5 q  K
                //paramSet.opt &= 0xFFFFFFFCu;  A7 @( S% N( Y9 j
               
) x  L, k9 i7 `5 R1 ?+ g                /* Program the TCC */
7 x1 r- C4 z/ O7 u& n2 h                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);! L( ^/ V1 j5 j$ N8 ~

5 @, ^, {2 w% ^( i                /* Enable Intermediate & Final transfer completion interrupt */
& J% W& ?" w3 z0 m" \7 s+ B, @: P                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);' l4 F# G8 N; ]2 H' p9 k( N4 B. r
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 e5 b; e9 C, _: @# d! n& e) ]; N4 ?' p* G: ~! ~$ `3 \+ a
                /* AB Sync Transfer Mode */
+ f1 \$ ]3 O! ]3 D; }4 j- S                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 ~8 L" h0 U& |5 L! Q3 F# {$ i4 `               
3 o- @, G2 z& G0 F. a$ w7 o                /* Program the source and dest addresses for master DMA channel */
- Q9 f$ v( d8 N- p. I5 u7 |6 x                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);# L3 Z# b3 t# e. c) q
                paramSet.destAddr   = (uint32_t)(ping_buffer);
% s7 N; n; }* u2 {8 z/ o8 O. N7 Q: `5 \$ n+ a
                /* Write to the master DMA channel first. */
  \1 L+ S" L# U" D: M/ i- V3 N                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);! H! |$ C* u0 z3 t7 O8 O
    }       3 B' e7 \* X3 d; A* v0 |9 r

+ N. b, z* `* n3 e        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);& B4 G( z1 o/ [! I  k8 o7 @1 o  j
       
' n; }$ l) n0 j# |' q. e  j: b7 z    if(result == EDMA3_DRV_SOK) ! }) }. X+ v# r" l' Z
    {
: N# H3 N0 ?1 |2 ^: I, U6 r* k' [5 y& r            print2arm("edma3 driver init success.",0);
; K+ {9 O$ o; {) ^/ B1 Z    } - |' t8 h: E: `, Z
}. K; t3 v  A$ L' x, N% B/ R1 g

+ R5 ?0 _& n* ?
3 t* a8 [/ w) E$ S  m1 t3 z3 }  a: @+ pEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。9 k- d8 C8 B, k6 Q+ y4 ?9 `4 @

/ ~# F. `, I& q6 Z0 Q& C' a
' {2 c/ F! E+ J8 M
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47  O, c) v6 }& s+ \$ ^1 f+ J
每次DMA传输完成后都要再次使能传输
( d% }8 |% N4 r& _$ k
原来是这样,我明天去试试,谢谢了!




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