嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" u5 P4 ~! M1 P9 e
#define PING_PONG_ACNT 1
3 p q/ E: x- f1 Q5 P% b
#define PING_PONG_BCNT 8*32*40
! Q/ u, T9 _; s7 v+ m i$ Z0 E
//#define PING_PONG_BCNT 1
3 s% x6 M0 y$ S. S3 _* X& ^ ~
#define PING_PONG_CCNT 1
" \! y( J1 |$ h% q
#define MCASP_BASEADDR 0x01D00000
) N+ b5 n: Q$ Z% \' h
#define Mcasp_RXEVENTQUE (0u)
0 B! q# s# g, H8 N7 V9 C
6 r! C, ]4 p- b! B4 ?
/* OPT Field specific defines */
: d" r5 z/ U% l4 W1 [: P! c; }
#define OPT_SYNCDIM_SHIFT (0x00000002u)
/ l9 B2 v7 B: E; q9 m. E) R1 ~9 e" T
#define OPT_TCC_MASK (0x0003F000u)
6 s) ^0 ?% O7 K X
#define OPT_TCC_SHIFT (0x0000000Cu)
7 F I( g& j/ @1 J' Q0 U
#define OPT_ITCINTEN_SHIFT (0x00000015u)
0 u$ t% D) h' W' a. E4 k
#define OPT_TCINTEN_SHIFT (0x00000014u)
( y( o: C7 i8 M. R8 T: c
, I3 i$ a/ E* s$ p' c
char ping_buffer[PING_PONG_BCNT];
+ A4 q: [6 m5 j3 T# g; @1 A
char pong_buffer[PING_PONG_BCNT];
% m3 u# Z* N1 Z: G5 j t6 |
' i: V" p* z2 `5 P6 q! w
) e: ^3 Z7 p' @/ @/ I6 @
$ p+ {6 J& `! n9 C
+ c8 ^( n9 t; [. u
static void ys_edma3_init()
; p% F& x' |" A- l7 ^
{
: M2 G6 ~/ W( Y% b+ P
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
0 F- q! c) _- A: L
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
4 V, L8 m+ [8 A# S ^; X
EDMA3_DRV_Handle hEdma;
- z" d% a$ y7 E& }
uint32_t chId = 0;
6 }+ H) {! S4 p
uint32_t tcc = 0;
* t5 H* h) ?6 r/ T, k# P) O* ?5 O$ r
, k% O/ Q6 [( u$ D+ N9 M
print2arm("edma3 driver init...",0);
! B: Z3 _9 H! I! t
5 g2 V6 n* Z# z" p9 a& Y
hEdma = edma3init(0,&result);
# s2 m) G, a: w4 }: e- ^
if(hEdma)
: M. e8 X! M' U. l4 J
{
: O' g7 _# F! b+ Q5 v
print2arm("edma3init() Passed.",0);
' t' i; ]# c( l4 c
}
& r4 U) F2 r# x2 K/ a% b7 N- K
else
) d* X3 F: \: _4 G+ ]
{
; i: t* _1 L0 w
print2arm("edma3init() Failed.",0);
& B$ E" H2 W' g! I
}
3 _6 a# T b: n2 R
/ X0 |1 z; E+ Q# \+ a
if (result == EDMA3_DRV_SOK)
0 I) c) y$ X4 U/ l
{
( f# T8 T/ f9 c5 A/ b
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 J5 y- N" Y6 K6 E. Y: |
(EDMA3_RM_EventQueue)0,
% B' o0 \4 ]6 |( }/ v
&edma3_isr, NULL);
* |8 c& t& X# D6 n
}
5 l" b5 U8 y: K0 G* q
, P9 h+ m: s, I1 |9 o
if(result == EDMA3_DRV_SOK)
+ e/ Q9 M; ~- q0 d9 z" K3 p8 W2 M2 p
{
( l! I% b9 n. Y5 e# [0 H! r! C
paramSet.srcBIdx = 0;
/ f# }( w8 {: V$ m
paramSet.destBIdx = 1;
, l% u# _. N( e, l. V: ], C
paramSet.srcCIdx = 0;
+ D1 ]# m, _- M
paramSet.destCIdx = 0;
4 B; A: b$ J# \
paramSet.aCnt = PING_PONG_ACNT;
" G/ I. X8 Z4 Q- X# o
paramSet.bCnt = PING_PONG_BCNT;
3 F2 f0 o: f) _! z: u1 `4 s( @4 x
paramSet.cCnt = PING_PONG_CCNT;
, Z. l* n! k: }3 L4 W! f
0 ]- q" }( n3 ?6 U' e) L8 Q, j
/* For AB-synchronized transfers, BCNTRLD is not used. */
9 ?3 ]3 g+ {" {% t, i! e3 F7 W
paramSet.bCntReload = PING_PONG_BCNT;
1 S" u0 \5 |/ B$ W/ Q# y/ I
. I$ `8 C7 X% R* F7 t9 \! w) L
/* Src in constant mode Dest in INCR modes */
6 V1 G9 }: [, u7 t0 P( {
paramSet.opt &= 0xFFFFFFFDu;
& z/ [4 j8 `. N0 V0 ?( c) m
//paramSet.opt &= 0xFFFFFFFCu;
. \) q9 l% d; w. M L* n
: B7 W* E: t- b) [/ A/ l( w9 D" Q
/* Program the TCC */
" ~7 w- `. ~3 W
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
& t0 r( P; W* w( n9 N5 q! F8 l8 X
5 n4 c0 d3 ?3 r
/* Enable Intermediate & Final transfer completion interrupt */
t l. G0 H- u
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
9 H8 y! h( C& A, o% u" h( B7 ]
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
7 d/ r3 m: A; E0 f$ Y/ ]
- |- B5 y# I& W
/* AB Sync Transfer Mode */
) _3 o0 D1 P' R, C
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% l# ?( X; O# T7 _9 o4 Q4 e: n c
% \8 v3 ?8 i5 U/ S7 t- w2 ?
/* Program the source and dest addresses for master DMA channel */
' Z& g, X- q/ f) ~) b4 n) d- l
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 z6 I% |8 \' m: N! M: M0 N
paramSet.destAddr = (uint32_t)(ping_buffer);
- I' h T: i4 }/ J% E( H# E( g6 C9 K5 N
- I" _* H; E) T; ?
/* Write to the master DMA channel first. */
, ~: e* |* Y% A! y) u/ x: V' z
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
2 |9 X P# Q8 G# X
}
( }5 S# `0 }4 S6 N
2 p6 i- ]9 ^8 q
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
7 ?5 |8 I, t, _' ~0 \8 e
& u, A& y/ M# Q" t" {4 M
if(result == EDMA3_DRV_SOK)
& b& G- f6 W9 }6 E5 @% F
{
! |: f! V$ [! c9 a# ]
print2arm("edma3 driver init success.",0);
( V+ S5 ?5 P; h/ O6 Q1 g- t! L9 v
}
, y, {7 v! j( N* B& k- k3 }/ k
}
0 m% p4 m- V$ G1 x
/ t# Y3 k) r, i, k& X- t
! Y1 V3 Z! i& c6 K# H) W( y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
6 v/ [/ b7 [5 X
" t& b7 T4 e* a' ^5 G& _
- J2 `: [7 u! F: h3 v
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
7 C9 t) q1 W! r9 k9 N
每次DMA传输完成后都要再次使能传输
+ ~( ~/ F4 m' t5 f/ E6 [
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4