嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
) s+ F& e, T$ L9 X) I( }7 C1 f: b
#define PING_PONG_ACNT 1
; I* `7 [' P; f# O
#define PING_PONG_BCNT 8*32*40
7 A4 K; R0 P, w0 P T1 U
//#define PING_PONG_BCNT 1
0 ?' X7 Q4 }0 g! `' T6 r
#define PING_PONG_CCNT 1
& N6 F8 D) G! ^9 e
#define MCASP_BASEADDR 0x01D00000
; a, x" @0 S4 m( h8 j0 _! c6 m
#define Mcasp_RXEVENTQUE (0u)
p1 a4 ]: h% J# Z) X% u9 \6 @% a
* ]( \ T9 ]0 b, J( r
/* OPT Field specific defines */
0 O# p' T* m7 T% y3 Y0 E) \" a
#define OPT_SYNCDIM_SHIFT (0x00000002u)
' e+ O, H8 ]6 |- y' V
#define OPT_TCC_MASK (0x0003F000u)
9 {5 z# X& |" d
#define OPT_TCC_SHIFT (0x0000000Cu)
, {5 E& _# m/ n& f# l
#define OPT_ITCINTEN_SHIFT (0x00000015u)
) G1 R+ j2 m1 v5 j
#define OPT_TCINTEN_SHIFT (0x00000014u)
9 N& e6 S% V b
" s/ k4 e$ b V5 N" S- u+ ~6 l
char ping_buffer[PING_PONG_BCNT];
& W% C4 A1 Y( E7 F7 w8 i& y
char pong_buffer[PING_PONG_BCNT];
1 A. C1 p b9 j7 f* S; u
# ] n' i& O; J: L
2 P2 ~1 P- u( k( }7 j
; \% ]! t* k8 {) K
4 Y- N6 O1 F4 Y2 D; }! @; h
static void ys_edma3_init()
9 I* C2 S ]: _# Q
{
/ `8 ~9 N- T5 p2 S& [* c- ~; E5 Y
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
& M2 d+ ^' m, V/ \3 s( N5 I; z
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
. u; ]. v0 h) }; J
EDMA3_DRV_Handle hEdma;
; {6 [; {1 N# s, O
uint32_t chId = 0;
7 s1 ] C+ ~0 t7 @% `
uint32_t tcc = 0;
! W6 G& P; Q; T# D; R# g
1 t4 o7 ?/ U& P3 m7 R; X9 H
print2arm("edma3 driver init...",0);
3 O' M5 v. D8 T5 p7 q
# |7 g3 @/ ] }) ~& W
hEdma = edma3init(0,&result);
: D' b5 F) j% |* h" p5 p
if(hEdma)
+ h, ?# {; E' _) M# J' C- |
{
8 d9 F1 Q1 j7 l: Q0 R+ @5 E
print2arm("edma3init() Passed.",0);
5 g* u& k' N* }+ U8 ~1 j8 C- J
}
% O& v1 \5 Y& h+ D/ ~/ p
else
5 z4 `& c) J. q6 p6 X
{
7 L" R4 j- d% Y. A4 P
print2arm("edma3init() Failed.",0);
; U+ @2 f( E' c& y! M/ `! g
}
5 x5 N) ^0 D; m7 |- {
+ S: {+ q9 c" T% J: D- F
if (result == EDMA3_DRV_SOK)
/ t3 ]0 I2 A, E
{
. j; h' M0 G3 b( Q# w5 M
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
! G9 U* V' g2 ]
(EDMA3_RM_EventQueue)0,
' K! A/ E b4 t, W2 l5 p1 Q
&edma3_isr, NULL);
6 q2 `2 i- `' c
}
! x9 S+ |) n: j/ o, k/ p
3 R+ w2 t3 ~- ~, f/ \7 C- `$ z
if(result == EDMA3_DRV_SOK)
; I3 ~5 y# \" \6 {% g* ?9 u) w
{
3 K" d6 s% T7 ~1 e
paramSet.srcBIdx = 0;
) [5 f( V' C9 U% {' \1 R' n
paramSet.destBIdx = 1;
v l' z1 _) u2 [
paramSet.srcCIdx = 0;
$ n; M* X, P. _
paramSet.destCIdx = 0;
9 h' p7 i |$ ~" {9 L4 ^1 i8 a
paramSet.aCnt = PING_PONG_ACNT;
7 X/ M9 T* N# ~+ Z8 ?! a
paramSet.bCnt = PING_PONG_BCNT;
* t. O* p* b4 t
paramSet.cCnt = PING_PONG_CCNT;
& O6 ]* L5 O" |* r2 ^. V! u
# {& }$ D5 J' }; T" @( }* Z5 Q
/* For AB-synchronized transfers, BCNTRLD is not used. */
! _8 \' ?9 ]8 b2 n7 Q
paramSet.bCntReload = PING_PONG_BCNT;
+ h1 t8 N- W& L' E) t3 e- \; b
. R( C. J2 J2 ]/ L
/* Src in constant mode Dest in INCR modes */
) u- l" }8 ~1 V7 w0 a
paramSet.opt &= 0xFFFFFFFDu;
( y! p) t2 j! K0 p. d1 B2 P
//paramSet.opt &= 0xFFFFFFFCu;
4 F0 [0 k- |% r/ W
, K9 }7 l O# W" Q6 z& `- e2 C6 [
/* Program the TCC */
' s. u3 |7 o3 ~( g! X4 B4 b, r4 n
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
$ @! U4 G1 s+ Z- `1 d: G
% u! B$ w/ f: H! N
/* Enable Intermediate & Final transfer completion interrupt */
9 P0 p. @" G. g% t0 P( `6 F: B C( S
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
6 V. q5 }# V7 m H: h0 `9 v. b
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
, ^3 G% F( D2 [6 B' Q- @! ~( m
! L/ u1 m0 V r% M
/* AB Sync Transfer Mode */
7 A4 E. o# r+ d9 O
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
7 l% o' b* F* Q5 {6 V
/ c# S% G; S$ N. {8 C
/* Program the source and dest addresses for master DMA channel */
" {, H1 C1 a/ [4 ^1 [! k$ S0 s
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. T- J- a; f) }/ j6 X3 v
paramSet.destAddr = (uint32_t)(ping_buffer);
0 d r( g7 g; ]4 ?4 i# D: O8 y
5 z8 S+ ~7 k6 T/ c) |# k0 \
/* Write to the master DMA channel first. */
, `& ]. B8 ]& V- L# i6 r# d
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
3 i' R }7 E7 n3 i# k& k. P
}
8 l0 G5 Q" Y9 {$ f$ Z D p
- R$ F& R0 S3 V- E* o5 J+ t% a2 \# G% m
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
/ ^4 A' Y3 y" T$ T# k8 T4 b
/ v4 v3 Q/ G# b& ^9 q
if(result == EDMA3_DRV_SOK)
0 x; w0 ]4 C, O8 R
{
; A: ^0 [0 C" r
print2arm("edma3 driver init success.",0);
- o: I6 {; E8 [; Z
}
; P' O2 ^6 o$ f% Z! b9 R
}
. i0 {0 H3 f& B0 |1 G9 J) F( [" F
, D9 m# S- A2 j/ e2 I1 j- d D8 v
& B4 j; p7 _; @3 L, M
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
' a. M$ k2 x9 k* Y5 x8 s2 p6 l5 \
7 R6 @, {4 D! E0 C2 ~1 ?3 n' i
9 ]) S2 G# M: G K# I
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
. v- r h9 ~$ ?6 n2 Y0 n1 I* x
每次DMA传输完成后都要再次使能传输
* y3 \' ~* ~# G f& b! T
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4