嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ f' e3 U" g W7 Z$ H$ y
#define PING_PONG_ACNT 1
6 |# T, _. \# @0 Y& t
#define PING_PONG_BCNT 8*32*40
& g+ x2 |! G3 m, u% O3 e
//#define PING_PONG_BCNT 1
; X5 d5 m6 R9 g3 u4 w
#define PING_PONG_CCNT 1
, X8 d) j4 K4 w" r1 w; N2 T. t
#define MCASP_BASEADDR 0x01D00000
9 I _0 U! W4 o/ D
#define Mcasp_RXEVENTQUE (0u)
; {" w& @( b+ \6 j6 O+ ?& x! a
% e2 a% Q5 ]" i2 i e$ P
/* OPT Field specific defines */
6 o5 h% d4 K$ Y. W% U7 T
#define OPT_SYNCDIM_SHIFT (0x00000002u)
" V5 d2 ]6 a& C* n
#define OPT_TCC_MASK (0x0003F000u)
0 K% y, R8 x- h' U3 V' r
#define OPT_TCC_SHIFT (0x0000000Cu)
/ M6 a ~- R6 P0 \; d
#define OPT_ITCINTEN_SHIFT (0x00000015u)
" x! I5 }; y$ Z4 y
#define OPT_TCINTEN_SHIFT (0x00000014u)
( f# I8 C9 H# t# d! J" g; J
! J" u& n; i- R2 w6 o" z: y) {0 R
char ping_buffer[PING_PONG_BCNT];
# N9 H% E2 _8 J9 P
char pong_buffer[PING_PONG_BCNT];
# f5 C8 W- ]9 f- c; R C) ~- n5 E
$ \3 f* _& |% O. h. X6 T9 {, E7 f$ f; R
% f0 ~" _# N1 G, I! o h& T3 A6 @
, `5 M( ~0 w6 Y" k# s5 A% X. p
7 I) h, n" ~. e: q5 j& I/ V4 Y
static void ys_edma3_init()
n! u% `) E) U$ q5 D2 f# L/ Y* B
{
% `0 ?9 n I1 H) k* J0 m2 _+ q
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( s/ ~# x# p. J( e' O& [
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
! N9 z) z1 N& C8 M
EDMA3_DRV_Handle hEdma;
6 R1 C1 F7 S. ~. P+ N; U8 U
uint32_t chId = 0;
( k2 W* C8 h, D7 P3 [0 ^& \
uint32_t tcc = 0;
: `% @# J' y) Z+ l4 ~
: b) I6 S% k7 w1 Y% X
print2arm("edma3 driver init...",0);
/ E, y& w) }& K( h
, ~# J7 i8 [ c; X
hEdma = edma3init(0,&result);
: L% o9 O, S5 Q1 L# V
if(hEdma)
+ S: A5 t, O3 V% I
{
* X V& l# J% z8 w+ S" _3 O
print2arm("edma3init() Passed.",0);
" K2 T( \4 o1 |! o
}
m! u/ k& S4 U* V/ }, R
else
u, f9 A6 K4 [3 [1 K' c
{
. Q8 W" z" o% g9 q* H) l' H
print2arm("edma3init() Failed.",0);
3 Q% u. w2 f! h9 f* X. N7 W. e
}
$ ^& y- W5 N) J; D% G# c: b+ S
6 a& u. J6 g! G4 s
if (result == EDMA3_DRV_SOK)
* k0 t) l- U1 r3 w
{
0 k- F6 m- p* u
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
# K9 c, }1 P. A7 V5 O/ E$ u
(EDMA3_RM_EventQueue)0,
# S0 K" P+ n( x2 w6 _+ C
&edma3_isr, NULL);
) [: X! N0 }" D$ n
}
M3 N0 X! w8 V* D5 y
( _$ B! Q7 T# l6 q" G, n
if(result == EDMA3_DRV_SOK)
4 a0 h4 H& {) \
{
( a7 l( }/ Q' d/ l8 ]' Q
paramSet.srcBIdx = 0;
1 T9 B' T+ d6 a* X: L
paramSet.destBIdx = 1;
/ w9 v" [! `/ S. A: P
paramSet.srcCIdx = 0;
9 V) k8 D8 m- ^9 R0 ~. }
paramSet.destCIdx = 0;
# s% y d) @0 W; v
paramSet.aCnt = PING_PONG_ACNT;
; m% X9 K; r$ Y+ G7 {6 m
paramSet.bCnt = PING_PONG_BCNT;
; x4 f6 t- H" ]7 p2 K. W# h
paramSet.cCnt = PING_PONG_CCNT;
3 ?9 }" l& A% A3 d
! _) j* k" W* q( O# T t; E# Y; a
/* For AB-synchronized transfers, BCNTRLD is not used. */
# I# I0 U5 h' e0 R: C
paramSet.bCntReload = PING_PONG_BCNT;
4 k- p0 |1 P* K: ~# }, i7 d N
7 S; n$ A Q. o" h+ X5 |9 j3 w
/* Src in constant mode Dest in INCR modes */
+ c+ ?4 f- Q9 o7 v
paramSet.opt &= 0xFFFFFFFDu;
+ G0 ~, b6 \* M/ ]
//paramSet.opt &= 0xFFFFFFFCu;
' X/ _3 J/ W7 N# Y: a
' e5 B3 {' `0 x0 s% F; L) s/ m) t
/* Program the TCC */
( M) U8 z0 _ x# y
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
9 g8 j4 L/ h5 I( f1 p2 K; j, E
, s! T, z! }* k+ P* r$ a( o0 f# u
/* Enable Intermediate & Final transfer completion interrupt */
7 F* y5 J: r2 b- j
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
2 V% a I$ z, ]# ?1 A
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
2 O' Y3 d% f& C5 v" W @* E' ?+ _
0 [' l1 a9 a1 R) ]/ S
/* AB Sync Transfer Mode */
8 h: `3 X9 ?. S! Q& @' i
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
; C' T3 B8 N- f1 \, o$ {
' r$ ^; G# s) X r4 R9 Y
/* Program the source and dest addresses for master DMA channel */
. T' G$ X- F9 i: [: A9 Q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ ]" u/ G8 L9 S- P, I
paramSet.destAddr = (uint32_t)(ping_buffer);
) F% J* w, _6 `0 g; D' s
9 c5 W# P6 i' w
/* Write to the master DMA channel first. */
; @2 l1 N; y: d' c9 u" W; B
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
A* `4 R: ~# ^! p% Q$ E+ ^
}
6 i; `+ ^7 I* H
" y3 @0 t0 o- g# Z0 `/ @9 H
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 I3 W8 ^8 l9 G
: v/ M; f/ s% u* I- h6 y) }9 l
if(result == EDMA3_DRV_SOK)
4 Q H7 o$ p3 _! M$ I
{
: I6 B. S) \. c
print2arm("edma3 driver init success.",0);
% d9 d. r6 E0 `7 h' d0 f8 f: }
}
9 d* Q5 d5 O) Z, \0 P: J! J
}
- @" Z( V# [ t, \9 u5 G8 M# W7 C
' N2 p5 Z# z" W- l& t0 X
4 w) Q3 V# ^( I* l5 s& {) d7 N0 A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 V5 u- T- ^+ {% ?
: e" t, [) o# p) {% S# U# \% ^
' Y/ S) ]( k) C) E: A
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ i( Q, b8 h8 A+ ~9 b9 L. ?4 h
每次DMA传输完成后都要再次使能传输
# P# ]6 }% Q: E) m4 }! x" n& {
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4