嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
8 D. W [2 [/ y, t9 w, h7 j+ j
#define PING_PONG_ACNT 1
) V3 ~: p, H, C( A0 @$ a0 i
#define PING_PONG_BCNT 8*32*40
1 E6 f/ |" r( H/ `1 o
//#define PING_PONG_BCNT 1
5 Y, U1 E9 u: @3 e- O1 u) y
#define PING_PONG_CCNT 1
4 o( W" p/ |1 C) X0 r- D( b2 b" l. s# w
#define MCASP_BASEADDR 0x01D00000
$ u+ R2 e* b$ i
#define Mcasp_RXEVENTQUE (0u)
' \) c( t, f- S; W7 W
& j, B0 K1 n& T' y
/* OPT Field specific defines */
9 }. o" i# W- Q, T
#define OPT_SYNCDIM_SHIFT (0x00000002u)
k7 a" ]- j- K" O3 d) }4 {" M
#define OPT_TCC_MASK (0x0003F000u)
$ t- o8 L0 B: I* \5 x t5 }
#define OPT_TCC_SHIFT (0x0000000Cu)
8 P. x: R$ Y4 c" o
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 E& F8 ^. J% P3 E, b: A6 X
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 ~& d5 c9 R) m" P" q
1 g' E; q( A; m2 T" V
char ping_buffer[PING_PONG_BCNT];
" r* V% W0 h/ O
char pong_buffer[PING_PONG_BCNT];
* j0 @: u5 ~" ~) q
* @; `' D M# L
0 {$ w3 a4 D$ O- U, e1 V8 w* E% V
+ ]4 z; [0 z# Z
8 |+ `) H2 E' _1 F' F& k( o$ Q
static void ys_edma3_init()
& M. ~. f" x% P" \8 g3 ^, s+ o1 ]
{
2 r0 U; }4 I9 ^1 N7 i( F
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& _- y/ ?# j# h
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
7 ^5 z N, b. C. {6 j1 x
EDMA3_DRV_Handle hEdma;
$ D$ T* g. u/ V. i. Z1 u% g; b
uint32_t chId = 0;
3 n; T' \0 L+ F" v( F
uint32_t tcc = 0;
: m0 B& ?) {$ U( X6 H% Y4 Y. \) m, H
; ~. Q$ w' |1 W
print2arm("edma3 driver init...",0);
' m! u6 W2 N& ^' z0 q( F
( L6 u8 [8 B( X3 Q
hEdma = edma3init(0,&result);
0 Y3 f; ?! g# ?& K
if(hEdma)
$ o' E9 X; ]. z8 l1 |9 ^: M* |
{
) y0 C! g- l; K4 R2 i+ b# Z+ [1 K
print2arm("edma3init() Passed.",0);
( E+ i& t. Q' S3 o+ R
}
" l$ H* K' U. v: U& G
else
! F+ j5 v2 j' D% T# W+ t7 [
{
6 m3 T6 z9 V' Z9 R- ~
print2arm("edma3init() Failed.",0);
# N$ M( d5 |9 ^5 L
}
/ z5 h- f3 F; w) Q
) k# M8 R6 Y n1 }' }) q
if (result == EDMA3_DRV_SOK)
. x4 n. Y( s, ]; S, z/ I' X
{
# [* X7 G/ V: @5 Y6 K! J$ T5 W- i
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; q" }9 F- c) R5 J0 |
(EDMA3_RM_EventQueue)0,
4 W3 D" Y% O' I4 C8 U* `% L
&edma3_isr, NULL);
5 H6 @9 V: W, |' K
}
" ]0 X; G3 {% s" C7 `
! B' s3 V! C3 u4 \6 G9 l
if(result == EDMA3_DRV_SOK)
) C4 _, f( \; ^
{
" b' Q; M, V3 g4 i! X/ i
paramSet.srcBIdx = 0;
& s3 p4 B. x6 A4 F( j
paramSet.destBIdx = 1;
2 b# E7 G) R! ?
paramSet.srcCIdx = 0;
! a* E+ l" Y @! X0 {
paramSet.destCIdx = 0;
7 K- Z1 n' ~( k/ K
paramSet.aCnt = PING_PONG_ACNT;
# H i z2 o& A: [
paramSet.bCnt = PING_PONG_BCNT;
4 W, h# R& L. m1 Q6 ]3 g" T% t
paramSet.cCnt = PING_PONG_CCNT;
) y, X0 L& J4 P9 H3 i: J6 ?
& z7 Y+ p$ e3 ~- E/ @- S' ~
/* For AB-synchronized transfers, BCNTRLD is not used. */
8 c2 l! Y& Z/ p, i" A
paramSet.bCntReload = PING_PONG_BCNT;
) W, f9 H2 Z; x7 v5 q: s
2 c/ g" y( Q6 S: j! x" {% S. j
/* Src in constant mode Dest in INCR modes */
- W$ E% C# a! u1 d
paramSet.opt &= 0xFFFFFFFDu;
% i( B- S) b- S
//paramSet.opt &= 0xFFFFFFFCu;
# i" u; X+ p" y$ _& @. T6 N
8 s& K0 k3 H4 a4 {9 s4 |7 e
/* Program the TCC */
) d) k8 h7 s6 k4 m- G+ U
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
' Q* G; }# l/ @" E
) R Z; j% V0 m- {4 \' K
/* Enable Intermediate & Final transfer completion interrupt */
9 C* w1 N. t# c7 ?% i
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ q0 v" I' M" k. ?' t. ?
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 B$ f9 q6 T0 `$ ~+ M9 e2 ~
: `& d" b9 d: v7 r; {' a
/* AB Sync Transfer Mode */
% q* v/ S0 |( {7 \6 _6 o$ d
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) R S( P; L+ |$ o+ _; j* u4 }, p
* F: @' X0 v9 W% Y4 y( _# c
/* Program the source and dest addresses for master DMA channel */
6 ?( V9 G9 o( t% b+ B/ N- j5 O7 @
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
& a. u& M! a6 I9 h7 n
paramSet.destAddr = (uint32_t)(ping_buffer);
) V9 |- R; ^! p5 K# {2 I
9 C; y. u9 P! C; y# Q' Z8 Y8 Y9 x6 J! h
/* Write to the master DMA channel first. */
P/ h( Q6 K3 s+ G& n# {$ l- a
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 A; r$ T3 s; n, H! @% F1 g1 m
}
; ~0 _% `0 s: |& e0 d' T8 H
# w4 m" \- }, ^2 O2 M0 x
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, L7 X9 e) i+ d& Z
- N% X* w, c# L5 X0 _) G
if(result == EDMA3_DRV_SOK)
. K" B s7 r: @! P1 e
{
7 ^$ U" t9 L# n! z
print2arm("edma3 driver init success.",0);
$ t: R, r. K1 T0 z: |2 v* o
}
{$ n- |% r" u$ @/ ]
}
* s7 Q- ^! [( Z" Q- W
( x" p9 ^# j7 D5 c
8 e1 I* {8 G+ U$ I- W& `' v
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* @1 s e) b+ M4 P1 ~
; ]0 k# t% ? d1 M) [" {
; _ r" D" s2 v- t, K$ f3 e0 Q
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
3 h6 W" Y, i* M) B6 F
每次DMA传输完成后都要再次使能传输
3 y* ^: G3 ~8 b# H; V- p
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4