嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
1 F3 I# b, h: d) }) r
#define PING_PONG_ACNT 1
' @1 J$ O. L6 t' X/ F1 I4 U
#define PING_PONG_BCNT 8*32*40
, I* I5 ^! o3 {5 D. E h% O
//#define PING_PONG_BCNT 1
# w+ k* ]8 T, g
#define PING_PONG_CCNT 1
. D% q2 _- X9 d# m2 m7 g4 x2 f+ _
#define MCASP_BASEADDR 0x01D00000
# [! B2 N5 l5 Z, J
#define Mcasp_RXEVENTQUE (0u)
D7 S! G$ P; v3 a/ ^. p
4 K/ R2 X( \$ r1 k2 T$ ~$ T. j
/* OPT Field specific defines */
! \6 G2 m# Y7 q# H2 x: R
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 {/ m4 r! J( r4 h( V1 E3 {
#define OPT_TCC_MASK (0x0003F000u)
3 c, b/ N7 W7 B# z. x1 b
#define OPT_TCC_SHIFT (0x0000000Cu)
3 ~: @( G$ C! `
#define OPT_ITCINTEN_SHIFT (0x00000015u)
6 m/ a& ?- e" M9 Z0 F$ R$ b2 f5 I
#define OPT_TCINTEN_SHIFT (0x00000014u)
% K+ e& N" e3 G- x
8 C2 L; t8 K$ U l4 V
char ping_buffer[PING_PONG_BCNT];
% ]6 `6 @0 L* c9 m. B2 i
char pong_buffer[PING_PONG_BCNT];
! O# m9 l& I- l. {: ?* F
3 F, b1 U# F1 N( X4 N5 d
6 F+ {% N1 e) A5 U" {& f
. G. B7 Q. B. Y9 k ~' x9 N: [
0 V' U5 s* _, U1 l& e% m4 {
static void ys_edma3_init()
, O' W4 J2 q4 O/ K5 [
{
4 O+ D0 U- ~( j4 M2 G: f' N
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
5 w7 Q0 d3 G7 c H) S! b
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
/ @+ L9 ~+ ~' ^, n* Q4 u- y- T
EDMA3_DRV_Handle hEdma;
O0 }0 J' }5 h& w7 |2 \
uint32_t chId = 0;
. V& w4 S& F, }7 z/ y) } U/ M
uint32_t tcc = 0;
/ P' E8 N" u [6 F7 Y# t
& s) Y4 b2 n, N8 |) F+ t6 X
print2arm("edma3 driver init...",0);
; n) y! n" W4 P0 h* D
* z* ~# l2 @6 {3 Q- }) f$ I9 ?9 r0 J
hEdma = edma3init(0,&result);
6 J1 \5 z* C9 n3 ^
if(hEdma)
/ h6 ]0 c5 H0 [0 T4 v' }
{
$ Z/ r" x1 E) M; l, c1 J
print2arm("edma3init() Passed.",0);
) ^- L% L3 k: K8 F
}
5 n+ R, A. b* N4 O5 }! a4 j1 Q
else
$ \; N! ^, ]3 u& V. J4 _
{
- \, U0 S5 `& y; S
print2arm("edma3init() Failed.",0);
& S V( h( R% d* G% T9 w% ^ C
}
, w. j/ B8 z1 h
& Y, D3 n3 x% K6 Y9 P$ C7 M7 U
if (result == EDMA3_DRV_SOK)
0 U6 w8 J" t$ g t
{
1 v. A( f! ^% e1 [/ I
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& _: q' s2 A) y* N5 F
(EDMA3_RM_EventQueue)0,
- @: _! [ A( g+ S' x
&edma3_isr, NULL);
5 k! D; Z. q, {9 i
}
6 L: Y9 ] d& x6 ?" l7 X9 J) B
" e+ ~+ B$ U$ q# p
if(result == EDMA3_DRV_SOK)
5 X7 k: o8 j. u% G% O
{
6 s+ r4 T& C- y6 h& c2 _9 S$ _' C
paramSet.srcBIdx = 0;
% f- d" |% B; U
paramSet.destBIdx = 1;
: k& U0 s) ~2 t- ]( e: @2 G3 a
paramSet.srcCIdx = 0;
( A# f" S& n# s2 r [) Y' x; z
paramSet.destCIdx = 0;
& e, M+ J; M! e" {/ Y4 l8 Z9 y5 ]
paramSet.aCnt = PING_PONG_ACNT;
9 @# q3 F/ l& m* R
paramSet.bCnt = PING_PONG_BCNT;
! U! s; Q: ~. l1 a
paramSet.cCnt = PING_PONG_CCNT;
0 [9 x( }4 @( k2 ?" `4 t: o8 k; }
* N& E; d3 `7 A5 A) v
/* For AB-synchronized transfers, BCNTRLD is not used. */
; P4 m+ {; _# x K9 z4 b
paramSet.bCntReload = PING_PONG_BCNT;
# b7 ^# ]: |, b8 f
9 W) Z) z) g: `5 G8 |
/* Src in constant mode Dest in INCR modes */
" s9 P! L- K0 T' o; o0 Z2 l
paramSet.opt &= 0xFFFFFFFDu;
( k5 c s. ]6 g! H! j
//paramSet.opt &= 0xFFFFFFFCu;
) ^( g+ h3 [ l: u6 R/ d- U- v
3 r% w9 h; |2 w2 Q1 Q! E1 ~
/* Program the TCC */
0 y# [9 j& J# _
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: h, D7 J. f7 E
# w8 J3 Z/ L+ L. n1 l$ T* m8 k4 e/ z
/* Enable Intermediate & Final transfer completion interrupt */
4 h- |# X* z4 c
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
- s. K5 [4 }7 ?2 b# u
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
! \; _$ E* v2 D" q9 `8 a
- W5 E9 r+ b6 N
/* AB Sync Transfer Mode */
z0 u1 m3 Y0 W* R5 U
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. _6 P5 p( g% n' f; s2 k6 g6 i5 j
4 L' I3 t% R1 _) S6 h& I) F
/* Program the source and dest addresses for master DMA channel */
1 d* F# D) T) R7 c4 w% g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 r+ |. V- E+ P; Z1 _0 i9 ~! `
paramSet.destAddr = (uint32_t)(ping_buffer);
+ W- |/ m8 W6 y* o) d9 m
: E {# w' ~1 c5 j" ^
/* Write to the master DMA channel first. */
: s4 P5 r. d: o, \% u' J
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
% A7 v* j* G( b
}
N6 u+ e6 `/ n# R+ L6 w
4 O% e" ]/ O2 a
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& q: k/ {- K r) G* ^6 a/ ?
: N. |$ I0 M2 D; D
if(result == EDMA3_DRV_SOK)
) {! ^6 v( R5 n# v: J
{
6 X8 @+ q6 H9 W& M) E& D
print2arm("edma3 driver init success.",0);
3 @# e8 W1 W6 Y m1 C$ |
}
& p0 } y& h! S5 V. N- R/ g
}
& D2 v1 O9 L: G- p
1 ~# j0 c- E% k$ H' F D
0 Z/ N0 Y# m9 m4 G% }/ g! s
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' k) ?/ N! B8 t( u$ N$ L1 r6 g
6 R# _) n' k- x2 u- x0 O
' b. w! D6 ?: v
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! _( l) r- Y0 M
每次DMA传输完成后都要再次使能传输
( D' R5 \3 Q: v+ r1 A
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4