嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' P8 E2 U# `+ T6 _( ^( C- u
#define PING_PONG_ACNT 1
! q$ _9 c) F( f1 W7 Y: F
#define PING_PONG_BCNT 8*32*40
, V6 d* S$ F% A6 X8 M! B9 k# L
//#define PING_PONG_BCNT 1
5 j3 {& T( O& n7 b
#define PING_PONG_CCNT 1
/ B, ?1 T, ?, o% m( B) B' v
#define MCASP_BASEADDR 0x01D00000
8 R" w: k# J* a: w/ \
#define Mcasp_RXEVENTQUE (0u)
5 i5 d1 }. R) A7 k& T
" u3 r& [, T& x# F6 y7 ?. ^
/* OPT Field specific defines */
- H, L! D" \: u/ c
#define OPT_SYNCDIM_SHIFT (0x00000002u)
) C: T$ f9 S4 _/ i2 P
#define OPT_TCC_MASK (0x0003F000u)
, S9 J! m" w4 S0 D; E
#define OPT_TCC_SHIFT (0x0000000Cu)
( v1 i, H8 `0 a6 I9 h3 m |7 R
#define OPT_ITCINTEN_SHIFT (0x00000015u)
# h- E4 \# @# W) f% N
#define OPT_TCINTEN_SHIFT (0x00000014u)
* o9 D0 m; p+ \( R2 v9 w1 v
$ R: e9 T4 s# F g! v8 w1 i* `
char ping_buffer[PING_PONG_BCNT];
6 F8 X- b: T" w) q
char pong_buffer[PING_PONG_BCNT];
& p1 F( T9 D, w: p% [" g
. j9 K1 B: i; Q8 S2 d7 [' s- L# f/ g
& j0 U1 x/ w" k' ?4 K
, ` i! f8 s" s& n& x! C- S: [
) O4 j# y, {' d
static void ys_edma3_init()
. R% g/ X* g7 `0 o
{
- _! U$ r! E8 P
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; V8 K F8 p% H; S6 Z# o: P# E" G' i
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
+ f4 j- e. ~9 A) p! O& A
EDMA3_DRV_Handle hEdma;
% s# B. I, P3 p% [' W
uint32_t chId = 0;
% Q9 y/ S7 A7 @
uint32_t tcc = 0;
9 u4 ]( H+ ]$ s2 n
8 l- w5 r3 z8 A1 \
print2arm("edma3 driver init...",0);
9 Y9 V* P& k' o8 H- y
4 t1 r7 Q: E* h5 ~5 a. ]& O
hEdma = edma3init(0,&result);
p1 p& @) @; f: h% {6 C& ^, I* e
if(hEdma)
3 K; F: o% ]3 ?1 I$ p" o
{
/ e9 n* b0 o* e) a' n
print2arm("edma3init() Passed.",0);
4 Z7 C7 r4 r v3 r9 P( y" e
}
" L& S5 k; w- e
else
9 M- m* u7 b% n+ [, S
{
# [- n0 K$ F. U, f% @$ N
print2arm("edma3init() Failed.",0);
1 H" P- ~- E% l! O
}
2 Z' ]0 J) i" R5 @$ c- _, d
8 a8 S) U$ C/ Q8 X& q
if (result == EDMA3_DRV_SOK)
1 g- ?/ a7 K: Z o
{
# s& {5 X; c" i+ t
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
5 }+ D* I2 h {9 N% @ k: n9 R
(EDMA3_RM_EventQueue)0,
% @6 l3 m! [( R: t( L
&edma3_isr, NULL);
5 c6 W) U+ i1 A/ K
}
T7 Y/ i: n5 E( w( [) J
: x- L) `* o, i# n
if(result == EDMA3_DRV_SOK)
' t) V, O( F+ R" \
{
- L/ c, e. O. X0 {) ^
paramSet.srcBIdx = 0;
8 Q+ [* L; Z8 Y, q
paramSet.destBIdx = 1;
9 F& x% W) z/ ?9 S
paramSet.srcCIdx = 0;
; Q; e3 C/ [- A0 z/ R
paramSet.destCIdx = 0;
2 I2 }3 a P0 {( W5 k
paramSet.aCnt = PING_PONG_ACNT;
5 ?. c' s7 n. s
paramSet.bCnt = PING_PONG_BCNT;
; i( s" |$ V- j; U1 a; v/ L1 d
paramSet.cCnt = PING_PONG_CCNT;
/ k% i4 ~& e2 I2 d1 g0 E
, |5 p7 m6 @2 z
/* For AB-synchronized transfers, BCNTRLD is not used. */
6 P' @2 R" h# G5 [# c
paramSet.bCntReload = PING_PONG_BCNT;
9 u: M l q0 ?+ e
# Q, K, f& p' ^ I0 o8 @
/* Src in constant mode Dest in INCR modes */
6 O6 Z, v- C8 K: V# z+ T# r
paramSet.opt &= 0xFFFFFFFDu;
2 Q" T' k# {5 q K
//paramSet.opt &= 0xFFFFFFFCu;
A7 @( S% N( Y9 j
) x L, k9 i7 `5 R1 ?+ g
/* Program the TCC */
7 x1 r- C4 z/ O7 u& n2 h
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! L( ^/ V1 j5 j$ N8 ~
5 @, ^, {2 w% ^( i
/* Enable Intermediate & Final transfer completion interrupt */
& J% W& ?" w3 z0 m" \7 s+ B, @: P
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
' l4 F# G8 N; ]2 H' p9 k( N4 B. r
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
6 e5 b; e9 C, _: @# d! n& e) ]
; N4 ?' p* G: ~! ~$ `3 \+ a
/* AB Sync Transfer Mode */
+ f1 \$ ]3 O! ]3 D; }4 j- S
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
9 ~8 L" h0 U& |5 L! Q3 F# {$ i4 `
3 o- @, G2 z& G0 F. a$ w7 o
/* Program the source and dest addresses for master DMA channel */
- Q9 f$ v( d8 N- p. I5 u7 |6 x
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# L3 Z# b3 t# e. c) q
paramSet.destAddr = (uint32_t)(ping_buffer);
% s7 N; n; }* u2 {8 z/ o8 O
. N7 Q: `5 \$ n+ a
/* Write to the master DMA channel first. */
\1 L+ S" L# U" D: M/ i- V3 N
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! H! |$ C* u0 z3 t7 O8 O
}
3 B' e7 \* X3 d; A* v0 |9 r
+ N. b, z* `* n3 e
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
& B4 G( z1 o/ [! I k8 o7 @1 o j
' n; }$ l) n0 j# |' q. e j: b7 z
if(result == EDMA3_DRV_SOK)
! }) }. X+ v# r" l' Z
{
: N# H3 N0 ?1 |2 ^: I, U6 r* k' [5 y& r
print2arm("edma3 driver init success.",0);
; K+ {9 O$ o; {) ^/ B1 Z
}
- |' t8 h: E: `, Z
}
. K; t3 v A$ L' x, N% B/ R1 g
+ R5 ?0 _& n* ?
3 t* a8 [/ w) E$ S m1 t3 z3 } a: @+ p
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
9 k- d8 C8 B, k6 Q+ y4 ?9 `4 @
/ ~# F. `, I& q6 Z0 Q& C' a
' {2 c/ F! E+ J8 M
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
O, c) v6 }& s+ \$ ^1 f+ J
每次DMA传输完成后都要再次使能传输
( d% }8 |% N4 r& _$ k
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4