嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
7 C0 s7 w. H4 K$ w3 _" X9 V
#define PING_PONG_ACNT 1
8 g4 X: L# S0 {
#define PING_PONG_BCNT 8*32*40
: N9 k& d; [) R
//#define PING_PONG_BCNT 1
3 |! v: Y' n* M9 V/ M* q" S, p
#define PING_PONG_CCNT 1
% D$ W" y5 k$ I4 ?& w5 e
#define MCASP_BASEADDR 0x01D00000
}' b/ r( F' v7 y) D% r9 I( I
#define Mcasp_RXEVENTQUE (0u)
6 r. [* I! f, t2 T' e2 k7 h t
# @) k, e/ d7 W r! s* V2 {
/* OPT Field specific defines */
! i. r* Q& I! `/ |
#define OPT_SYNCDIM_SHIFT (0x00000002u)
* \4 [0 R& h4 w) l9 s. u. H% t
#define OPT_TCC_MASK (0x0003F000u)
. u4 l8 m& t0 t5 ~5 ~
#define OPT_TCC_SHIFT (0x0000000Cu)
8 M( s ?& Z9 M) w O2 Y
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# f" i3 N+ ]- z: ~: _' ^
#define OPT_TCINTEN_SHIFT (0x00000014u)
) p1 X+ q. ]- {' p# [, n G% X- T+ Z2 j }
. L6 `$ ?- m% }7 B3 O
char ping_buffer[PING_PONG_BCNT];
; P4 v4 D+ U0 V; A8 G1 t4 O+ D
char pong_buffer[PING_PONG_BCNT];
& q* ? b+ T: d0 @- F6 e- L
# E, |0 _0 _) A. e
- a) y0 g6 v) v; o5 D
7 k- n1 m0 ?2 W
2 W( ^% ?6 o; Y ^1 Z3 o& ]
static void ys_edma3_init()
o& Q4 \ p6 [5 T5 y
{
6 _+ b( D( L# [1 Q/ I
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
4 Z ~" S5 _2 k# I# e
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
# a# J" G2 E; A5 j
EDMA3_DRV_Handle hEdma;
( S# |- M4 s5 v) _0 N7 }
uint32_t chId = 0;
1 b$ Y# O0 C# c4 \
uint32_t tcc = 0;
" ~* ^( P1 O6 Y9 v* [
+ ~/ G% |: K0 D! M) P6 o8 G! m6 S
print2arm("edma3 driver init...",0);
0 |2 |$ F% T' l9 F4 j% V$ E4 {0 `
* K2 i. @3 ?7 T
hEdma = edma3init(0,&result);
+ r- }9 _6 U7 t& h% r: S
if(hEdma)
( J: ?3 E8 p( e: i6 z1 ?: g. P
{
+ `! j5 M& y2 E) t; u
print2arm("edma3init() Passed.",0);
' Y* t. f+ |+ A
}
P! m9 W. Z5 F
else
3 S% i' v! e$ t/ A8 r+ m
{
2 a+ X( {3 C0 x, X' `
print2arm("edma3init() Failed.",0);
8 z. x: X) x4 j1 J- n8 f- H
}
4 _$ L& K" V4 g; R: r' W$ m9 P
4 ?! q$ V ^# y+ k1 W1 i! V- ]
if (result == EDMA3_DRV_SOK)
. Q% f5 Y( [5 E' k) p
{
& C5 R3 p; E6 \; x
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
# Q! N/ C- N4 p0 N9 B; U( S
(EDMA3_RM_EventQueue)0,
# \6 \! a1 ]2 m: ^
&edma3_isr, NULL);
0 U t$ j' F' F& H9 B/ x$ v2 a1 J
}
7 P$ S! D* p( {! X8 ~7 u2 ~ [
) u3 y4 D/ x5 \/ D( ?; E7 h( d" D
if(result == EDMA3_DRV_SOK)
' t, P5 U$ d* G$ Y
{
/ Q4 B" U) P+ _
paramSet.srcBIdx = 0;
; {' S/ l4 `( _# `# X" b# ?$ y
paramSet.destBIdx = 1;
1 C: Y* m m, L9 u+ k$ u9 h
paramSet.srcCIdx = 0;
9 \0 Q9 O! q; ~
paramSet.destCIdx = 0;
, F/ h6 ^6 g1 g/ O5 f! S
paramSet.aCnt = PING_PONG_ACNT;
( D% ^* j" b& O% T8 G0 v
paramSet.bCnt = PING_PONG_BCNT;
' i" N$ D& R2 @( ^
paramSet.cCnt = PING_PONG_CCNT;
8 u$ {" k$ j& q, V
" y3 S" J3 G) ], a% }5 r7 g
/* For AB-synchronized transfers, BCNTRLD is not used. */
W G$ c0 \7 A Q7 n3 y
paramSet.bCntReload = PING_PONG_BCNT;
2 b0 x" N) H+ |7 p3 K, l
. s6 i% i: } b& x! w9 v; S8 k- A
/* Src in constant mode Dest in INCR modes */
& {# X% B/ R, C5 S8 k9 Q. i
paramSet.opt &= 0xFFFFFFFDu;
9 |# Z% l$ \9 B2 h
//paramSet.opt &= 0xFFFFFFFCu;
" M7 U; x6 |4 q) J5 n, |
; b7 D, B+ k: J `8 G0 f$ J
/* Program the TCC */
8 i/ o# W, p/ ?4 w: e+ s$ z
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
( f: ]( I4 m6 j" a7 P9 h( M( w
8 l. y* r, R4 E+ s7 e
/* Enable Intermediate & Final transfer completion interrupt */
7 P P6 u$ }* Y
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 g3 y0 h& u( o
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
& S8 ~4 Z5 ~1 x) F0 K" B
4 f- u4 w; q4 h/ g5 i# g
/* AB Sync Transfer Mode */
# o6 Z0 b2 e0 Z9 A$ S6 Y. |# U
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
4 n% z/ z. I4 O4 X. C& O
& o* z1 _2 G, g5 F6 M& B! {
/* Program the source and dest addresses for master DMA channel */
; d. V+ K& X0 ~/ O" g- R8 i' ~7 `
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
; |/ ^. N2 g d- X: X
paramSet.destAddr = (uint32_t)(ping_buffer);
% v. m' t9 J% L/ y+ X
$ t! T9 f% ?1 C% d D7 d
/* Write to the master DMA channel first. */
6 d2 \9 I# A5 e: R
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
5 E4 W, D# ?% W1 ~0 H, `+ z- M. ]
}
* ^8 J. ^# _# S. N0 g" D! D
" r) @/ ]2 Y+ ]1 _) D% g- {
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
2 z7 C- z, T1 P5 J. \5 h
8 A( F. O1 z, c) l" L
if(result == EDMA3_DRV_SOK)
* ~. \, L/ r* R4 Q- f7 _0 I' A
{
8 e5 F/ b Q& G( }) B
print2arm("edma3 driver init success.",0);
: a- A8 s& A+ Z! V6 K- O W. e
}
) P8 P0 f, ]! V( A) Q/ q
}
@- d: Y: O) I' J$ B, q
& t; Y4 |5 _( m
0 _1 D" x# w% ?. U5 x
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
$ C4 Z( V# s1 M( H' w* D
; D4 X1 F5 ~2 A- c. }) ~6 m3 N
- \' w# v4 K$ |( x6 H- M4 ?
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 P1 t0 F- t0 `- P' _* T4 l
每次DMA传输完成后都要再次使能传输
2 S: X' k3 T! q3 R7 T
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4