嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
5 y& k/ [% s; ?
#define PING_PONG_ACNT 1
& @) U5 `% f& _
#define PING_PONG_BCNT 8*32*40
" _% f k' i2 t2 K; h
//#define PING_PONG_BCNT 1
; l, e+ S+ n4 m3 }8 \( ]# @9 I
#define PING_PONG_CCNT 1
" D9 V* w, U1 {2 A- X
#define MCASP_BASEADDR 0x01D00000
$ c2 B# B* B& t# w. _5 X
#define Mcasp_RXEVENTQUE (0u)
5 E8 Q0 c1 D2 ?9 G4 x
8 {+ @: K; I+ q5 |0 _; Y8 U$ l
/* OPT Field specific defines */
+ R9 D) L/ m7 X) k
#define OPT_SYNCDIM_SHIFT (0x00000002u)
. J) y5 m- c' i' R
#define OPT_TCC_MASK (0x0003F000u)
: \: R5 K1 j* `8 ~
#define OPT_TCC_SHIFT (0x0000000Cu)
2 [/ u% ~7 [6 s* ~+ n A S$ W) g
#define OPT_ITCINTEN_SHIFT (0x00000015u)
8 @$ @& ?/ f2 H6 u; {1 ^/ O
#define OPT_TCINTEN_SHIFT (0x00000014u)
3 o/ |$ }, c: }& T8 I: @4 Q
% A5 t9 S* z5 A9 Y) N
char ping_buffer[PING_PONG_BCNT];
0 h" S1 F! D' Q5 K
char pong_buffer[PING_PONG_BCNT];
" r$ j- T5 _" M: c/ k
; e2 q( B) }) u3 g9 F; r+ F
: ` d; d( g# B
% V K# `) r8 ]; {/ a/ f
8 `; |8 P/ A1 {4 ?4 R% K" N5 s, \
static void ys_edma3_init()
( h, R2 `9 ~% F9 C2 {9 d$ F
{
2 |1 D, `0 g5 s: W Y$ M/ @6 c0 P, ~* Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
. ^6 q( J! a; y4 I) Y" a7 q
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
- }8 g! L+ R" S+ p/ }
EDMA3_DRV_Handle hEdma;
/ w& n9 h2 k' N' \( M. G0 ]* b
uint32_t chId = 0;
/ T" w" |1 Y( F) d
uint32_t tcc = 0;
! \1 G/ i3 R2 l6 Y# g/ l' F8 T
# z1 `4 R& }8 v& y) i
print2arm("edma3 driver init...",0);
/ `. B3 E+ S4 g% Y# N
1 C- w! `5 B9 c% s
hEdma = edma3init(0,&result);
, c' Z; I, h+ E/ E
if(hEdma)
+ C1 @% c" Q$ O
{
% V. X% y$ v' @* C
print2arm("edma3init() Passed.",0);
9 }2 G1 t* _5 B9 j' b" g+ I# {. ?- ?; @
}
* w$ q' O; U7 b# f/ q0 W: b
else
T5 H9 s- z* U* q5 f) f
{
/ \4 j2 Z3 a9 b9 x8 W b
print2arm("edma3init() Failed.",0);
- L. y# n; c1 s4 D/ O
}
/ s5 ^% v+ S% I, g! B( z
7 P+ G. p* k9 L" y! V
if (result == EDMA3_DRV_SOK)
/ j% d/ [; w( X8 M, o9 @
{
/ F7 Y/ S1 e7 o- W
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
' J, p. X0 X0 m9 V1 t" j3 ]$ m/ \* v
(EDMA3_RM_EventQueue)0,
$ @( H+ H! n Z
&edma3_isr, NULL);
5 W* o& ~( t% E; } i, M
}
7 p6 T a6 x; Q9 p- X: j
+ x: H# M7 g* [
if(result == EDMA3_DRV_SOK)
H' ?; i# o. h/ H2 N7 o
{
. Q* j0 J& E( ?4 ?% n
paramSet.srcBIdx = 0;
* v2 R @) j3 @: ^8 T
paramSet.destBIdx = 1;
+ y- r2 [, l Y- F' g2 i2 [* [
paramSet.srcCIdx = 0;
8 u$ o- y3 e) g- r, ^
paramSet.destCIdx = 0;
6 p. w% A& |* Y2 f2 N, Z
paramSet.aCnt = PING_PONG_ACNT;
# B1 Z0 z0 \9 R1 N/ A
paramSet.bCnt = PING_PONG_BCNT;
. J, N- q0 A. j2 H) g6 _
paramSet.cCnt = PING_PONG_CCNT;
3 p8 S) L4 v' a) `% ^ D
& w' e1 A+ j. i$ y' T9 M7 k
/* For AB-synchronized transfers, BCNTRLD is not used. */
$ K, C% W# q0 V. o& U- ]
paramSet.bCntReload = PING_PONG_BCNT;
% K$ G3 j9 a8 j' R3 d9 ]# f
. W6 w* `; i$ F( k: y! ~
/* Src in constant mode Dest in INCR modes */
/ L/ D3 ~: S2 Q' }( i& c
paramSet.opt &= 0xFFFFFFFDu;
) W N& s5 Z# X* F4 g3 A
//paramSet.opt &= 0xFFFFFFFCu;
6 ~# e+ {, a7 q3 _! W7 Q1 V
1 U# T# b2 I0 X1 k
/* Program the TCC */
% n3 }; ^ y) j2 W7 Z+ F: A' S4 C
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
2 ]7 r2 D) z+ I# V% _
0 @& O1 d# r/ x2 o
/* Enable Intermediate & Final transfer completion interrupt */
: H6 \* K1 }5 D
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
/ @/ o6 X+ i/ n( |- y, q
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
' `5 {) ]7 l: E+ N
0 A+ V7 M% x. R
/* AB Sync Transfer Mode */
: T( w0 g$ D; g3 d- b
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
% j7 G9 K2 a( e& c/ w/ O
- n6 B% H* b0 j8 C- ^# l- o
/* Program the source and dest addresses for master DMA channel */
1 [- h, Z4 Y( y x. k
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
" \5 l5 t M1 [0 z9 J0 S; X! w3 n
paramSet.destAddr = (uint32_t)(ping_buffer);
) B D& M; S! u9 Y6 ~& H0 c4 q: R
% t: z! x r+ T4 X8 l7 Y& y* @/ s
/* Write to the master DMA channel first. */
1 B, M1 w& t% P# T
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
6 ^: {# h; S( i0 v
}
) h/ l6 v. a: J
Z& b& ]# t/ R
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
N! K: M; G; k, `# Q- T& E# N$ Z ^
0 J6 @; O+ E8 j1 p Y
if(result == EDMA3_DRV_SOK)
. q9 @8 t8 ~( h, q1 X
{
& z6 [' g3 T- O% {- J
print2arm("edma3 driver init success.",0);
# s: J1 H+ }: t
}
' R2 b* g/ V& x% c; a0 D
}
! a3 `7 o" O' ^ n0 T
2 S8 ]6 s* k# t# ~" }' G2 L
8 D2 N. H! k% J3 y z \
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
- I- L3 E1 Q% }6 \8 L' W2 A
8 C% c6 ?1 B' T& A
7 o& J, W7 \& z$ j; a; I0 Z
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
, g; ^) z. L i7 _- t
每次DMA传输完成后都要再次使能传输
; }8 q$ K; @7 l$ M8 |
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4