嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
0 c/ z! J1 [1 V U3 r/ m& [0 d
#define PING_PONG_ACNT 1
! p( I5 l) A" q1 [# \
#define PING_PONG_BCNT 8*32*40
9 y f, h7 X# y. B7 o: i
//#define PING_PONG_BCNT 1
1 k, P `9 U6 i7 X
#define PING_PONG_CCNT 1
& U9 O9 S5 J& s/ w& R- R* y* W
#define MCASP_BASEADDR 0x01D00000
) M9 }. e/ f Q, k7 W& j& c5 W3 h
#define Mcasp_RXEVENTQUE (0u)
7 p* b1 ^: c$ x; h G/ J
/ Q. Y: E4 E# b
/* OPT Field specific defines */
% _/ G; b, ^& _0 ?7 [* f# l T) b1 S
#define OPT_SYNCDIM_SHIFT (0x00000002u)
& d, K/ I; h) W3 s' \3 n& l+ L
#define OPT_TCC_MASK (0x0003F000u)
. e, u3 J6 C9 C& f. E& u9 I
#define OPT_TCC_SHIFT (0x0000000Cu)
0 F% Q2 ~2 d I
#define OPT_ITCINTEN_SHIFT (0x00000015u)
1 y, o- z4 t( \. B4 X, o
#define OPT_TCINTEN_SHIFT (0x00000014u)
( s) ^5 e: i5 M' C
8 Y0 b" M" c5 h! m% ` Z( m- H
char ping_buffer[PING_PONG_BCNT];
$ V* G0 `2 p! @# x8 c w+ q* G
char pong_buffer[PING_PONG_BCNT];
; p$ P. H, a. c' J* U
2 F! [. }# }; h2 S
( H3 y; _) s# M: X9 P7 @/ S
! q( `) t4 s% \$ \+ k: _
) F$ ^. H$ y& O j+ g" o7 f/ U
static void ys_edma3_init()
4 }4 Y# ~* F8 p9 U
{
; d& W1 v" [# |! y8 ?$ `& l8 l
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
: `& d4 ?. T% ^
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
0 ^ A a$ u; ^4 v: m+ \
EDMA3_DRV_Handle hEdma;
8 h, p4 K! a6 x G4 Q
uint32_t chId = 0;
0 k- X- a1 H: ]# s' S
uint32_t tcc = 0;
% R1 i( e5 h8 R+ O
8 Z- h3 A$ _4 _% p
print2arm("edma3 driver init...",0);
& W" N+ v e% d( y
0 ?% b7 E9 g! z3 r
hEdma = edma3init(0,&result);
- `9 M B( [# e0 @" Z- A' S
if(hEdma)
& Y f* W$ x8 M& i2 s j/ e* P
{
, D$ {3 ?2 D% E% ?! ? v
print2arm("edma3init() Passed.",0);
/ C4 @7 u, }+ J5 i
}
; O2 t3 X. B. X) B" S
else
0 t, y% N {8 } s
{
) T9 Y9 c. t* j* x1 Y( d
print2arm("edma3init() Failed.",0);
( v- i% }3 }$ b s, U0 n. r" R
}
; U! T# k* [' G
7 A& L9 ~. N- J
if (result == EDMA3_DRV_SOK)
! J) B! O; |8 Z' u1 V6 ^* y" n9 @
{
' \ \) r5 l5 C% p3 M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
) c, `0 ~: a. \3 y
(EDMA3_RM_EventQueue)0,
4 A/ C# {2 |- s9 ?
&edma3_isr, NULL);
5 K0 Q+ b+ q- Q' s$ k0 j" {
}
0 I9 g& y9 S2 g1 ~( L8 ? `
' L7 x }1 A6 g5 \
if(result == EDMA3_DRV_SOK)
- M/ h j; s5 N' g
{
0 Z6 r9 Q. S- R/ n. @: `
paramSet.srcBIdx = 0;
0 E# K/ n- |/ Z0 g. w- y
paramSet.destBIdx = 1;
6 B. F8 I0 J$ J0 l" q
paramSet.srcCIdx = 0;
o p4 B# z* a( `8 `8 a' L, d
paramSet.destCIdx = 0;
, M8 B/ `7 ?/ V* q
paramSet.aCnt = PING_PONG_ACNT;
2 E& D$ w# E, P5 C1 _% n6 a
paramSet.bCnt = PING_PONG_BCNT;
6 i& V3 q, l9 M5 l
paramSet.cCnt = PING_PONG_CCNT;
* {; C8 R' C! t t1 g5 D
r, ^. O K6 C/ h
/* For AB-synchronized transfers, BCNTRLD is not used. */
* ~# o u1 R. Q
paramSet.bCntReload = PING_PONG_BCNT;
: e; b3 C+ o( v% s0 A; S( ~8 J
+ i. \9 q; Q9 \- \
/* Src in constant mode Dest in INCR modes */
" [" {* c: w. O* j; ^
paramSet.opt &= 0xFFFFFFFDu;
& x4 a5 O y! i# R
//paramSet.opt &= 0xFFFFFFFCu;
, a$ V3 @9 [6 v) T; D1 U- k
9 u- d) D4 W3 v0 \+ e. d
/* Program the TCC */
% e1 y, ^% q5 D, U* A
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
) _; K2 u) f" j3 o* `( y2 Y' x
) a/ c0 v1 G1 y6 S. @! v! J
/* Enable Intermediate & Final transfer completion interrupt */
3 K' s* l& [& h1 E# k3 \7 q- Q7 v8 |
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 X$ \* g0 a$ l) L. O. o. |: M- V
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' z: t' N. x8 d# D7 t
. Y/ h) H+ p0 C$ U5 I
/* AB Sync Transfer Mode */
( X1 W7 r. J* I0 B4 o3 U
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
2 b" B! a4 ], E: ?9 m' C
6 i6 u T; q8 }6 K7 _" b' M3 U/ f. w
/* Program the source and dest addresses for master DMA channel */
" v7 [. H7 M, k; f& c' x E. u+ X
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
- `9 E$ I7 p% W3 v( H
paramSet.destAddr = (uint32_t)(ping_buffer);
* C/ [5 E* q3 V
9 {3 B% B5 M6 Y
/* Write to the master DMA channel first. */
. I$ R' j( [: ^: i6 R, N1 i
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! d! J p3 L5 O3 B' I" x
}
9 c; e( u' K5 j/ `6 B
7 y7 e& f; ]4 {, @9 U( C
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
% v. J3 J6 P5 z% {; S7 }
9 y) p: s0 m& X: Z; ~, X
if(result == EDMA3_DRV_SOK)
& w# a7 q2 p! {( k( z
{
3 M8 y! B$ W- n! r1 R: y: w. q
print2arm("edma3 driver init success.",0);
/ I! k3 @4 r- V6 d0 b; \" t1 K
}
+ k- j, J6 z* t$ I% j0 N
}
" F/ v o0 b+ _; r0 n- U5 p
, `- B* u6 X( X
5 P) Z& `. E) Q, A, j
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
2 O4 f9 [- {, X+ f3 n
7 T5 H! S6 q4 N) d
: O" E2 M( x2 } v4 w% J
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ {1 { S6 B1 B) K F2 x& [) r
每次DMA传输完成后都要再次使能传输
* J; n: q: K0 B/ u! D5 l& ]
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4