嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
" X% l- i2 I6 f7 v. ^
#define PING_PONG_ACNT 1
/ ^' H5 _' T7 b
#define PING_PONG_BCNT 8*32*40
% t& ~9 N5 }* O: J. }- P8 K( ^
//#define PING_PONG_BCNT 1
: A9 d, t5 E; ]5 ^
#define PING_PONG_CCNT 1
; z+ G6 X3 v% S; K. o8 U' i
#define MCASP_BASEADDR 0x01D00000
! g3 @7 _! p6 q6 g4 ~: M
#define Mcasp_RXEVENTQUE (0u)
7 S1 C6 i4 V/ a# K! o) @/ v# N
) k8 v" l& m/ x1 U) b! q
/* OPT Field specific defines */
8 m( ]0 g0 a+ v& @; _' Y8 v" f
#define OPT_SYNCDIM_SHIFT (0x00000002u)
8 E) r* a1 u8 x
#define OPT_TCC_MASK (0x0003F000u)
7 [5 w! P5 \) c
#define OPT_TCC_SHIFT (0x0000000Cu)
) U1 C$ H0 q" Z8 U1 h2 E6 z( O+ _' H
#define OPT_ITCINTEN_SHIFT (0x00000015u)
7 b7 i* p$ y5 A: P
#define OPT_TCINTEN_SHIFT (0x00000014u)
, D4 t0 _" W) I& \) a$ M; x
/ ^* d$ w+ R/ M% y# u$ m, Z
char ping_buffer[PING_PONG_BCNT];
' J& i2 M3 R$ O4 t; e8 T( Z; M
char pong_buffer[PING_PONG_BCNT];
; e! c7 B* U0 f& g4 T8 c
: J4 ^7 `/ {& }6 b0 ^
" |# D5 d& m1 i) F3 `( z
6 t, X* i- D8 r$ }. W' W# N
& O; [" k! i2 O( b) T
static void ys_edma3_init()
$ N7 V4 s5 I! I4 M
{
3 w# p4 \0 k5 Z6 u# _
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
; U6 h/ i7 A* Z( }1 g3 j
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
Z/ S5 O7 C! j1 A* [# z# K7 V
EDMA3_DRV_Handle hEdma;
: ?/ `& m: A3 w) P5 \) r
uint32_t chId = 0;
! n8 R1 G* M# l9 U
uint32_t tcc = 0;
- \9 Z2 W/ { a1 W% h2 x" n0 A
' y9 H1 t' R. H" E& k7 |" O7 J
print2arm("edma3 driver init...",0);
9 @6 C. ?$ c0 g* d
- W- T: Y! h6 g0 P/ @& N0 c G. w
hEdma = edma3init(0,&result);
$ w# ^5 D5 x. F8 ^ ]% S0 w
if(hEdma)
1 {. @) G" h( Q, g
{
, x, W% I1 n2 p
print2arm("edma3init() Passed.",0);
8 l1 x0 B% m$ L& Z
}
4 T! E' l, e9 ?
else
! Q6 X' A0 Z0 I/ b8 E1 S, _
{
. t% Y; l$ z2 q
print2arm("edma3init() Failed.",0);
( _5 B( B9 K. @7 f4 r5 n" }2 e
}
( q6 v6 o& {% n3 w
/ e1 ?; b/ J6 `2 }% r% T- a9 h( {
if (result == EDMA3_DRV_SOK)
* P: O3 N% o8 ^) Q' @/ v8 ]2 n1 T
{
8 ?- `& t! J! Q
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
6 h0 [" M' e/ v# F( \, Y
(EDMA3_RM_EventQueue)0,
1 {7 }2 {8 `: [2 E
&edma3_isr, NULL);
& \$ c7 b6 Z( b3 u9 F3 Q
}
* Z1 u1 f: p8 T9 j
; Q# [5 v! }" a3 p: L1 q3 k1 i
if(result == EDMA3_DRV_SOK)
& k* T5 t7 X- ?
{
: ?5 G" x3 R8 _* y
paramSet.srcBIdx = 0;
" R; Z) n# o. D
paramSet.destBIdx = 1;
2 `$ A! p* o" o
paramSet.srcCIdx = 0;
3 |8 ?5 z$ Q' q
paramSet.destCIdx = 0;
+ O0 i5 Q( ~% m, o+ U" w
paramSet.aCnt = PING_PONG_ACNT;
) v+ r/ g3 f" B& e; K- I
paramSet.bCnt = PING_PONG_BCNT;
; |. N4 f, ?/ G$ F1 W9 u, Z
paramSet.cCnt = PING_PONG_CCNT;
u& w O4 t/ `+ q3 L1 f/ J& q, w
$ ]: _" f; y. M
/* For AB-synchronized transfers, BCNTRLD is not used. */
; @3 B. D3 H, E
paramSet.bCntReload = PING_PONG_BCNT;
1 @; N- m' ]3 T# c
7 f( ^2 n9 E! Q
/* Src in constant mode Dest in INCR modes */
/ R) s8 ^; i* D6 X! F+ B5 p4 o
paramSet.opt &= 0xFFFFFFFDu;
0 M# Q, V+ |) f. I* L/ m
//paramSet.opt &= 0xFFFFFFFCu;
6 x1 r5 ?0 \2 P2 ?
: R7 z6 f1 P' Y' B& W7 [0 w3 u
/* Program the TCC */
, O. f6 F8 }, ]4 V( l4 V. ]/ `
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
6 j2 L" s2 x: q$ o# x
- I$ q6 q6 ]) c" R
/* Enable Intermediate & Final transfer completion interrupt */
1 { b8 e, L4 B5 W7 X
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
# T. y' O8 l, H! o9 H* c
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
; x @: O0 ?+ u. M/ L) w
- @+ c" Y6 c: a& {
/* AB Sync Transfer Mode */
: p# V6 s; f% r p. ~, R3 ?
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
. T/ `; v4 U3 s& f; I3 J" U
, F+ r: }: J7 B9 `
/* Program the source and dest addresses for master DMA channel */
2 c+ @" y. r' B2 d: S- n& q
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
# |' d4 {8 E$ Q" P7 R& n0 l
paramSet.destAddr = (uint32_t)(ping_buffer);
1 F$ ?# n% z& y! I, z1 g& q
4 K+ l7 S1 o2 \3 U- x+ n7 B
/* Write to the master DMA channel first. */
1 {( d. S8 w" `7 V$ b8 h# Y- x
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
, l9 a4 Y( O8 T. _: x
}
+ h0 n8 }$ K' z8 d' l
9 Z- e# h8 P, E7 S
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
- J3 B" {/ T, E* n
# Q2 o9 A* N! U% W
if(result == EDMA3_DRV_SOK)
. S; ^; V0 l8 y' {
{
# d7 A, P- j; m% v6 B
print2arm("edma3 driver init success.",0);
" X$ A7 D0 z) {8 j7 v
}
' p$ W- ]8 ~* t! @8 F
}
7 Y' X6 i) ?; \% V" d. v& r" N
! | O( ~' P; W; a) `& k
0 r& X8 {, T4 E4 ?) U
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
0 s" T+ h$ i* v9 s; y0 u
% I8 r* U/ \2 g) ~2 O
: }0 C1 d* } \* C, M7 a
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, o t& @, {& _: N0 n8 g
每次DMA传输完成后都要再次使能传输
, \) j; {/ Z( b
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4