嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ K+ I" [ B' R3 Z; J5 i
#define PING_PONG_ACNT 1
) }8 j `, f3 m
#define PING_PONG_BCNT 8*32*40
3 I) ?( N+ X/ B1 A
//#define PING_PONG_BCNT 1
% N0 I" Z: ]+ V! J( ]
#define PING_PONG_CCNT 1
1 b( U" K4 n" D# [6 b% z+ U
#define MCASP_BASEADDR 0x01D00000
8 a) x% t3 L( z( O
#define Mcasp_RXEVENTQUE (0u)
4 S0 x9 o. l$ i) X7 i
1 n# N! X8 b; U, @: p
/* OPT Field specific defines */
# m: e, q6 i/ f
#define OPT_SYNCDIM_SHIFT (0x00000002u)
5 X$ P2 t# ]% u* [; L
#define OPT_TCC_MASK (0x0003F000u)
3 {: X% l- _' Z/ ~6 T! w1 t; ?
#define OPT_TCC_SHIFT (0x0000000Cu)
2 m! w( S, G! }" a) D% Z
#define OPT_ITCINTEN_SHIFT (0x00000015u)
+ E% v) H8 f" d0 |+ W
#define OPT_TCINTEN_SHIFT (0x00000014u)
: M, x5 w$ R9 w, Q- `, R
* w, K* O) [0 k
char ping_buffer[PING_PONG_BCNT];
' O$ e X ]6 Z4 V
char pong_buffer[PING_PONG_BCNT];
' Y- \" D! ?( s* V0 {' {4 i# \; m5 G
6 _1 b$ M: }4 _& a" ?1 q
, N9 \/ L" i: o- r- T
$ z) ]9 w) U' I1 Z; h- ^
; B% E2 _. I% F7 j
static void ys_edma3_init()
5 O J4 D5 h' N' [# ^
{
$ E/ G7 [& o0 Q9 m% o/ t- U, Z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 v2 L6 o: k$ `8 d$ h
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
8 X2 |" Z# u8 R& _/ ^& M
EDMA3_DRV_Handle hEdma;
& S- c7 g* I: ~" C2 J& e) n
uint32_t chId = 0;
3 p3 x! [3 m% n# x
uint32_t tcc = 0;
2 o* V- Z2 a- N$ ~& m
3 V- s3 ?7 r- t7 x+ p- [; _
print2arm("edma3 driver init...",0);
p, a# N9 W# I- A4 [3 ]5 p. y
1 h3 g8 J+ W' ~* `- ?8 e( l v
hEdma = edma3init(0,&result);
3 w( R6 |4 N) y# n Z
if(hEdma)
1 V; q5 _8 D/ q# Z5 f
{
3 ?( {- }6 Q' W
print2arm("edma3init() Passed.",0);
5 v" K' Q7 U i4 l( t
}
. {* M+ @' c, G( O% A! [- k" S1 G
else
- Q1 E) `' l" K' m W& n( @
{
4 `. a* L* j' F# s; E
print2arm("edma3init() Failed.",0);
4 H) F3 U9 ]- M, d
}
7 W8 }, z9 v# l$ A
8 ]4 Y1 j3 |( @1 B/ |% Z: |3 e# r
if (result == EDMA3_DRV_SOK)
2 T5 k$ o$ Q3 K
{
; c1 O1 G. V$ l) N
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
" ?% |9 l8 r) D+ F# u
(EDMA3_RM_EventQueue)0,
4 d, J3 ?' ^: ^ f$ f/ [
&edma3_isr, NULL);
8 z' m; J3 g+ h: U- F2 b/ A% K
}
+ M. J% l- A" O- b5 | D
/ o4 {% K+ c+ D" h
if(result == EDMA3_DRV_SOK)
3 x* ~" I K( d+ |$ N
{
: m, E' g0 B0 W: I
paramSet.srcBIdx = 0;
% P0 K. T8 J* Z# }
paramSet.destBIdx = 1;
$ T1 m, _3 H& X% v
paramSet.srcCIdx = 0;
g* y, L E: h4 o
paramSet.destCIdx = 0;
: h9 `% f+ O; Q
paramSet.aCnt = PING_PONG_ACNT;
$ B/ X( y; P) b8 J5 K+ g
paramSet.bCnt = PING_PONG_BCNT;
- u2 P6 z! O- ?$ K$ ]6 K3 O2 w
paramSet.cCnt = PING_PONG_CCNT;
# N9 O' a8 R0 ~ f& s y4 \
: S* F. e# Y5 e( {; t( [1 {
/* For AB-synchronized transfers, BCNTRLD is not used. */
/ b+ l0 l/ `2 D6 |
paramSet.bCntReload = PING_PONG_BCNT;
6 f7 `, }, P' ~, `
5 C2 |! |3 V& U& z" S8 |1 Y
/* Src in constant mode Dest in INCR modes */
8 S8 U" O1 \ t" s
paramSet.opt &= 0xFFFFFFFDu;
" o7 }3 C6 N3 L* r
//paramSet.opt &= 0xFFFFFFFCu;
u' o M7 b& ]. @9 z* M8 f6 k
" w l5 b- k& y$ X( C( }+ x2 z0 S& q6 d
/* Program the TCC */
9 w' f1 H0 ^: J9 L2 q- {6 \# k
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 x% {: a- }. ]4 k: P
, l* H' d2 B0 v7 o# L! Z+ J: j0 H
/* Enable Intermediate & Final transfer completion interrupt */
H4 V5 s+ x, }+ ]: f9 q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 Q# q0 M; c! f; S3 N4 A' @ ~( ^
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
) a, r% j9 c, a4 Z' w7 }5 s4 X5 J% |
1 c2 @% s! k2 x8 P
/* AB Sync Transfer Mode */
5 @9 n; f: X! U& {; ]- b
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
{3 v) Z' N* X2 |( _5 R/ r% q* e& [8 M
' l$ q8 z& p8 m6 l4 z0 z( A
/* Program the source and dest addresses for master DMA channel */
& m$ F' _6 s1 R. r8 t, [5 k7 o
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
2 P" f8 o; w; @$ n0 y! A. ^
paramSet.destAddr = (uint32_t)(ping_buffer);
( \" y1 q T# F& [8 m
* D+ f" j ^2 L& e+ `
/* Write to the master DMA channel first. */
. K% o6 d) P4 ^3 d' R) q
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" i/ a1 B0 W: l5 r7 a3 J+ Z
}
& U# s& h% \$ c" e: U- d
Y8 K f- R1 @6 F. w* h
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% Z# J* u* U5 i& X, ~& V% u3 r
( q) u1 n5 V2 M7 \5 ~& q8 a9 c& J
if(result == EDMA3_DRV_SOK)
' {0 P! v% q/ ]! o0 ~# r. F, E
{
, i" C& q% a4 J6 v% V
print2arm("edma3 driver init success.",0);
) H+ N2 E9 s# g! j# r, t/ [/ R
}
5 w# j5 X8 F: D: s4 @
}
; g' f& h0 N9 L: J- n0 s
, r! ?. T4 ^ j. r7 v
5 X, Q' l) N" a0 Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
* j) I& E. l* Q' t5 }
4 u4 k5 d+ V% \2 w/ n
$ [- c4 b' B, T
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 N; [7 o- M' @ n
每次DMA传输完成后都要再次使能传输
# I! W" {% T, @3 E7 U
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4