嵌入式开发者社区

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

作者: silent123    时间: 2015-4-22 22:01
标题: edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
, f( Y. w0 ]' X# u#define  PING_PONG_ACNT          19 v2 k: q. r3 V: G" S! ]
#define  PING_PONG_BCNT          8*32*40 : M! n+ F$ Y! |' w
//#define  PING_PONG_BCNT       1 / J2 b6 f% V: d& x+ [
#define  PING_PONG_CCNT          1
. Z* X9 h& r& ]+ g! v/ L4 }#define  MCASP_BASEADDR          0x01D00000
2 k0 m4 b$ M3 D/ x. ?' f#define  Mcasp_RXEVENTQUE        (0u)4 i+ F) B* P! o! L5 z; g2 l

; l- \& V+ A( D7 {# B3 B& a/* OPT Field specific defines */
, P- g' A' N( C( x- Y6 Y* S#define OPT_SYNCDIM_SHIFT                   (0x00000002u)
$ {$ |8 v' x" F9 X#define OPT_TCC_MASK                        (0x0003F000u)
) P" }$ h# J7 v$ T; M7 C+ x2 i. \#define OPT_TCC_SHIFT                       (0x0000000Cu)
- n2 q. V) L3 [3 L. L4 ^- Q+ t$ ]#define OPT_ITCINTEN_SHIFT                  (0x00000015u)
7 u$ `6 P) U3 v: ^& p#define OPT_TCINTEN_SHIFT                   (0x00000014u)
4 D+ z# a3 O4 O8 e
' l' C2 A5 B$ J7 vchar ping_buffer[PING_PONG_BCNT];( n  ?) y9 F' o6 c
char pong_buffer[PING_PONG_BCNT];# S2 V( q: J/ Q0 e

* Q3 e6 L" R4 f; G; E3 t# k; Q* x% q7 G! i- P  [
; E, @+ p0 o% T, P, j& k1 G+ V& n

" A7 O$ {9 I' L. z" @: u8 ]8 sstatic void ys_edma3_init()) D% i1 [! s+ m- h9 {1 J* M( u
{
+ a5 V: z: {0 h! k( w        EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: V' |) S9 P' z; H; u        EDMA3_DRV_Result result = EDMA3_DRV_SOK;0 X3 \7 R* O0 y  l
        EDMA3_DRV_Handle hEdma;
6 t) G: m! G& \3 D1 m8 B3 J& |% M    uint32_t chId   = 0;9 H6 v- U9 N# \/ Z! ]
    uint32_t tcc    = 0;* w5 w+ L9 ?9 q+ |

, d% v9 [" p2 d' r7 m9 q    print2arm("edma3 driver init...",0);" Z; e# _. k( O
" T, t% o5 R3 [% x4 u. h+ }2 k
        hEdma = edma3init(0,&result);6 |& R4 ~2 q6 \6 z* k
        if(hEdma)
5 ^5 Q, n* \2 j% m        {" _3 l. b; v) J, G
                print2arm("edma3init() Passed.",0);
) f2 y# Z: D) J3 L2 p2 H        }; k/ J" w) B9 K8 T8 B1 |
        else) ~6 {% ~" y7 F. O  L6 f
        {
, d+ p+ W4 u3 v% E. [' J                print2arm("edma3init() Failed.",0);, W; U+ L- w7 n) f# m/ G
        }
3 W" k/ a1 u" z% W        3 O! T* n1 b* y6 j
        if (result == EDMA3_DRV_SOK)
# ^! V/ k5 }: Z% S, }$ n    {
. k8 m% ?, Z! R. `                result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; ?& T! G- |9 i. R+ j4 m5 ^                                                       (EDMA3_RM_EventQueue)0,
% l8 S0 r2 S& D9 ?% K/ z                                                            &edma3_isr, NULL);6 n/ w: b* d4 K5 t% h2 d' m# p9 Q
    }
, p0 X% F7 ^$ U, E% P8 v       
% n, i3 z+ c' _  H        if(result == EDMA3_DRV_SOK)
# e' i. C+ F* y, v5 N  V. \) x        {/ G: [1 C9 e$ Z
                paramSet.srcBIdx    = 0;1 X4 `# i+ C7 m6 i; V2 o% _
                paramSet.destBIdx   = 1;( T$ ^+ j; n0 n! J; }
                paramSet.srcCIdx    = 0;2 q, R  ^5 w% k0 v1 L
                paramSet.destCIdx   = 0;
( H" ^- t3 E; R, B6 j& [! X                paramSet.aCnt       = PING_PONG_ACNT;
* E, x5 P* H0 m1 Y5 D% G- t                paramSet.bCnt       = PING_PONG_BCNT;) {  ^6 n' n8 u  u+ |* ~1 N4 r) `
                paramSet.cCnt       = PING_PONG_CCNT;
0 [: T" z$ e& q. Z                5 t" x+ Y! r% I% a, v
                /* For AB-synchronized transfers, BCNTRLD is not used. */
- @. L) Q$ E; m' q9 V# E                paramSet.bCntReload = PING_PONG_BCNT;  H8 b! v9 ]3 z
$ t5 ], w: A6 L0 G
                /* Src in constant mode Dest in INCR modes */
) r5 R  c" t9 U, _6 }                paramSet.opt &= 0xFFFFFFFDu;2 n/ ]! d/ k$ i, c  Q
                //paramSet.opt &= 0xFFFFFFFCu;; I% d* i8 _3 r
                9 d5 Z# q$ p" \2 s
                /* Program the TCC */
' l! S  w: ?$ F+ n- E                paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
% I- {; g* q7 `; \5 A4 A- C; S& A5 Q1 b) H2 s* A7 z3 ^
                /* Enable Intermediate & Final transfer completion interrupt */
# C8 x) m' V4 e- _& _; [+ W                paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
0 B* \5 A+ m. Z1 P$ x+ ~0 T                paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* J1 Z) Q  _6 k3 w. y
) m4 O; `7 Z2 _                /* AB Sync Transfer Mode */3 q2 u3 r% i0 C8 s7 d
                paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);( U4 J! c7 ]0 U5 g0 _& X  T) G
               
, i2 d9 W+ s/ D                /* Program the source and dest addresses for master DMA channel */
2 u) B$ b4 X, Z, y9 @0 v# Q                paramSet.srcAddr    = (uint32_t)(MCASP_BASEADDR+0X029C);1 }2 N/ Q* _$ U3 y6 w' M
                paramSet.destAddr   = (uint32_t)(ping_buffer);8 |3 K+ @, S4 [: P' d( {' W+ F
! b: u" E8 O* n1 f6 ?$ `6 S  B7 v
                /* Write to the master DMA channel first. */
: f* o$ k( y$ t. S                result = EDMA3_DRV_setPaRAM(hEdma, chId, &paramSet);
5 N  H( y, O$ S/ r  f5 ?    }      
) z) t2 e6 Y7 X' M
0 U/ q4 o9 P; ]! u' _$ a        result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ ~! b8 v: r& Y, V  Y2 G5 C       
/ x' R3 {/ l3 m8 }    if(result == EDMA3_DRV_SOK)
, J" w0 Y' T4 \* N" O    {
# E# C3 c( F! h: Z0 f+ R( x1 g* e            print2arm("edma3 driver init success.",0);7 C, t: F- o9 f, R
    } 9 Z$ m$ d2 ?* }0 `  n# b/ U
}; v" N4 z- X+ P5 `0 V
% C- Q. N  t/ Z1 ^0 H$ d/ K' t

( b4 x, m0 c( O1 R, \8 p- gEDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ b$ I* w. s" Y! ~! |2 ~* ], e7 k
+ o; M% P$ T6 o& g7 z+ `, u" a; _4 C; h1 d) v

作者: Lewis    时间: 2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者: silent123    时间: 2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
* R* H2 P  y/ ?/ Q) x& b每次DMA传输完成后都要再次使能传输
& a6 C! ~$ m9 I! k
原来是这样,我明天去试试,谢谢了!




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