嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
- s1 Y2 ~3 v+ k) M, a; q6 k
#define PING_PONG_ACNT 1
2 B0 L, L, i' g1 s) L+ e8 W" n
#define PING_PONG_BCNT 8*32*40
- O9 t( N* N3 a; p) L1 o1 f
//#define PING_PONG_BCNT 1
- Y6 a8 B* G% U
#define PING_PONG_CCNT 1
- d2 e; w1 h: ]; g, f$ }. | y5 P
#define MCASP_BASEADDR 0x01D00000
( N+ \4 U* Z4 f6 G$ f
#define Mcasp_RXEVENTQUE (0u)
; a7 q; G/ N& P" N x7 W4 r
8 X$ Q5 n ?9 m$ @; a1 Z
/* OPT Field specific defines */
# G& I2 x6 Q5 w2 D& j: s
#define OPT_SYNCDIM_SHIFT (0x00000002u)
0 \! E0 \- d7 o1 G: T- Y
#define OPT_TCC_MASK (0x0003F000u)
5 Q1 n W: N! j* R, E9 X
#define OPT_TCC_SHIFT (0x0000000Cu)
2 M. ?* n# T) E0 a2 D5 V- c- e
#define OPT_ITCINTEN_SHIFT (0x00000015u)
- t( `3 O; e# {1 \# N; [1 n
#define OPT_TCINTEN_SHIFT (0x00000014u)
, s! h/ s) I$ H4 ^, [
1 ^" v* ~/ w* [' R. Q9 d
char ping_buffer[PING_PONG_BCNT];
- f+ g1 V, O. w1 h
char pong_buffer[PING_PONG_BCNT];
: L) Z9 V$ K* }
9 p' Q: r- V" z# w: ], q- i
5 F# B# W3 d. S0 z# a
% h4 D5 T1 p/ o% z
0 a' Z' L; l8 f% \- z0 s w
static void ys_edma3_init()
. s+ U% A* W8 l) k7 h- l: e
{
: \& C" g! X* u( C! M. d A
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& {& k& |! b) O2 p1 s( J
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
) P% | |! Z$ t# |
EDMA3_DRV_Handle hEdma;
7 h( E! Z z; M
uint32_t chId = 0;
" z4 C1 z: U1 Y0 t K" Q
uint32_t tcc = 0;
5 D/ v8 j- `1 ?0 |
& ~ p/ q6 i6 I3 V/ l1 b8 p! O
print2arm("edma3 driver init...",0);
) e2 G5 F$ d" l
5 |+ C! A) i! i* P2 e2 \
hEdma = edma3init(0,&result);
) E+ q0 x3 S8 I
if(hEdma)
5 G1 D5 S7 m3 n; C k
{
: F3 n: |4 y7 o4 @! ?
print2arm("edma3init() Passed.",0);
% H x( a; W1 e7 b
}
4 h' q( d" T" ~
else
; O1 X, T6 _0 U) S
{
" {4 ]$ s9 J+ K- J% }1 C. H. d
print2arm("edma3init() Failed.",0);
8 }9 s+ K2 w& P: k
}
! r. \& ^, K, ]4 m3 g
, g& j$ z# z) T8 `8 U8 w6 h2 T8 r
if (result == EDMA3_DRV_SOK)
% ~, G! h( O" c% ?; G
{
0 U' [. Q/ ?8 [5 \# Y
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
& C5 _' Q' w* H7 L& T! o" l2 b
(EDMA3_RM_EventQueue)0,
# E F5 e5 [- H6 r4 Z
&edma3_isr, NULL);
2 G! ]! p" a" W! J
}
7 G1 }1 F; l7 G' q' W2 n" t! i
! B9 w7 n$ e" h' i& p( f3 n
if(result == EDMA3_DRV_SOK)
6 ~) d$ F5 b0 \ \0 t
{
! ]: l8 @3 t* k* X4 z% `6 E
paramSet.srcBIdx = 0;
' w* t, T- K; r9 @* W5 Q
paramSet.destBIdx = 1;
! g8 E3 \6 q+ y6 F; Z
paramSet.srcCIdx = 0;
; d& w4 b# g# a) X/ n& U# ?0 u
paramSet.destCIdx = 0;
c7 U0 w8 k! a! |& W0 J
paramSet.aCnt = PING_PONG_ACNT;
. ~% a# ~8 Z$ t1 T( V( M: `# P5 d& x
paramSet.bCnt = PING_PONG_BCNT;
5 o+ P* M Z: Q0 A* `+ q4 [3 d
paramSet.cCnt = PING_PONG_CCNT;
7 q" F/ `9 p# {: @2 K" J
% m" | O; V$ a7 B; B
/* For AB-synchronized transfers, BCNTRLD is not used. */
( T! G# S U4 p$ Z
paramSet.bCntReload = PING_PONG_BCNT;
3 X( j5 J6 q/ s
: T, L9 Z9 h; ~( k- s' W' B* s3 _8 J
/* Src in constant mode Dest in INCR modes */
9 ^3 V i7 ]+ \* f* `4 v
paramSet.opt &= 0xFFFFFFFDu;
3 x7 X2 s o4 j3 `3 B/ m; p1 k. M; u
//paramSet.opt &= 0xFFFFFFFCu;
& e E0 w2 s" C; W# s* l2 i1 R
; C4 [3 I X. y) L/ ]' B8 T. d
/* Program the TCC */
- n+ l4 p8 R# f2 d: m
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
! c# I1 f+ U) X& |2 w0 B5 l
2 C% j/ K$ H: d K; o
/* Enable Intermediate & Final transfer completion interrupt */
* o! ]+ `7 h; |' S* ^9 Q
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
) d4 w$ |; Y5 W" |
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
1 `5 C0 X% t6 @8 Q, K+ |$ M
* o3 A1 O h: l5 Q9 Z
/* AB Sync Transfer Mode */
0 g- P3 h0 `) u# e; r, s, {2 M
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) |* H7 P$ p7 w6 f) m" ^( }1 c
/ J4 L; u7 _9 a9 a7 V# Q
/* Program the source and dest addresses for master DMA channel */
5 I6 x4 }0 v; g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
! C# _/ v9 N: V! I
paramSet.destAddr = (uint32_t)(ping_buffer);
3 `2 A: q8 J+ g5 J; }, m
# J# }+ y6 V n3 G5 l% ?" q! Y
/* Write to the master DMA channel first. */
' y L) U' j4 r7 z
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" H4 v: a) C0 H/ J+ @
}
! B. J3 W8 _& C& M- l
7 _) w" w- Y% y1 P
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
: n/ X& f8 h$ e5 D/ P
! N4 `0 N( s% s- V: `
if(result == EDMA3_DRV_SOK)
' C8 G5 H5 T: D: E6 ~
{
- Q W& \# M1 q! l
print2arm("edma3 driver init success.",0);
- Y! U# C; i2 T. `# ^: W
}
' t( A4 e$ p0 y
}
' a) Q& W5 ]: Q' y5 @
& ?' h( X0 F& ~$ h
1 C6 j1 S9 h3 V$ Y- G& z# Z
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
" {/ m [4 u/ \1 i; D+ U
6 B7 P: r( E9 |" J& c9 b
& P K. v( V( T4 |6 J; `
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
& u% l$ t% `4 p, C
每次DMA传输完成后都要再次使能传输
# m; b3 B, G$ P$ P
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4