嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 z8 Y# Z4 E0 b) b: g$ ?#define  PING_PONG_ACNT          1
3 Y) w4 |' h" i/ h9 y1 t8 p$ W" [9 j#define  PING_PONG_BCNT          8*32*40
" @3 e% {: z) `' `//#define  PING_PONG_BCNT       1 0 x# h, r% ~9 f/ V4 x7 F
#define  PING_PONG_CCNT          1
1 W3 t9 l/ t# A+ x: ^#define  MCASP_BASEADDR          0x01D00000! x# N5 W+ s4 x# |. W, V& V* r1 N
#define  Mcasp_RXEVENTQUE        (0u)
/ `% X4 t  X  A
$ u: K1 N1 {+ i7 D9 b/* OPT Field specific defines */1 S$ s( i2 I) h* D0 h
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)& _" E/ T3 `6 M0 Z
#define OPT_TCC_MASK                        (0x0003F000u)
3 S: f) L. D% h( {#define OPT_TCC_SHIFT                       (0x0000000Cu)
$ r8 O% h$ ~- K5 h1 l#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
& T" K5 w$ o& G) R& Y#define OPT_TCINTEN_SHIFT                   (0x00000014u)# X  P9 X( g$ C0 p9 {9 J

1 e: j7 F! l0 E2 U) H* ]6 jchar ping_buffer[PING_PONG_BCNT];7 |3 R0 i6 ?/ A$ f
char pong_buffer[PING_PONG_BCNT];
" q# K9 L) d1 G5 v
) K% u8 V9 c2 u8 ~- z) l) t3 A5 Z; i- Z& N' A0 C2 R

( e& [& d6 \* E; m5 Z) O5 K, q
6 P; p" M4 o6 Y6 a# B8 estatic void ys_edma3_init()
$ U5 g. ]+ u: \  Z; t{" e- O) A$ d7 O
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};  d3 e/ }: k, k$ p
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;% H. ~# U0 K7 j. T& A1 m' f! U) ?
        EDMA3_DRV_Handle hEdma;
$ @+ B0 d, ]0 _: c1 ?! y1 ?    uint32_t chId   = 0;
( M8 {. z$ J& K    uint32_t tcc    = 0;
  T/ ]4 U# i( R# H
. s  e% v8 A/ A2 R6 J6 Z- ^" G( D    print2arm("edma3 driver init...",0);* j; c( S. a0 c4 d  ~
3 h; m& }. U" o
        hEdma = edma3init(0,&result);2 G" R# g8 N: p# o7 q+ v
        if(hEdma)
& ]; c/ B9 h, J/ t0 \/ L" i7 d' T        {
7 A) `' z2 }+ J                print2arm("edma3init() Passed.",0);' q0 N) R% ]7 G' x3 z$ o; K3 \
        }7 y, G, r. e1 `2 U
        else2 Z' M6 Q0 i! b# U& E
        {% a: H2 h% j2 d
                print2arm("edma3init() Failed.",0);2 }6 V$ R  B5 |5 w
        }/ m! r$ D; k5 H, f% e3 @9 D6 H
        , H6 _% T% P$ i2 K9 _2 J9 O8 S; G
        if (result == EDMA3_DRV_SOK)
  D1 C9 V( i$ x3 f; n# c4 i. B    {( N8 @) h* U5 c
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
( w% E$ k4 N- \4 A. p) X( y" \4 ?' h2 Z                                                       (EDMA3_RM_EventQueue)0,) x5 h' ~$ G/ W; e6 j
                                                            &edma3_isr, NULL);0 ]6 P+ i- `6 c1 ]- ]& [0 \. K
    }
! m  ~9 k* l1 \6 |7 S/ ?        ; Y2 [& D& j* s6 U$ R  L; H2 K2 k
        if(result == EDMA3_DRV_SOK)) ]4 R# \3 x3 L: w, N
        {
; i" q, S- X  [; F( q$ j" g$ ]                paramSet.srcBIdx    = 0;
, x/ p. j; F4 a1 e                paramSet.destBIdx   = 1;5 [' Y: g/ Q, q% i
                paramSet.srcCIdx    = 0;/ k! W) I$ G) P, x2 O* v8 L  S( b
                paramSet.destCIdx   = 0;3 b. m7 n- g/ h" @. n0 J
                paramSet.aCnt       = PING_PONG_ACNT;- Z% v: M1 _. a0 ]8 D& R
                paramSet.bCnt       = PING_PONG_BCNT;
. C& y5 J5 X7 U' {$ N; Z                paramSet.cCnt       = PING_PONG_CCNT;
0 m7 D( j- N! p& Z5 ~5 B+ _                ' y) o) V( m! H3 L
                /* For AB-synchronized transfers, BCNTRLD is not used. */
) n. M5 H) \  S) t. L( \3 ?! _* }                paramSet.bCntReload = PING_PONG_BCNT;
( \# M4 N; W* y$ C0 k; B/ |7 K2 q. }# a$ R7 t: s
                /* Src in constant mode Dest in INCR modes */- O# A* z4 I$ S! K* H. P
                paramSet.opt &= 0xFFFFFFFDu;
: f8 }2 c: z3 o/ O% N! I                //paramSet.opt &= 0xFFFFFFFCu;" h* {  D" Y8 {0 C
               
, c5 d  ]) b5 ]/ o4 p1 s5 t                /* Program the TCC */
5 M; r% d) w/ \( Z  I* b' @                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
0 Z8 y  ?+ o) @/ ^/ A( Q2 I) v" k- a) X' ?; ]
                /* Enable Intermediate & Final transfer completion interrupt */
0 Z) E# K. U4 K                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
% F3 G+ x+ z8 N3 P1 s6 ~                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);; a# a$ Y9 r) }- i

9 ]; o! d) j9 Z4 N+ a4 O                /* AB Sync Transfer Mode */
1 z) T' D: v- t; e& O$ u6 D                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 `6 J5 `; f3 V$ ~( g               
" g7 I! A+ I" g3 f7 |' S                /* Program the source and dest addresses for master DMA channel */
* u/ |% L) l" O                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);1 w, ?. b/ L2 t
                paramSet.destAddr   = (uint32_t)(ping_buffer);
# M5 n# o& |3 b8 `  a& j) o4 H& L8 U
                /* Write to the master DMA channel first. */( u( r2 j; Y2 o0 a
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);% c$ P& I) M6 h3 G; P: o
    }      
6 m9 i& [( j7 Z  t: J# H7 n  l9 y: t4 N/ \
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);% L3 u  O0 h2 e6 O  a
       
- [1 `/ ^8 M& e5 H    if(result == EDMA3_DRV_SOK)
3 c2 x8 u) ~- e; T    {. @8 f" {# @/ i
            print2arm("edma3 driver init success.",0);
, R1 |( v% v' x& f+ Z: ~4 M  a    }
$ H1 z4 ^, u+ t4 ]}! O4 M, ?( k) |! d% }

, m4 [( G$ e8 S1 \) l1 F, h% Y( {4 n' {+ `+ `. c
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。4 U0 r! F0 b9 J! l  C

' I- \# _5 i0 E8 g+ K# q4 f
3 L+ p- C' i6 {# n% E) w
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47% _. f6 V, _' @1 v8 S  I
每次DMA传输完成后都要再次使能传输
) K( E: v8 `  f! X
原来是这样,我明天去试试,谢谢了!




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