嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 L% ]) b- @# j+ A5 h$ E( X
#define PING_PONG_ACNT 1
% o; u1 _. U7 D( |# f0 a
#define PING_PONG_BCNT 8*32*40
9 C8 H3 l' @0 y' N( d
//#define PING_PONG_BCNT 1
7 K: o* e* F" y5 k0 ^# l
#define PING_PONG_CCNT 1
: ~7 ]- ~$ T% A7 e5 E6 o
#define MCASP_BASEADDR 0x01D00000
# Q a$ G* T- E/ [' S. b
#define Mcasp_RXEVENTQUE (0u)
4 ?1 `1 L+ [7 R& x" u( R F
4 }& g5 }) l' @+ |* D x
/* OPT Field specific defines */
2 d4 y) [+ X2 o/ d/ N% g" L9 {1 y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; z6 |6 E8 L& t: R# F0 E% \2 ?
#define OPT_TCC_MASK (0x0003F000u)
/ Y" x- @$ s* x- q; E1 E3 W3 K
#define OPT_TCC_SHIFT (0x0000000Cu)
1 Y& d F0 b9 L* f+ q
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# s9 }; J- ~3 N2 C- }6 v5 P3 a1 [: m
#define OPT_TCINTEN_SHIFT (0x00000014u)
1 E2 T6 h, e/ t1 p# C, D; W; t
1 s& c: N1 i$ `! V! ~3 ~
char ping_buffer[PING_PONG_BCNT];
4 q# h) A3 d i
char pong_buffer[PING_PONG_BCNT];
- R- @ P4 \5 [# i) [
. W! s( n4 z; ^' t- `4 l
) ], { H9 m% G+ w" C7 |9 z, S6 Y
$ K$ c$ a$ x, o( w
& K0 ?, h; a: f
static void ys_edma3_init()
( Q3 L& H! Z9 C; ]: s2 [
{
2 S0 A P, T) v# t
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
% ~' o. A+ n) F. m' V
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
' P" X0 L. A. ?# q: v
EDMA3_DRV_Handle hEdma;
; W: z1 b- {8 [+ e% ^
uint32_t chId = 0;
_" Z% @. ~ `, G
uint32_t tcc = 0;
0 T9 Y4 o. ^% P2 f y
& M7 d0 ^$ f0 k, ?; s
print2arm("edma3 driver init...",0);
) S& b, H( u* k
4 M+ S- P0 w: R. n
hEdma = edma3init(0,&result);
* ~& X2 ~4 P# h c6 f! A5 {
if(hEdma)
2 s3 o* {7 l6 w# i0 d
{
0 _0 U2 z: b3 W
print2arm("edma3init() Passed.",0);
1 z2 G8 H7 i+ z/ o; B- K- }; z
}
6 Z: q$ V3 d+ M# T; D
else
- r8 R6 n @: Z4 {4 c" }1 Y
{
9 B, Q" F0 u4 \9 N- x* q1 u
print2arm("edma3init() Failed.",0);
: p, n4 y0 X& j
}
% |% L7 v w/ C. P# y& {8 K. z
* x% d7 a" X( x+ e# [
if (result == EDMA3_DRV_SOK)
0 V K& d- |$ T9 v
{
$ y/ j9 m* B0 t6 q" J6 B; I9 T; K
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 \# b/ r9 Q3 w+ Y0 j4 H& V
(EDMA3_RM_EventQueue)0,
/ v5 Q" J9 [" M
&edma3_isr, NULL);
{% u1 Y9 X7 v& u& }8 u% p( y
}
h# H) {- e6 h+ u
$ P4 I2 P1 A3 G
if(result == EDMA3_DRV_SOK)
- U& B9 f. M+ A3 u+ g
{
7 Q4 V1 p% c) K* j2 S- f
paramSet.srcBIdx = 0;
' H7 U5 P o/ m/ j! a! H9 f. G9 L
paramSet.destBIdx = 1;
9 n' f7 A9 S# V8 M
paramSet.srcCIdx = 0;
8 u, O6 ]5 V3 }- Y# }3 w8 u
paramSet.destCIdx = 0;
7 A- _6 ^7 Y) T- p% {) J
paramSet.aCnt = PING_PONG_ACNT;
/ X T% \$ v7 s! G1 E/ Z# m# Z& ]
paramSet.bCnt = PING_PONG_BCNT;
+ h: E+ X5 e O/ d/ m5 {! Y3 `
paramSet.cCnt = PING_PONG_CCNT;
9 i+ c8 S+ H6 e3 }' B
' Y2 }9 W j5 G3 V* u
/* For AB-synchronized transfers, BCNTRLD is not used. */
3 v2 w$ a5 r! H3 h6 Z) a4 ~) y
paramSet.bCntReload = PING_PONG_BCNT;
8 k3 j" v; X, m+ c( Q
, K' L2 e* V6 d: j B# n8 \
/* Src in constant mode Dest in INCR modes */
# h" F$ X- @$ @, C* H
paramSet.opt &= 0xFFFFFFFDu;
1 w( k+ Y" {* ~; ^0 b. F; c/ Y
//paramSet.opt &= 0xFFFFFFFCu;
. U# \) j7 X9 \2 a7 A) {# Z& n
3 m2 r* v& t* h' X. d
/* Program the TCC */
' e6 r F: ^# v# a
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 D& Q. e$ X8 x# }: e( f
7 T" O. E5 o- V: d+ {
/* Enable Intermediate & Final transfer completion interrupt */
/ }0 l( X1 j( A3 _( U# g" F
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 d- y8 |; u5 I& R9 m: O$ x" A
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ |+ c- w# K w; o# m5 t2 D
+ n) K% w" h; \" m; e' D
/* AB Sync Transfer Mode */
5 V# _' |2 p# I# ]; ]' {) x
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
+ m( B, ~" G! H# \
8 s7 t6 e, X5 `# r- }
/* Program the source and dest addresses for master DMA channel */
: m# ^% q s5 M
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
' _* u- b0 N( u- _ f+ P/ y
paramSet.destAddr = (uint32_t)(ping_buffer);
" x2 T& [% \; B* q
) X% ]# v6 ^8 u0 Y
/* Write to the master DMA channel first. */
& w. A A( J5 T8 k8 e3 J
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" I G+ u' [. c/ b
}
* g# f+ C3 P' C4 Y6 O4 Q" p, C# {
" v u" a* P, `+ I
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ K' h$ L: a3 m7 \4 ~
" ?: z+ Z6 t* j
if(result == EDMA3_DRV_SOK)
$ Z4 t# s2 Q5 f! q
{
8 R1 n( t5 x/ P
print2arm("edma3 driver init success.",0);
# z5 I; ^5 G# o! P) |3 C
}
0 U* V* q) s2 b; R
}
& R! A3 R& Q) l4 M; \
4 e* P: |6 y& h5 h T1 G
6 T3 s' o x6 Q9 d" u
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
|! m; q$ M9 E4 j/ C* i3 F E1 C
3 v9 I/ a2 O: u8 q
# {7 [2 Q0 d2 `- M% Z: |% S' c
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ h1 l7 M* Z/ S7 u& i, ^6 b
每次DMA传输完成后都要再次使能传输
8 s! T3 I/ E8 |4 N/ ]) e# |
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4