嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
2 u2 N& ?: k, Q
#define PING_PONG_ACNT 1
+ \& d& U8 j# y, n$ h& D
#define PING_PONG_BCNT 8*32*40
9 D" H* u) T0 P9 ^6 u! T
//#define PING_PONG_BCNT 1
9 r/ Q0 Y2 ]) s
#define PING_PONG_CCNT 1
/ f1 A3 D3 T# ]' d F
#define MCASP_BASEADDR 0x01D00000
* g! b% {0 l& L$ Y
#define Mcasp_RXEVENTQUE (0u)
I$ Y) F; z7 F
0 E- X+ G! J- @! c
/* OPT Field specific defines */
$ Z1 T" c! [. z' p" t" c
#define OPT_SYNCDIM_SHIFT (0x00000002u)
; g6 `1 Z0 y0 b
#define OPT_TCC_MASK (0x0003F000u)
/ Z& k* f+ k y1 g( h( S
#define OPT_TCC_SHIFT (0x0000000Cu)
) P& K. F) Q4 ?7 r8 G4 b. f8 ^
#define OPT_ITCINTEN_SHIFT (0x00000015u)
$ ?2 F2 L# D* l: M+ P
#define OPT_TCINTEN_SHIFT (0x00000014u)
) V4 h) A3 v4 t8 x8 D+ b
% }5 _; f/ e K* c, M/ e, a9 q
char ping_buffer[PING_PONG_BCNT];
" I7 }% L Q" o
char pong_buffer[PING_PONG_BCNT];
* a' w, p# n: T1 n9 q
+ A. k) o& ?9 J5 s( [) C6 q% A
* W; s* Z5 f4 }: R- J9 Y3 S" U
f& G% s7 O0 w6 [( A5 g4 e
& l7 a. L- D! O/ m8 v1 f$ d9 S
static void ys_edma3_init()
# q4 `( R9 F4 o$ n8 f+ p! b) G+ O3 ?
{
3 V0 T: G) N/ T- B- f" z
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
( D% m3 {' g( M: d
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 J. O, v7 `) s* R9 T& |2 p! T
EDMA3_DRV_Handle hEdma;
6 z, J. D- e$ ? p$ y6 j6 Q8 o
uint32_t chId = 0;
2 u6 G x2 A8 f, O& V
uint32_t tcc = 0;
5 P8 L6 J' A) m. ~- l
- y* ?3 E7 a4 u! U Z9 T) C. D
print2arm("edma3 driver init...",0);
8 {! D6 a# J' o$ V1 ~
" g# n5 L. k' S% A* E+ J9 a
hEdma = edma3init(0,&result);
- M2 e+ O7 `3 [+ ?+ J' @. R2 q
if(hEdma)
5 h9 E1 p9 a y9 e
{
& ^3 e8 ^( J1 ]! N; T! }) U
print2arm("edma3init() Passed.",0);
3 S7 \: i; H+ Y/ s" }; G
}
( ~" E c4 y" f7 c$ L! v
else
/ r+ a* r' a& u+ o: r, l& l( a
{
" x% J" m/ v& F7 J$ X1 o t
print2arm("edma3init() Failed.",0);
# u- T v' q, x4 R, v
}
) m: [! r: d0 Y% _( |
, \" u a( j: M" M
if (result == EDMA3_DRV_SOK)
( `$ D0 V) P0 L
{
- s- ?" L+ _3 G/ m; [
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
; e: Y- b. H$ d- n2 ^9 X% W7 O
(EDMA3_RM_EventQueue)0,
7 n2 p9 X' z( W, v4 e6 W
&edma3_isr, NULL);
% H. ^+ M9 S; c0 L1 q2 q
}
8 R: ]( o+ ?( y1 J2 A
9 Q0 r/ e7 a" j% X6 A1 A
if(result == EDMA3_DRV_SOK)
{& H; i( e. s2 @) V
{
$ X' D# @( g+ _, H
paramSet.srcBIdx = 0;
) D0 @: ]$ h( X) Y# m- c
paramSet.destBIdx = 1;
; k* u8 j% a4 A1 X7 o' i# \
paramSet.srcCIdx = 0;
, I7 @" F) @) E
paramSet.destCIdx = 0;
- T- F0 i8 j6 U. Y9 t* i
paramSet.aCnt = PING_PONG_ACNT;
" y8 l) ]5 t+ {
paramSet.bCnt = PING_PONG_BCNT;
- \! E5 P" b. |( `8 b1 h/ N7 H
paramSet.cCnt = PING_PONG_CCNT;
! l: a+ E; j0 d1 J( p/ X
# t+ |1 {0 [0 |+ J7 `
/* For AB-synchronized transfers, BCNTRLD is not used. */
- Z( y- P: r. w5 F g; c
paramSet.bCntReload = PING_PONG_BCNT;
! O- |, w0 A! L# ]6 Y& J9 p
# N; M A$ w# t
/* Src in constant mode Dest in INCR modes */
+ l; X" {5 O& b0 H) j' @1 [
paramSet.opt &= 0xFFFFFFFDu;
0 K8 i0 H; C+ w
//paramSet.opt &= 0xFFFFFFFCu;
7 l- m# ~; o9 B
* d" f9 H+ |) S& l" ]& u' {
/* Program the TCC */
9 ?8 u6 O' T; X' S
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 _5 B' I7 L; C2 n5 d' X- x
6 `$ l- q) f P8 B; _' M( G1 {
/* Enable Intermediate & Final transfer completion interrupt */
& V2 ?5 n2 o% A! N
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# C; ~* M7 I- C1 S. p
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
4 p1 H4 O9 a V$ `$ V8 ^
; b; h* }. @% i- u2 K
/* AB Sync Transfer Mode */
+ o0 j1 v2 I3 _" l$ u0 v
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
) _/ T& W9 u7 u+ G) }
y% W% I6 h* m7 X
/* Program the source and dest addresses for master DMA channel */
* m% ~/ ^. f9 p( T
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
0 F/ \! p) N9 D9 M" p7 R
paramSet.destAddr = (uint32_t)(ping_buffer);
~$ C5 y5 ]" S2 N' I9 h8 o
W. h" z9 ~' L! ~
/* Write to the master DMA channel first. */
" l" z) ]; P+ |6 u4 k
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
" K' d; H6 z! Q- G0 L- ?
}
$ o2 j/ L" l! e2 C( i4 T7 w
3 I6 b4 Z! [- v* j
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
5 y) w' w7 X8 [
% B, @& Z2 u* V$ i8 L
if(result == EDMA3_DRV_SOK)
' g9 \& R/ ~/ D# p5 j
{
3 }7 P3 ~* L8 y" T7 e9 L
print2arm("edma3 driver init success.",0);
$ b( | I& J+ a
}
- i8 c: a B2 g7 d% X( O' j
}
5 w- W {! K" I4 y, o6 h
6 f+ O2 g/ w/ E; k7 _* L7 ~
! z, k4 E) d) p0 q Y
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
% z6 e" X, J" f# x
. w# \- q' ~& M* ^9 `! |1 r
5 I1 p8 p- ^% v/ ]# v
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
! _4 S' H5 m0 J
每次DMA传输完成后都要再次使能传输
- c! G9 m, l; y! k7 R
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4