嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
: C1 ?# g; N& j, A' e& G8 x
#define PING_PONG_ACNT 1
1 y( j9 l2 w! Q% K$ V- c3 d7 e
#define PING_PONG_BCNT 8*32*40
: [+ T" L6 {6 m: \5 I0 U1 i
//#define PING_PONG_BCNT 1
6 v& `6 |9 N) G. J
#define PING_PONG_CCNT 1
* Z, ?9 l5 v, W+ \; m+ M" b p
#define MCASP_BASEADDR 0x01D00000
' u5 M' {: O e c$ ]
#define Mcasp_RXEVENTQUE (0u)
7 }7 [4 |. |4 q* W
& p0 `# A5 o% J) Y% b! j
/* OPT Field specific defines */
8 w p# L/ @4 X4 i( {: ?' O y
#define OPT_SYNCDIM_SHIFT (0x00000002u)
! ^& o% q4 m. `! v! B
#define OPT_TCC_MASK (0x0003F000u)
5 D. o( P9 h* m
#define OPT_TCC_SHIFT (0x0000000Cu)
5 m5 \! T8 V! j! B/ j7 B& T; F/ L
#define OPT_ITCINTEN_SHIFT (0x00000015u)
9 \& `2 R6 Z0 ^/ U$ u" w
#define OPT_TCINTEN_SHIFT (0x00000014u)
0 P) T4 _& a1 R' q
& J0 b7 C( d5 c3 ~" Y2 s( \
char ping_buffer[PING_PONG_BCNT];
) w/ M" w5 y& P3 z! e! [( c8 I
char pong_buffer[PING_PONG_BCNT];
' y# D7 `6 \% I
% g% L* X! O! w6 E8 ~$ x f7 a6 L/ e' g
5 E b( C q2 S$ n9 a/ Q, F3 L# y/ i
( |8 s+ A7 H0 B- }9 k9 U' c
0 I" Z: A" @7 ]7 K; E2 a
static void ys_edma3_init()
3 s: s2 R& W) h2 Q9 \
{
6 F4 `/ D1 c& g
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
/ z& }* @7 [0 R( [; |# `5 T
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 y1 T5 z) R7 Q3 Z
EDMA3_DRV_Handle hEdma;
& o1 U! Y8 q, m5 ?2 C
uint32_t chId = 0;
/ }. ]& D* B) U* n1 J
uint32_t tcc = 0;
& H$ e7 ^$ v7 l( x
% o3 a- o/ A# ?# d E
print2arm("edma3 driver init...",0);
/ e) v1 X/ |1 l% I7 K
8 f* @- X; i+ g4 C3 Q- H. N
hEdma = edma3init(0,&result);
- z8 [/ ~& t: T b* W5 E9 ?9 b
if(hEdma)
- w' ?' d; o: B' `
{
+ Z* x, F% v0 Z7 V9 l" N
print2arm("edma3init() Passed.",0);
% U+ H, \* H; S8 S. {3 K
}
; ?) N. D9 k; d8 N4 [4 Z
else
. H l; y3 }+ U( j; t
{
; h$ d4 q" m1 U
print2arm("edma3init() Failed.",0);
/ k* z7 }. @, k: ], U
}
) {; u% G8 X* {) `5 `
& e v. H- r1 E6 b5 m
if (result == EDMA3_DRV_SOK)
& f" K7 L& P% ?5 D0 w
{
: H1 H: W+ \/ x( H7 p0 S
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
7 p0 Z7 v6 ^9 @8 p; [2 k, z- @* M: Y7 j/ Y
(EDMA3_RM_EventQueue)0,
5 O8 D0 i1 A" S0 Q! R
&edma3_isr, NULL);
# w& {9 K4 B5 v) f/ q6 G9 e
}
! s7 K" M/ A7 g! g% a
. y; w# u+ @ a$ ~3 ~4 \. _8 w c; I
if(result == EDMA3_DRV_SOK)
3 [* X/ j2 N/ }6 ?" {
{
( o V. R X" e7 S+ u
paramSet.srcBIdx = 0;
- q/ C! q4 o* K8 x' c
paramSet.destBIdx = 1;
* E: b3 G8 k# O* `( |. g
paramSet.srcCIdx = 0;
* p0 _; T8 Q" } c+ `
paramSet.destCIdx = 0;
) R) \8 s6 D+ |1 W+ v) S* l+ H
paramSet.aCnt = PING_PONG_ACNT;
9 W3 `& S& F4 ]+ {8 p
paramSet.bCnt = PING_PONG_BCNT;
8 C+ r+ `# m! B* L; c% }
paramSet.cCnt = PING_PONG_CCNT;
3 M( w. I6 U, c) k( ~
1 ?- m' H7 K! C l
/* For AB-synchronized transfers, BCNTRLD is not used. */
& o2 H( z4 [0 M& Z* W2 r- D' t: A
paramSet.bCntReload = PING_PONG_BCNT;
* ^4 v+ H% D* `/ R" y
: Y8 W2 @! u, T7 D
/* Src in constant mode Dest in INCR modes */
3 u. {: ]. A, W H" X/ V& c
paramSet.opt &= 0xFFFFFFFDu;
+ p0 R g7 b5 W% B ]) z2 d
//paramSet.opt &= 0xFFFFFFFCu;
! v2 R: k- e9 j$ D7 ?3 @
6 C: @* F: G9 Q5 L r. D1 ~
/* Program the TCC */
) b) B: P. p1 T7 w, a# J
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) I$ ~7 Q0 S. u& v/ I/ C* Y& a
3 o" t" j+ A1 @' }: X
/* Enable Intermediate & Final transfer completion interrupt */
5 U. w+ i, B6 }5 Q6 f3 m' o |5 l0 v) L
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
3 W1 y. Y& z: a. z4 i
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' t3 |6 _8 ^6 t
: B/ l$ ^* i9 N4 {( k- @8 V
/* AB Sync Transfer Mode */
7 n, D) {4 F8 v- X6 s+ s% C J
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 z1 c9 |( ]7 c: i1 y+ \
# }1 M @$ F" L' x2 c
/* Program the source and dest addresses for master DMA channel */
/ N( ~; B4 M5 g1 g7 L
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
5 n9 t8 ^6 c4 o; K' @1 k$ d
paramSet.destAddr = (uint32_t)(ping_buffer);
+ a8 \7 \9 H& Z# ~$ l. u1 Z
% z) Z4 G, @) z& @, S9 {3 U
/* Write to the master DMA channel first. */
0 M1 Y; ]" R4 a4 b/ j# v
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 }# Z. g% c: \! T
}
& ~' I; M# M/ ~! ^( q @. T2 a' i
5 d+ S9 E+ H. d9 }' Z% U
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
. H& j: v6 P( b" b
8 S* s/ D( N: i& l, \* b
if(result == EDMA3_DRV_SOK)
% |7 W" {3 C: q, Z% }, [
{
! P1 b) {( O0 ^1 P0 b7 H/ U3 k
print2arm("edma3 driver init success.",0);
$ ?6 u' ]- G4 Y m$ }; x5 G
}
# z" P! B# l* o* P7 E! n* a+ Q* ]
}
) Y/ O! j6 b6 O6 ?, x- x1 \
0 u) `0 ~8 ]5 z' v8 I* j
9 [; K5 X' E1 {; g+ v( j, h* o: P
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
/ I9 ^5 y+ @' Z- p
, j7 J/ p) e3 _6 l# j# F8 N! D; N# D
$ \9 Q9 _2 }/ P# x+ r
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
8 o+ ^4 n& |. Q; x, I$ |( j
每次DMA传输完成后都要再次使能传输
/ [. ]* E1 l" d) x, I3 ]
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4