嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: b9 k& z) Y: O+ i) a
#define PING_PONG_ACNT 1
8 C/ V* ]7 `0 N8 H
#define PING_PONG_BCNT 8*32*40
1 o, h% p' i/ a4 {9 Y
//#define PING_PONG_BCNT 1
# {9 g( G3 I! u
#define PING_PONG_CCNT 1
( B% Y1 @4 x: M* @- ]
#define MCASP_BASEADDR 0x01D00000
t! {0 F' ]9 l; v
#define Mcasp_RXEVENTQUE (0u)
' L$ Z/ R1 d* T& G, s9 W
: N# d6 n- u' @; a/ G
/* OPT Field specific defines */
^; `4 Q# V4 m
#define OPT_SYNCDIM_SHIFT (0x00000002u)
7 T# s" @, V& V! q7 k& P7 o
#define OPT_TCC_MASK (0x0003F000u)
, U. U+ t6 N; B# {- s
#define OPT_TCC_SHIFT (0x0000000Cu)
- G- G+ I* l: M! R1 Y& s
#define OPT_ITCINTEN_SHIFT (0x00000015u)
, M& Z0 C! x. n7 `4 `6 M
#define OPT_TCINTEN_SHIFT (0x00000014u)
( P3 {6 w- b8 W0 Z
4 ^' B1 M! R L# L" k0 C2 {" j# G
char ping_buffer[PING_PONG_BCNT];
, T$ M5 H' W% S8 }' {. X+ e) H
char pong_buffer[PING_PONG_BCNT];
( d+ d: @) j$ M8 `. G8 ~8 ?
3 g2 U6 t3 p+ \1 o& F( ?
0 [% d+ z; g1 g. m) k9 m
' x! A& S2 U: W7 c
. e# P8 v0 D U4 m' F1 C+ y
static void ys_edma3_init()
" a6 c) H. G; s4 v
{
) ~) }0 ^5 F% O( p; S
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
" m# C2 b2 q5 i3 O/ Z' D, f
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
* B( u% R0 W" M. c; k$ D
EDMA3_DRV_Handle hEdma;
) \/ i. e5 `# {
uint32_t chId = 0;
! o- j$ A9 e9 i& E% W( E
uint32_t tcc = 0;
$ C; _4 @ u2 O4 c
" Q+ m& \: u" w* t4 W+ x. _* \
print2arm("edma3 driver init...",0);
6 \) s( d, C1 j( g1 x
, I( z# L9 S6 m' Q/ V( J3 d2 c
hEdma = edma3init(0,&result);
' C4 s6 {- v, `5 e$ R
if(hEdma)
4 q- S: n$ c! o0 I
{
9 h9 c) w6 k5 @+ H: P" X3 Y
print2arm("edma3init() Passed.",0);
& l% N# ]* M* C
}
5 C+ f8 M; F3 V1 [* o& u
else
! \/ @& e+ X8 e' C) \2 Z$ S
{
9 p2 l; E/ O+ V
print2arm("edma3init() Failed.",0);
: [9 w1 e+ s5 |: Q6 X" D
}
7 b- t$ X! P: {( x
8 r3 Y9 B6 ^2 H, X
if (result == EDMA3_DRV_SOK)
! `/ y' O: Y+ e
{
$ P6 ~4 s" E! [2 H& z
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 i \" [2 t; }5 V" C5 W3 h6 K6 R
(EDMA3_RM_EventQueue)0,
2 v0 Q# h, P; I, K$ N- x, i5 i, ^
&edma3_isr, NULL);
. F* C8 M+ |) Q3 g r
}
) x( W+ S8 K. }) {0 z
# [: z8 g9 V2 @
if(result == EDMA3_DRV_SOK)
/ x- |+ Y. A2 p) y
{
8 ?5 y# Y8 H6 S. M% z1 H" ?7 ^( \
paramSet.srcBIdx = 0;
0 l6 [ i* y$ U% L3 U0 n- o. T
paramSet.destBIdx = 1;
9 ~* [% t1 O) H% _, E
paramSet.srcCIdx = 0;
! [9 U: Z2 }6 Y% M
paramSet.destCIdx = 0;
; O6 K( M2 x2 }: C7 A" R
paramSet.aCnt = PING_PONG_ACNT;
& G% `1 m8 c* L" }' \* C: Q J6 _
paramSet.bCnt = PING_PONG_BCNT;
* |/ B# R- n2 ], B: @% y
paramSet.cCnt = PING_PONG_CCNT;
$ V' e! L6 ]' ~ H
* M7 [! F+ w9 v6 x* }5 ?3 S
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 K1 j; a( ]- y2 ~
paramSet.bCntReload = PING_PONG_BCNT;
7 ~. e$ ]; b6 j2 B
! ^# M) a) V" @3 ]: u' T
/* Src in constant mode Dest in INCR modes */
2 [' T8 U! k# y( q1 ~9 J. N
paramSet.opt &= 0xFFFFFFFDu;
~; s/ ?9 D1 ^6 R. G8 P1 T
//paramSet.opt &= 0xFFFFFFFCu;
9 o; R/ T7 b" X' H
4 t7 U9 B6 p& U) l+ j
/* Program the TCC */
1 u f/ q3 a2 a- I
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 h |/ j3 D5 ~# J2 Q. ^% |6 b
. }4 G( f( N3 Y8 K" [2 ]' ?
/* Enable Intermediate & Final transfer completion interrupt */
0 Z8 h" j3 V- ~, z
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ k# v8 d3 s3 b, a4 U( c
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
+ T0 h4 S+ O) p/ g, q
7 G, l. t) g3 m% K
/* AB Sync Transfer Mode */
1 a- B1 F: Z+ N) B, ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
" d, {/ [+ q7 X6 F. x# z
/ R6 h& E6 Q" p; [+ X$ I% t4 F2 T
/* Program the source and dest addresses for master DMA channel */
9 _' V6 N( R. B) f, a( t- J+ F4 [
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
$ s# \9 n. [5 f. R
paramSet.destAddr = (uint32_t)(ping_buffer);
$ l F1 _& q& s6 N
) x( U2 @! {. Q
/* Write to the master DMA channel first. */
1 d2 o& b9 X. [+ r1 B$ A3 N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
9 e3 z& G7 {9 D
}
) q: ?! P$ L: [- f
: R' H) E6 G9 {! Y( Y, V( v
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
3 j5 ]4 e' n' }. d
3 {* s8 W- v# @) q
if(result == EDMA3_DRV_SOK)
8 j$ P" o5 y2 Q0 H8 q
{
, F% K; {8 d! @ S' M- Z2 g
print2arm("edma3 driver init success.",0);
0 Q. |) R: | p: t: W
}
3 ]4 k% P7 _$ R, A1 S5 H
}
1 }9 I. y: Y# A8 }5 {2 C
, Y( k: ~5 t# y/ g
% ]- G2 Y; b8 K6 Q+ Z) |) E
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% q, \3 ]+ \4 `: {3 S3 b
+ U: N; r. Y2 P: b& i" J
3 c6 |* Z- S, I5 a9 `/ a- ^9 p% C
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ f, _. E0 M0 b. E! b
每次DMA传输完成后都要再次使能传输
" y7 a1 l2 S5 _8 E/ A( c# z* A. {/ k
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4