嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:7 |9 g$ }1 s# _; H- r9 Y7 Y& q+ n
#define  PING_PONG_ACNT          1! V, l7 L) R& [
#define  PING_PONG_BCNT          8*32*40
3 G  N- l9 R3 N! j& ^//#define  PING_PONG_BCNT       1
; K0 s, \8 W. p0 Z#define  PING_PONG_CCNT          1, y: w5 J8 `# L, _: }9 R# n# P2 w
#define  MCASP_BASEADDR          0x01D00000
" m$ p4 n* L1 g# l* ~: W#define  Mcasp_RXEVENTQUE        (0u)
7 \0 a5 {7 H6 F/ \& \. o2 L2 h* v0 W
/* OPT Field specific defines */6 l; L8 R+ y8 C1 D! H
#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
' p, s, Q! y/ D% h  W1 j: N#define OPT_TCC_MASK                        (0x0003F000u)
3 A# V7 o4 D% }3 C* B* L8 l; z" i0 Y#define OPT_TCC_SHIFT                       (0x0000000Cu)$ d6 Z' W, H8 x1 G5 _0 {  H% R2 c
#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
1 [8 r3 w0 a2 R3 V! E. {8 w9 `#define OPT_TCINTEN_SHIFT                   (0x00000014u)  H9 j8 q- m6 s% }

9 p6 b( z) B5 Q3 x  M' n6 Xchar ping_buffer[PING_PONG_BCNT];' a( L) \+ j) O$ K5 ~6 s  F/ k! T
char pong_buffer[PING_PONG_BCNT];6 ?' m4 ]: i- I& o% c

8 Y4 W% u  X9 D$ D/ E1 T% y. y( ~. ]* g( O3 M) S

' t- N" l2 e& P5 W7 P/ U
2 H- v& [- K+ Y0 f/ |7 M9 Astatic void ys_edma3_init()3 J+ i5 O* @! M. N6 R/ r
{
/ n- N$ T( a/ K8 V, P. G- [        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
, r% v  a: e% W2 R5 v, n: b        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
6 a3 Q' K4 N& W# B: R        EDMA3_DRV_Handle hEdma;
( d' G# |$ `4 Y) r  Z0 Z" W. W    uint32_t chId   = 0;
$ ?. q4 Q8 g% W/ j    uint32_t tcc    = 0;6 O1 F: F  m* D& o5 p" s

' }! e/ T/ K  z& a! x8 U    print2arm("edma3 driver init...",0);0 Y9 Z+ n7 J* C4 e
. R0 \$ e% M% w* A' P" L+ J/ g+ X
        hEdma = edma3init(0,&result);
* E( |# h7 k2 \. }  g* g        if(hEdma)
* X! {$ t, L% W) `& B        {
/ s  s' _1 w# Y3 C2 @% |, D                print2arm("edma3init() Passed.",0);5 I) j4 D% j6 }$ {3 `4 f
        }& E2 N. A# [) k. s' F8 j! A. D
        else
" ?  z5 ^8 ~/ o. |        {# i5 h; \' y- L( w! ~! \4 G
                print2arm("edma3init() Failed.",0);; d2 A) S9 P0 ]3 U
        }* R+ c* P$ z8 X" s- R* Z
       
9 |* x! p' ~5 w1 J        if (result == EDMA3_DRV_SOK)
2 x! p9 \# W) r; D5 F    {$ \9 e7 a" \, V: j% S
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,3 z! l- N4 H9 p2 k) }
                                                       (EDMA3_RM_EventQueue)0,7 R6 w3 K7 u9 e5 k3 P. s
                                                            &edma3_isr, NULL);  a3 Q  \% a& l
    }
) ~5 c$ p  X; M% z! J- Y% k3 U       
% o: I8 W6 Q( o  x* w        if(result == EDMA3_DRV_SOK)/ w. W. z' N! ^, K) p2 j* E( t
        {
* \- x* A  r* o5 V. [# Q9 R+ a                paramSet.srcBIdx    = 0;" A" ^) p% G- p$ x6 O
                paramSet.destBIdx   = 1;/ P$ O% {! ]* Z6 x
                paramSet.srcCIdx    = 0;9 Z1 U7 D6 n$ x# v
                paramSet.destCIdx   = 0;) O/ {* k8 z, K' s; y5 @) e; |& ~
                paramSet.aCnt       = PING_PONG_ACNT;' l' q2 q8 ?. z9 o  E& s
                paramSet.bCnt       = PING_PONG_BCNT;
9 J6 T1 C" L4 P$ y  J% \                paramSet.cCnt       = PING_PONG_CCNT;$ u; o" [$ _9 C0 c
               
! u) m$ \8 N( L                /* For AB-synchronized transfers, BCNTRLD is not used. */. J0 R, W! V% }8 v9 k
                paramSet.bCntReload = PING_PONG_BCNT;
8 a6 `' y* h4 v! H0 M- N6 S0 f* O
* F. e* X) V- S: V/ _/ A                /* Src in constant mode Dest in INCR modes */& L" F  e! v$ T' w' a# Q
                paramSet.opt &= 0xFFFFFFFDu;
* S! ]$ N% E$ Z3 ]                //paramSet.opt &= 0xFFFFFFFCu;1 v9 {8 b/ _' w" N+ i% x5 ?
               
8 }/ `! V8 ?- X. e$ n                /* Program the TCC */! N+ {* D; @$ E6 {. `4 |' W
                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);1 t1 ~% Z0 U- u) K( t

: \: e0 L0 U. X& L! g                /* Enable Intermediate & Final transfer completion interrupt */$ g4 S3 U% w" x% n) r
                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
; H* i# c0 W8 a  K# M" M- n3 g7 i                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);8 o  \" @7 K0 @; K, m" M( y2 [- H
  _  {, f) v" ]
                /* AB Sync Transfer Mode */7 ?; A- c' M3 P) `/ ?- Z
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" G+ N) l$ e  u& W5 U1 |. F. G                7 m9 n9 U& d$ s7 G
                /* Program the source and dest addresses for master DMA channel */. U* D# a7 ^9 b5 e9 M3 ]9 Z- ^6 s3 Z
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);; L4 ]3 w$ w3 J! @4 U; ^7 @) m& i
                paramSet.destAddr   = (uint32_t)(ping_buffer);
6 U5 L* P: U/ q% ?% C% f
9 |2 N) y& m& S4 w                /* Write to the master DMA channel first. */
; |6 d3 j, W7 V9 x2 t, R                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);, c  Y1 Z3 G" @
    }      
$ j4 a8 J/ G+ o& q! ?7 @
9 [2 Q/ p! z: P- {        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);2 D& P7 C. [! F
       
& }& P' J6 u9 ?# }: t( Y/ F    if(result == EDMA3_DRV_SOK)
# D) z0 ]. N8 X3 X+ N    {
, N) a, ?2 W+ C' f0 Z            print2arm("edma3 driver init success.",0);% q" }1 L& n  S6 S
    } ) P) {: f8 S/ p: R
}. H6 N9 [* G/ X8 v) [7 P
; m) V. j8 T9 w5 G

8 ]2 q1 v# y7 Z! R( F' REDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 K) O- }0 J) F1 b
  R6 h  r, Y0 v. d4 S  V
( g; W' x1 F( n' V5 `- u$ H2 J
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47( I1 E+ g0 Q, [, U5 \/ ]
每次DMA传输完成后都要再次使能传输

0 O& ]+ {/ n; k5 F& t: X  }4 p; x1 {原来是这样,我明天去试试,谢谢了!




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