嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- Z- ]5 P/ s+ j u6 t/ C
#define PING_PONG_ACNT 1
* l4 Q% `# z3 I# N' K1 z3 n: z
#define PING_PONG_BCNT 8*32*40
3 T5 B9 L! h2 i7 K
//#define PING_PONG_BCNT 1
- x1 L$ j6 U; M0 l/ F
#define PING_PONG_CCNT 1
Z/ f0 M* {, k4 p; Y
#define MCASP_BASEADDR 0x01D00000
1 s: { q5 }6 ?6 e8 Q; @1 W
#define Mcasp_RXEVENTQUE (0u)
; q4 W7 K1 M" [, w
# B- v5 m8 i( f: h( d" m
/* OPT Field specific defines */
4 F4 C0 h) ~& |% T) d
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) _# q) d% W$ p( C1 ]2 q4 g
#define OPT_TCC_MASK (0x0003F000u)
+ H& h7 V7 p' y/ S8 a: E; X
#define OPT_TCC_SHIFT (0x0000000Cu)
0 K3 v# S) j- w$ y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
0 a5 q& N5 W6 D, ]* {, r8 l
#define OPT_TCINTEN_SHIFT (0x00000014u)
% j4 c ^* G+ b7 u1 H
6 [# ]! e7 ]5 E( `* I7 v4 o/ o( y
char ping_buffer[PING_PONG_BCNT];
; v; j% Q/ r( H1 c* M/ H
char pong_buffer[PING_PONG_BCNT];
; e0 Q% I3 i/ O1 X+ z& E, n
$ j: f+ e" m. H, _4 O
9 X1 L3 k& o2 K8 \) v
" o" a- |. ^$ s9 k. I$ D/ P8 ^
+ ^. F& k) l; D; b: m: i3 M
static void ys_edma3_init()
3 _. h! j5 M h2 ^! l2 q* w# l" q
{
/ b. w- q7 |1 c' p& I+ A1 r1 r
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: K! g1 m7 R7 N7 H% x9 @
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ w, C% L2 q" l4 g6 o5 p8 T
EDMA3_DRV_Handle hEdma;
/ C& N; T1 s% g" x" W/ l+ A) q; M
uint32_t chId = 0;
" b. o; t3 Q- ^! z+ T
uint32_t tcc = 0;
0 o2 E- R k- @$ a; {
$ t: h, R; d& F* J& m! _
print2arm("edma3 driver init...",0);
4 h+ ~1 N5 B& ~. N" e( ]# P
8 {& o( K l7 J9 s3 W* L: q2 R8 n
hEdma = edma3init(0,&result);
" M% \0 o$ [" l9 Y" V: Y
if(hEdma)
8 s; h+ }1 d% r( p! ~2 K
{
1 a( K3 W' x+ h
print2arm("edma3init() Passed.",0);
. Y1 E! F1 M0 B: ~: z
}
5 H! @. V+ b: }" u3 b) `
else
0 S8 }# N3 b3 F F; D8 S
{
( q5 q- k& |2 Q, o: v2 K6 k
print2arm("edma3init() Failed.",0);
; G' M. o: C1 `5 z, y1 Y
}
( z: c/ }) D: U
+ [6 ]7 {- Z1 I" P* r/ d3 [- c
if (result == EDMA3_DRV_SOK)
7 G% Z8 [, h2 r% @: p
{
1 h( ?, W% [0 z# Y8 Q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
$ s" m! b0 d$ e( T U! l$ V
(EDMA3_RM_EventQueue)0,
2 b) F8 c7 k& A+ |$ @+ r
&edma3_isr, NULL);
, ~1 u5 G$ J$ B5 K* R. ?$ x$ f# b
}
8 p. T4 v+ z0 x/ O* v4 d$ ~' B) b
* a8 l j) K5 U& T
if(result == EDMA3_DRV_SOK)
( N& F! s6 v0 S) Q
{
7 E! f8 H/ H; Y0 C& T' ~; E
paramSet.srcBIdx = 0;
Z: M* N: X2 v q/ \+ l. x
paramSet.destBIdx = 1;
1 r: p1 n: v' J9 T& e' @2 f
paramSet.srcCIdx = 0;
0 Y% C8 k: e+ h+ }' t/ `( O
paramSet.destCIdx = 0;
( o, t' i9 o, D5 k1 h ?
paramSet.aCnt = PING_PONG_ACNT;
0 Y; h% ~0 v G* N) v
paramSet.bCnt = PING_PONG_BCNT;
0 O) ]5 m- q) Z- @
paramSet.cCnt = PING_PONG_CCNT;
& l+ u9 J2 m3 I h$ k4 x
) D" {/ m3 c4 n$ d) _
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 i& B8 i8 r# e/ C
paramSet.bCntReload = PING_PONG_BCNT;
" K9 Y' S- }8 ^3 D" X& Y* ?. ^
i: w$ Z$ H Z, o; N8 S
/* Src in constant mode Dest in INCR modes */
( ]& g1 ?7 x- U* i
paramSet.opt &= 0xFFFFFFFDu;
" J) W4 m3 |- l+ i
//paramSet.opt &= 0xFFFFFFFCu;
: j- L6 C+ Q* v
4 a' v! K9 G5 B& s# `( U l
/* Program the TCC */
2 M* p! D; c8 N; B$ K2 \
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
; |, V( H1 E+ v; i3 B) }. T/ L
- @' X7 e- \, J
/* Enable Intermediate & Final transfer completion interrupt */
: J9 b+ Y8 w) `& L
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
5 K1 a7 z* _+ y; ?3 ?& y
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
% x M4 T4 K7 L
+ M, `: ?2 f$ Y/ Y
/* AB Sync Transfer Mode */
: m8 K# B" O# o# ?' B/ B4 r. u' d9 k
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
{% A/ x1 q+ ~% s* ^
7 W$ O" F {; ~+ H. N
/* Program the source and dest addresses for master DMA channel */
$ B1 [& \, \" z/ Z4 {
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# U/ d- d* i# ?$ ? H% X
paramSet.destAddr = (uint32_t)(ping_buffer);
% [. @; ?+ q$ t4 M
, r q& L2 Q: h2 p; L* i
/* Write to the master DMA channel first. */
. U& b2 V( [; R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 D; l7 F% i, b: p" j2 e
}
0 h( M& I/ e- k, A0 x! s" X9 ~5 H' }. t
- ^0 S4 ^& A" m+ L2 E2 d
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, {: ^+ H$ O- g
8 C2 b9 Y& v' K: M: N9 Y
if(result == EDMA3_DRV_SOK)
& q7 }0 T8 ]9 i8 v* n2 }3 p
{
) k* d- A' k/ V t1 M/ J8 h9 g
print2arm("edma3 driver init success.",0);
! ?1 @, k& w0 k5 E
}
8 F7 t5 V; I' e/ T" B
}
' l5 p! N* s: a& u# ~2 u) [8 a9 d
' ^( q3 m: a* R
8 S" r9 s( O& g# y- i
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ E) l/ L# F: ]& L/ f z- U. E1 M
, a+ x/ c+ [7 \' K. s( T; G
" h$ [4 G% D# I7 ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
% E6 ^6 _* P9 S6 ?5 {
每次DMA传输完成后都要再次使能传输
( R) O; ]# r$ |# ~" H U( t
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4