嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:$ A# @7 O! s, O, N" }6 U
#define  PING_PONG_ACNT          1& I* o; i: S4 A3 ?- J
#define  PING_PONG_BCNT          8*32*40
2 P* \! A) P2 G0 g  c! F" ~- n//#define  PING_PONG_BCNT       1
8 c/ l. j; X6 H* S2 r7 \% T# A, x' @8 Y#define  PING_PONG_CCNT          1
3 O. f7 E6 s  M$ `3 d& a#define  MCASP_BASEADDR          0x01D00000* Q9 c$ J) _- c
#define  Mcasp_RXEVENTQUE        (0u)# N+ v. N4 V6 {! H" |& i) c/ `+ @
! j- |5 X( Z4 _; b1 u
/* OPT Field specific defines */8 \) P; {' [; e
#define OPT_SYNCDIM_SHIFT                   (0x00000002u): ]( q, u% t- `- g
#define OPT_TCC_MASK                        (0x0003F000u)' v, j2 K: D) J
#define OPT_TCC_SHIFT                       (0x0000000Cu)
. ]( u" U; }  M+ E% g* L" b( v#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
. J+ q8 T8 C* f7 R9 O. p7 h#define OPT_TCINTEN_SHIFT                   (0x00000014u)
8 T; T2 d$ V+ N7 W3 U! p1 i$ J+ e/ H5 P- {+ ?% |# l& c
char ping_buffer[PING_PONG_BCNT];
1 T+ E7 N1 l5 v" Hchar pong_buffer[PING_PONG_BCNT];; `1 D2 }, e! d+ p

, D( ?* n& h- t. M% V: r
3 W2 F% M. V& J0 s# p& j; R9 T
$ w, ?, _7 b; {+ }$ }+ r0 z
% h5 \1 C1 q+ d7 \! J% R+ Hstatic void ys_edma3_init()
' F: F1 `1 Z% a. G+ w$ @4 l{
: c; U$ T- ]4 e        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};6 h/ ^9 d5 Q$ y5 U8 U
        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 m# D7 y! }% p$ W, S9 z        EDMA3_DRV_Handle hEdma;( g; E' g, S8 P. P, |5 l
    uint32_t chId   = 0;  J  V6 I3 B. ]6 d  `5 U
    uint32_t tcc    = 0;* T# Z2 X% Y/ E5 Q% L
' M; ^' x/ Z: I0 ~0 }
    print2arm("edma3 driver init...",0);
5 v( h6 E7 B3 N) F5 P: a6 u, F' j- X
        hEdma = edma3init(0,&result);
0 h* n% L+ @- g$ h1 `6 v        if(hEdma)
5 g9 F; {5 }5 }, t! C  T' u        {
0 f! q4 A) v; J1 k% x1 t                print2arm("edma3init() Passed.",0);+ L+ u7 C& }; P; v5 D8 x  y
        }
( L2 b  C: y7 w- `4 C. c( g        else$ ]; R8 {0 L' m+ y$ s/ P0 u
        {
5 [$ a& B" w; G  F8 }                print2arm("edma3init() Failed.",0);7 k/ V4 a4 f% D; I
        }0 d, s# M# |2 l% S2 L. O3 H
       
- H- P1 B2 c2 y& T# Y6 Q        if (result == EDMA3_DRV_SOK), x# N" o$ P/ {7 h( x1 ~: o, I
    {
# x' G4 K0 j1 }6 X: T                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc," r, e* q1 s0 I& E- g
                                                       (EDMA3_RM_EventQueue)0,
. o% l( `+ _8 d                                                            &edma3_isr, NULL);1 D1 G; U0 e: G$ k; l9 B3 \
    }
5 F7 C/ a. u, C3 c: @1 i" p, ~       
! P9 I& N- W5 h7 w. Y( b4 Q' O        if(result == EDMA3_DRV_SOK)5 C! m3 \/ g, q( n& m
        {: ~" n0 }; u& `0 B0 X8 L1 J
                paramSet.srcBIdx    = 0;
6 J' `' @! h9 W, n4 i. R) o                paramSet.destBIdx   = 1;" I5 P$ |0 ?: M' |
                paramSet.srcCIdx    = 0;( }/ ~, D# h2 q1 I% ?2 L3 p+ b
                paramSet.destCIdx   = 0;* P" v% g9 H  b& [
                paramSet.aCnt       = PING_PONG_ACNT;
- E, J/ p. m; {                paramSet.bCnt       = PING_PONG_BCNT;
+ u: E/ x( @- \                paramSet.cCnt       = PING_PONG_CCNT;2 V& y* w* N  c2 I" S; }
               
) D! E0 u9 T' s  ^* U7 K/ h                /* For AB-synchronized transfers, BCNTRLD is not used. */$ g& H" E4 _1 G2 J7 g3 e: u
                paramSet.bCntReload = PING_PONG_BCNT;+ j, j1 ^9 m) z

: i; _) C6 [2 Z; ^- `8 x9 r3 G6 m                /* Src in constant mode Dest in INCR modes */) k5 r) D- L/ _3 Z+ P9 M! N1 d
                paramSet.opt &= 0xFFFFFFFDu;
, g! |6 |  C3 M/ J8 M8 x                //paramSet.opt &= 0xFFFFFFFCu;9 x9 V5 @! T8 Z& b8 m0 c5 a
               
& `% `0 i+ R6 ]* i- Z  Y# Y( f                /* Program the TCC */
' s) J# `1 I6 b5 w                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);. ?$ Z3 Z6 n( y" D+ ^% E

: f9 e/ ]* e' H& O4 P                /* Enable Intermediate & Final transfer completion interrupt */
7 l& ^/ @. ^: o                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);! |5 |- s1 q3 {$ R7 k  k
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);- n7 l4 D6 _% n9 p. c- J

* i/ i; |, {- n$ \9 c" Y. a                /* AB Sync Transfer Mode */
- v* z+ b# u, `9 u! X" _                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);4 t: }1 T$ g, @) r. S) d
               
& ~$ J! [  E8 w2 i  ?                /* Program the source and dest addresses for master DMA channel */
5 h) j. N" w; f* o" O                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
# Q: w  S# \; U7 X4 v. g3 `                paramSet.destAddr   = (uint32_t)(ping_buffer);
" ^4 L/ w- R3 o% ^% ]7 T( d7 W% F- h+ J: W& W
                /* Write to the master DMA channel first. */! C$ @6 h* o0 h: Z/ m4 N; j
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);- W9 b, I( ]; ]6 s
    }       5 w: B( Q! p8 }. s: f/ ^

. o# V. @3 B5 V+ G8 @% T+ O        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
* C8 `: }, Q8 G( p8 }       
- R4 i5 j) y2 C* |% x    if(result == EDMA3_DRV_SOK) ) V$ U, I/ I3 W: G
    {
$ w( ]$ |% n; J" k            print2arm("edma3 driver init success.",0);
; F. F2 T: C, v2 v    } ; N+ ]% C# c! x9 F- b2 N. c
}
4 E& }' R3 P- A$ {% W3 ~# L2 T' G. Q: P- d: |. t& w; I

" [8 j% h3 Q4 e/ _- E7 v( I0 a' IEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
: p, d' F8 @8 g* @1 u, p9 D" y8 O8 Q/ X' R' ^0 p$ ^8 T
! p- C; }, Z3 o. _3 j3 v8 M

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 {" Q1 T- b2 b8 ?每次DMA传输完成后都要再次使能传输
- g% F6 D/ T4 Y6 Y. |! c! c7 ?
原来是这样,我明天去试试,谢谢了!




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