嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
/ E5 h% d. r% j3 ` D
#define PING_PONG_ACNT 1
9 o7 q$ U. A9 o3 r0 V ]; J$ ^" K! j' O
#define PING_PONG_BCNT 8*32*40
( X! x% T/ D F0 z: q0 l) m
//#define PING_PONG_BCNT 1
5 ^1 V% x! Z0 h! i9 c# M% W
#define PING_PONG_CCNT 1
+ Y% z. J- W1 g- H
#define MCASP_BASEADDR 0x01D00000
- J# O# J; K( e9 H
#define Mcasp_RXEVENTQUE (0u)
5 N6 d* y3 ]% p h/ L
4 S8 [, V; R, |) B' [
/* OPT Field specific defines */
5 T4 F* U3 `. u& }. o$ n
#define OPT_SYNCDIM_SHIFT (0x00000002u)
1 P5 n, M8 \# r- Y. E
#define OPT_TCC_MASK (0x0003F000u)
" }; y3 _1 I, ]/ U
#define OPT_TCC_SHIFT (0x0000000Cu)
0 P2 R6 i. H; `' M! C& c# K
#define OPT_ITCINTEN_SHIFT (0x00000015u)
2 ~0 y% K/ Y" {8 c, P6 t3 o
#define OPT_TCINTEN_SHIFT (0x00000014u)
: u. K& v8 h0 P" e. s
6 c, e3 |+ e7 P2 X- F/ y- J
char ping_buffer[PING_PONG_BCNT];
) p9 x" E/ ]0 M
char pong_buffer[PING_PONG_BCNT];
, m+ y9 z7 s$ ~! Z
( J7 U4 R- A4 w4 ?9 {0 `7 K5 c
! n) k ]0 Z' D5 M5 Z2 T9 h8 f; u
2 {5 [. d' U6 L+ D6 x$ X/ _
! U% g' W& [8 F( T [/ C, C9 F
static void ys_edma3_init()
2 o- w$ n; }# a8 V0 n4 [0 w& h
{
& a- |7 U5 P4 M. g; C. w) W
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 y! q N3 p) { c9 m- _
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
1 e8 X8 N) ], u+ [- j0 ^6 K
EDMA3_DRV_Handle hEdma;
6 o7 R. c+ A" a* x5 G
uint32_t chId = 0;
j% {* J" B) \) w9 J7 Z* g* D& u
uint32_t tcc = 0;
# B9 L5 h) }5 a2 Z) y6 [( N( p7 _
e: `) n# s3 s3 s: Z, \. `) h
print2arm("edma3 driver init...",0);
) [4 w) D5 y3 {4 M) L L
5 h3 s! |! Q$ r* V* x
hEdma = edma3init(0,&result);
7 R* @$ P" [! T) N7 p* M! f/ s ?/ r
if(hEdma)
0 v! y( T" `# Q; @# I
{
, p k$ R$ J, L6 f% \" J; R
print2arm("edma3init() Passed.",0);
1 M+ r% N0 l( h4 S% Q# c7 ~9 D
}
: B6 Z- k# n* ^, s% b w
else
8 q) y$ B* c* \# b8 T& B4 H
{
) h3 @3 _ {" _2 o( h( E# V2 r2 m$ f
print2arm("edma3init() Failed.",0);
; h7 S% [/ k- x+ }( u0 q! K: {
}
5 q) h/ m( ]& ? m5 r
4 i0 {6 I/ w$ W; `8 h2 l
if (result == EDMA3_DRV_SOK)
0 o! O5 {/ q) G
{
4 L8 J; J8 A# |9 {+ p0 q4 f
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' A9 G! x1 \ k+ e3 p( r
(EDMA3_RM_EventQueue)0,
5 r5 e3 r# D9 u- S
&edma3_isr, NULL);
9 M+ V1 V, Q3 G; G r, g0 h
}
, g1 _4 n4 c" I6 o) D/ } G
9 ~- b4 k6 ~1 [' \' F
if(result == EDMA3_DRV_SOK)
1 J4 y0 Q3 }- y( h4 u' \4 d
{
% C, a6 k( D: C# S7 r
paramSet.srcBIdx = 0;
4 p1 s$ U' B) G0 _
paramSet.destBIdx = 1;
+ M1 b6 m; y. z2 k6 n) ?
paramSet.srcCIdx = 0;
" ~. H: @" ^0 P: ]2 B+ d
paramSet.destCIdx = 0;
$ ?$ D0 j9 Z) s/ F! h
paramSet.aCnt = PING_PONG_ACNT;
, G. G. D# O: r7 N; h4 Q8 A5 Z) W
paramSet.bCnt = PING_PONG_BCNT;
0 ~- ?! e& K. r, }( c
paramSet.cCnt = PING_PONG_CCNT;
8 K) \ N+ L) K) O. T2 {0 R
* i/ o7 ]: p a" T! S. k
/* For AB-synchronized transfers, BCNTRLD is not used. */
4 z- I8 e, G) |% Y0 T
paramSet.bCntReload = PING_PONG_BCNT;
% Y4 i9 ?4 N. R! i1 G
1 x! s9 m; T, O
/* Src in constant mode Dest in INCR modes */
' P( W7 o& B2 r& D& Q' C- _
paramSet.opt &= 0xFFFFFFFDu;
# I# z8 ~6 D5 F& T
//paramSet.opt &= 0xFFFFFFFCu;
. l. e% z% ?6 L" o
$ F; R* Z I1 `
/* Program the TCC */
4 m9 v- \5 V: Y. w. j5 i& B0 N
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
: K' R( `6 j$ o/ \' f3 x, N: I! {' g
6 @ x( L3 Q; [9 f5 D
/* Enable Intermediate & Final transfer completion interrupt */
0 ]+ u2 E' A$ s6 X! u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ v& r) C) x9 n
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
* H' i, ~4 t1 s2 y6 L9 M
- m% m; }& h: Q; z) U
/* AB Sync Transfer Mode */
; I2 X# m# ^2 Z
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
- \; T% U u% W, H" C; y. p
- [* |9 K+ k1 o- e$ Z
/* Program the source and dest addresses for master DMA channel */
7 t0 x7 \2 t$ t. {$ Q: q" l3 y
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
% q" p- M, e+ s6 Q; g8 l
paramSet.destAddr = (uint32_t)(ping_buffer);
5 a1 o" r0 K8 B
9 m: I( @5 p6 I9 u# ^" V
/* Write to the master DMA channel first. */
8 S- {& ~0 R7 s! L% {. g* f
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! l" I, O. m) f
}
+ ]6 M" h+ _" ^, b1 Q. i4 \' G2 K# [" n1 A
. {- _, o; Y1 X0 _8 t, m8 H/ J) M
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
, A0 y, }* [7 T" t/ t) M
' V, p& Z1 @5 w( s2 ?5 N1 z4 j6 {' a
if(result == EDMA3_DRV_SOK)
% L4 E0 i) c' G' S8 C1 K) |
{
0 b! E; E: v2 i. F
print2arm("edma3 driver init success.",0);
! F& _1 J0 h( A) L
}
3 F, x. k+ g' m2 p4 g; e5 Z
}
# s4 u2 |* j3 b# n. \1 Q: I9 u, y
6 D& q6 R# j$ Z5 s
7 t& o7 O. |% P( A
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
4 |1 D- p1 }3 R' p) m0 A) ~
7 A8 q6 ^, I( B$ V, o2 |
" S. k" T6 O) A8 k
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
4 a5 q9 e* u6 t' o, x
每次DMA传输完成后都要再次使能传输
& P/ o1 Q) f1 `' d
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4