嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
( G4 F9 j$ I% y0 H3 @#define  PING_PONG_ACNT          1
8 Z2 H- s1 K) H#define  PING_PONG_BCNT          8*32*40
8 s/ t6 r  V; U3 h8 z- U  e+ k$ U//#define  PING_PONG_BCNT       1 2 |7 t/ s: K; e3 Q4 X
#define  PING_PONG_CCNT          1
1 f) N0 X6 {9 C9 X1 u' S) L( d#define  MCASP_BASEADDR          0x01D000004 a$ D$ `+ y  ?7 k7 d5 d
#define  Mcasp_RXEVENTQUE        (0u)& q$ ]& h1 f8 {
  S+ K7 T$ p$ }. u4 ?$ P
/* OPT Field specific defines */
; B/ e. T1 O# x- A; w#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
. h, U/ B  _7 Z) b( N% _/ N& k#define OPT_TCC_MASK                        (0x0003F000u)
* W. C( d' c& }' v% a+ _#define OPT_TCC_SHIFT                       (0x0000000Cu)
9 c8 W+ Y) L: C% S#define OPT_ITCINTEN_SHIFT                  (0x00000015u)5 G$ \# J5 I# C1 l6 w& b2 [  x
#define OPT_TCINTEN_SHIFT                   (0x00000014u)
0 _& h9 I! o4 Z/ s  V+ q5 m1 f. o3 H' n3 G$ ]" ^$ J, A1 V
char ping_buffer[PING_PONG_BCNT];$ _9 J- v& U" Z1 J  k
char pong_buffer[PING_PONG_BCNT];
# e. L% B4 u$ S/ _& {+ J2 t6 M
3 J3 H1 V8 ~! f6 c* q; b! z  c5 }* [1 A' O1 Y( v8 C  X' H' k
6 B2 V$ V( {8 _

9 W/ T  U: R$ C/ {( W" _static void ys_edma3_init()
0 h5 Y% F, T/ }{$ e: o3 @4 w  ?4 N1 d0 w
        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};& s2 {- s8 x. z# K/ ^- I
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;- ~4 C1 E; @9 W
        EDMA3_DRV_Handle hEdma;3 v1 g9 e, J9 q! o+ o! a
    uint32_t chId   = 0;( ^  a  _" J5 r  U7 v8 a
    uint32_t tcc    = 0;
$ m: k; z* _) K( d9 O$ ~+ E% Y/ F, {4 ]
    print2arm("edma3 driver init...",0);
! b$ E/ o+ g6 T# j! f; x1 \. j1 T4 O3 U+ I$ H
        hEdma = edma3init(0,&result);' }8 B7 o, r  e2 H
        if(hEdma)4 @: b" R5 _/ Y+ z; J5 u) }
        {8 [, ^% m2 \, a
                print2arm("edma3init() Passed.",0);$ A: D1 n2 Q8 A& ~9 {: A
        }/ {# `; @3 O) g* [- A
        else/ \# P. \3 v* A: B  v
        {
/ n! k" E/ q2 F0 p, W                print2arm("edma3init() Failed.",0);
" L6 T' c) d* L! c        }
* M: k0 J6 \. D+ _( a        * R% d8 p% w1 m  ?3 m
        if (result == EDMA3_DRV_SOK)
( w2 l8 L5 c5 P9 m1 U0 q    {
, {$ x5 J( V4 ^7 j3 Z$ S  ]0 I                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,9 }8 k- H+ ]5 A% U. j2 M
                                                       (EDMA3_RM_EventQueue)0,
7 l* K2 |% D. t& R                                                            &edma3_isr, NULL);9 C  }9 a. N& b' t# Z3 v+ h8 ^
    }3 {/ i- \$ f% l5 h, O2 W
       
" _3 ~. q- u# v9 k; l        if(result == EDMA3_DRV_SOK)# r1 n0 ^) W0 G
        {& X0 Q. o# i6 }' F
                paramSet.srcBIdx    = 0;
& H8 [6 z3 u$ T                paramSet.destBIdx   = 1;
; F7 p  Y; {; D+ w" r                paramSet.srcCIdx    = 0;9 v8 w- }' N8 `( D* z$ w7 D
                paramSet.destCIdx   = 0;* c- x8 i5 o2 Z$ u
                paramSet.aCnt       = PING_PONG_ACNT;
8 k- K& S8 p: v. [  O                paramSet.bCnt       = PING_PONG_BCNT;
; p- ~; }: O4 {                paramSet.cCnt       = PING_PONG_CCNT;
1 m% D6 I3 U' f- }! k               
; X1 w) @( r- F. O                /* For AB-synchronized transfers, BCNTRLD is not used. */& F! V  \) s& |* d0 d8 z& r
                paramSet.bCntReload = PING_PONG_BCNT;
5 |; K7 Q; t- p' j" D) C/ v2 Q6 r1 L9 J' O: [. Q, R
                /* Src in constant mode Dest in INCR modes */+ }+ f. T5 y* d! f; p1 M, O
                paramSet.opt &= 0xFFFFFFFDu;' q' {: H1 E' Y) A
                //paramSet.opt &= 0xFFFFFFFCu;" c0 i. v+ ~% q. G9 i
                / k) Q) T, ]( a* g1 }
                /* Program the TCC */
% {# D2 Z/ R7 g5 g" T) ~                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);( P( a, f  u4 W( Q) i! i. w
5 t& Q4 Q8 y' }7 X
                /* Enable Intermediate & Final transfer completion interrupt */; A. H! @' k5 t. n0 y2 ~
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 u* }; ]  @; ^0 D  {                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
- H7 A/ C; M7 K/ [+ ^: R" s3 a' N/ |, ]! y+ \* k; d5 }
                /* AB Sync Transfer Mode */: \' @) i5 N# {
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);$ N/ N) x' w2 S5 }: w& [& D
               
; [7 o4 ^% Q* O                /* Program the source and dest addresses for master DMA channel */+ @. q! S9 H% c$ {2 l9 L9 j
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
" G) r2 P" y- a  q                paramSet.destAddr   = (uint32_t)(ping_buffer);  X# f, Z& I7 {( ~  I

# n9 Q& K1 B/ d' [                /* Write to the master DMA channel first. */
+ H" z9 Y  v0 h% L$ Z9 N                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
2 G2 `2 ?' `- z9 j1 a( q    }       - K  k! g4 ~0 v" z* \$ n

: B  H* e  P. S' j5 y; Z0 ?) \6 O        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
' E$ p+ h( K1 J7 j' @) C2 r       
, m* s/ w$ P" d    if(result == EDMA3_DRV_SOK) 6 J% _% b2 f& h
    {* _% E$ N4 H4 c9 J' J
            print2arm("edma3 driver init success.",0);; f  V$ v8 l7 ]; s6 q/ {: j
    } 0 y$ c/ j/ f5 z, G4 s
}
" \5 U: X; u6 k5 p2 L0 F  b# v: I7 G, i
( e: j' ?" a4 e. `3 ~& V
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
& R; J2 F# q6 {: h% X( d7 a9 f) H
- k9 d$ T7 `) X2 M, D2 c1 ]
! ^4 }% v" L2 U. f
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
) `) A  l" {% s每次DMA传输完成后都要再次使能传输
* v2 ]% K7 B+ d
原来是这样,我明天去试试,谢谢了!




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