嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:9 L6 Z' e( ^- l! q2 D# u$ Y
#define  PING_PONG_ACNT          1
, ?1 l' J% p/ M3 F* f  S1 o; B#define  PING_PONG_BCNT          8*32*40 " S& {' M9 x- N; ?4 D  |' Y* w0 Y3 X
//#define  PING_PONG_BCNT       1 + C# I- {6 R: u$ h1 {
#define  PING_PONG_CCNT          1/ [6 \% ]5 |$ c9 ?5 n) o- i
#define  MCASP_BASEADDR          0x01D00000) F! ^5 i5 h2 ^7 h& B6 t
#define  Mcasp_RXEVENTQUE        (0u)
& w% S( K3 q) q7 k& S* ^$ ~# J4 O7 E% y& W
/* OPT Field specific defines */
3 e1 t4 w; W; V3 ~$ z6 V#define OPT_SYNCDIM_SHIFT                   (0x00000002u)) E7 L; m1 v3 b! k4 Y" p7 j. P3 d( p
#define OPT_TCC_MASK                        (0x0003F000u)+ J# y9 g( }$ b' N/ d
#define OPT_TCC_SHIFT                       (0x0000000Cu)
/ N0 k, d! u  ~+ @" B# ^* }7 ?#define OPT_ITCINTEN_SHIFT                  (0x00000015u)9 N! U( @0 X- c2 c! ^
#define OPT_TCINTEN_SHIFT                   (0x00000014u)& E' a- j2 S/ m0 z

( ~7 p( T; ]5 Ichar ping_buffer[PING_PONG_BCNT];
' }6 X8 V: \2 J; {1 Schar pong_buffer[PING_PONG_BCNT];$ w% ^% T$ b- T

) B- o% N2 k; {5 ?8 I6 V  X2 f: Q1 b1 ^8 o7 V/ e$ b) W3 H
, l) u! k$ a, B! e: V; {. _

8 V2 {" [: P2 W6 cstatic void ys_edma3_init()' S0 \0 H( _* Q/ l0 P# y; t
{
1 _; t  D5 u  J; X' R; y( C        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% p9 X! P6 I- l+ b7 E: W        EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! w, P* E8 T4 P) u        EDMA3_DRV_Handle hEdma;
; q5 H  {( A. V$ c. A5 y  C* W    uint32_t chId   = 0;
8 ?2 @! m* K  v* P& D$ K4 H    uint32_t tcc    = 0;4 [4 D) a& b* f5 \9 [! T& Q9 [

% q5 ^4 t% S3 x    print2arm("edma3 driver init...",0);
& a0 L# g& y& [9 Z2 `/ l) D7 O* U
! m$ e7 y8 F: v6 F6 H1 O1 Q6 N0 w2 {4 |        hEdma = edma3init(0,&result);; b; f8 |0 v) f6 |7 I, O* f( C
        if(hEdma)
7 s1 u" K% K$ Y8 O1 s; x, Y3 k1 d        {
2 E3 d; M# e6 V4 J                print2arm("edma3init() Passed.",0);
4 \/ N" I  |, H' n& Y4 L* \        }7 t& F9 O) a" i% g  X
        else
6 u9 U4 M2 k  n7 U. e) C        {
: w- w9 ?- R, S                print2arm("edma3init() Failed.",0);3 q& u3 k8 u* f# E$ ~4 G
        }# i+ l4 c5 u: x6 S6 p: g8 C
        3 c- g& }. c% P% c' W  x2 [
        if (result == EDMA3_DRV_SOK)3 {# @1 {. }6 J. b
    {$ t1 u( n/ B, ]- @
                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
0 a  z( n: I* y5 c4 E                                                       (EDMA3_RM_EventQueue)0,. `: i7 L0 ^6 R
                                                            &edma3_isr, NULL);
; \% |0 H2 B) ?: q% p4 d  |* \    }# D8 z' R  }9 c$ a$ U
       
1 B3 z3 k2 k1 f# _9 O" }        if(result == EDMA3_DRV_SOK)
! l  j% u# Q1 D        {
9 g0 Y  u( x+ e/ `. C: r- N" X                paramSet.srcBIdx    = 0;
, ~2 _" I' j* t6 A7 E                paramSet.destBIdx   = 1;
& `( v/ ~1 c1 O! [                paramSet.srcCIdx    = 0;5 x. ]/ o/ l8 j5 S$ U. [
                paramSet.destCIdx   = 0;
# r& D/ @% W# y2 L  C2 W                paramSet.aCnt       = PING_PONG_ACNT;
( [$ D/ ]/ z6 n" I& W                paramSet.bCnt       = PING_PONG_BCNT;' j6 Z3 Z# g/ l) T* D! B/ P
                paramSet.cCnt       = PING_PONG_CCNT;
9 Q; [- V+ T& N7 P0 z$ R               
. A) n0 i* o4 K4 H                /* For AB-synchronized transfers, BCNTRLD is not used. */
: o* j4 ~5 T7 K' m$ L; d, ?9 F0 t                paramSet.bCntReload = PING_PONG_BCNT;9 q, _$ n' \% Y/ M9 @0 d& k4 o

7 K' F7 F" W  v; v9 [                /* Src in constant mode Dest in INCR modes *// o( w0 Y/ I5 @/ ?* K
                paramSet.opt &= 0xFFFFFFFDu;
6 U3 }8 S2 G. X# N                //paramSet.opt &= 0xFFFFFFFCu;
3 u7 V9 I9 B- U' x6 w- `, P* H8 F                % b2 u0 R7 x9 ~7 w6 i/ |4 _+ b2 {
                /* Program the TCC */
. ^0 m" P( V' ^                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
5 p; K3 X" l+ z7 U# \
- V- d- `+ W! i9 u                /* Enable Intermediate & Final transfer completion interrupt */
8 X/ w% _" c# ^( P" O( e$ z                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);9 |# C1 t8 M' C; `
                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* d( D& x* ]& k2 e  h
/ g" x& L( X7 `& G                /* AB Sync Transfer Mode */& q2 N* F' H) j' e
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
! I5 V% w) R- l" X# h( Z4 B1 _                9 b( q2 ^% N/ Y* w0 J' a
                /* Program the source and dest addresses for master DMA channel */" V3 o7 m- U, {$ B& @
                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);
( I, @4 y+ _: K8 M0 w9 a1 Z8 [' T; i                paramSet.destAddr   = (uint32_t)(ping_buffer);: D+ w0 s+ ^( j: n+ c. C
" r$ E! D; u* I! O4 {
                /* Write to the master DMA channel first. */+ M% O5 i0 q6 {- b
                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
3 Y3 v- ~, P. p. K- B) m8 U8 I    }       , x! h) M9 i, n/ v0 ]
4 h5 ~# H4 ^3 o- L: B- c
        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);) f  n2 I  o+ i3 E
        - j7 v9 t# U0 s  j0 c4 Z" s
    if(result == EDMA3_DRV_SOK) % T/ _) `9 D7 Z, |! `. i& L; A
    {
$ N- v1 a" q/ K5 J            print2arm("edma3 driver init success.",0);
; Q/ [# X" K! [9 a    }
$ M. N3 |% f" o* d1 l$ K* f}% }) G+ u4 M/ J2 X7 X, o

* s# L- ^* G6 Y
6 y2 E/ ]2 x/ N9 l; z+ j; I- _EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, v2 D' g# U/ p6 o% z
5 ^7 H0 k7 x8 P3 }1 f7 e
7 _; l0 X; `" Y" |* m9 |4 k' k: r
作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 H6 t- m4 c$ m0 i' X2 Y& w6 b4 U7 `4 ?3 n每次DMA传输完成后都要再次使能传输
4 F' j& N8 ?2 K
原来是这样,我明天去试试,谢谢了!




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