嵌入式开发者社区
标题:
edma3中断只能进去一次
[打印本页]
作者:
silent123
时间:
2015-4-22 22:01
标题:
edma3中断只能进去一次
使用mcsdk中的edma3lld库写的edma3驱动,在omapl138的dsp核运行,但是中断函数只能进去一次,路过的朋友帮忙看看,感谢万分。代码如下:
' R+ x2 _8 L- s% s" |8 B
#define PING_PONG_ACNT 1
( T/ q/ {& ~% r
#define PING_PONG_BCNT 8*32*40
4 l( E% B! \/ V1 [0 j
//#define PING_PONG_BCNT 1
+ L9 _2 _& {' ?0 u0 _' z
#define PING_PONG_CCNT 1
8 Z0 h! d: t* u& x$ @3 V/ A, T
#define MCASP_BASEADDR 0x01D00000
2 u E+ U9 |. L( }6 R
#define Mcasp_RXEVENTQUE (0u)
9 j. N! H4 M& J! f) p E6 Q+ q
' I! W- d8 A9 g7 [( [2 l, r
/* OPT Field specific defines */
+ v* s' P: X/ [0 F2 K7 k- c
#define OPT_SYNCDIM_SHIFT (0x00000002u)
3 q. ^! |4 s! o& R' ?
#define OPT_TCC_MASK (0x0003F000u)
* F% y! o9 r+ f+ X
#define OPT_TCC_SHIFT (0x0000000Cu)
: @9 {) W6 L1 B. W. e$ e' Z
#define OPT_ITCINTEN_SHIFT (0x00000015u)
$ Y8 X; ], l! ?
#define OPT_TCINTEN_SHIFT (0x00000014u)
. D. G) v; n% D+ l6 b6 d8 S' e8 }5 d
. g1 _9 Z! o+ C. ]
char ping_buffer[PING_PONG_BCNT];
! w- X, U8 @7 Z1 h8 D
char pong_buffer[PING_PONG_BCNT];
' @! U% h% P- ^8 b0 J* N3 m1 a; x
: M! s- V7 j9 F' s/ i
: a9 ~( M1 A5 X( N6 E
6 J" B+ A! h' D/ L3 N+ _6 m+ O
|( ~8 K8 ]# M- D- S
static void ys_edma3_init()
# N* t. J3 P/ _- G
{
7 c3 g% i8 B) j# \8 U' B) w
EDMA3_DRV_PaRAMRegs paramSet = {0,0,0,0,0,0,0,0,0,0,0,0};
3 e# w2 Y, N: u/ b5 A- y. K
EDMA3_DRV_Result result = EDMA3_DRV_SOK;
3 g1 y; u! w v$ Q3 F
EDMA3_DRV_Handle hEdma;
6 Y- H6 W9 T4 K* f
uint32_t chId = 0;
! e, {7 E; Z! }: K& y# M
uint32_t tcc = 0;
7 ]7 g8 r: d' ~% q0 }8 ~& }
8 F1 m/ S/ o5 r" R0 [9 j/ `+ q6 |& T
print2arm("edma3 driver init...",0);
7 H! }2 I" E, q4 Z7 c
3 S* W2 o( U, Y" |. `
hEdma = edma3init(0,&result);
0 H, Z& l# K# ~7 Z
if(hEdma)
/ r* a7 O4 e, k* A. a4 @
{
$ o) w, `0 J! z- y3 V
print2arm("edma3init() Passed.",0);
8 Z, K% U% I, E, X1 q, }* t1 U' e0 ^
}
8 l0 x8 t" _- K
else
# b) }" f' f# w# x5 ^
{
3 q9 Y; {# D# F o/ f' G
print2arm("edma3init() Failed.",0);
# u4 b, q; Z: V5 M
}
" U p M$ W! `$ l7 A% }8 g
9 k! C$ \( X# ~7 Y
if (result == EDMA3_DRV_SOK)
* I' W1 E" n3 ~) l
{
$ t# h4 g0 ~& {
result = EDMA3_DRV_requestChannel (hEdma, &chId, &tcc,
9 ~8 N8 ^8 u/ e+ Y$ x8 r+ e
(EDMA3_RM_EventQueue)0,
; x* `) W* H1 {3 `& s, r9 V
&edma3_isr, NULL);
; a t' z) s0 H8 b% ]! K
}
$ P! R& e+ @" b. N4 B# A+ f% }
3 |0 p) M. l0 L$ U0 ?0 L
if(result == EDMA3_DRV_SOK)
9 E; \* i! r% m. p8 j2 I- h
{
8 d" l4 ?" `- E. z
paramSet.srcBIdx = 0;
0 I8 r! k3 P# @1 O* O \
paramSet.destBIdx = 1;
: W. a) o! H; j/ u
paramSet.srcCIdx = 0;
, @8 ^4 N. }: t# o0 ]; L
paramSet.destCIdx = 0;
# I: L: @4 H) v( t7 F5 f8 E; `6 T# k+ M9 U
paramSet.aCnt = PING_PONG_ACNT;
! Z- i- s" H. l1 v; e' o" ?
paramSet.bCnt = PING_PONG_BCNT;
" j/ @1 F& `) r4 Z
paramSet.cCnt = PING_PONG_CCNT;
. v- Y9 I y$ \) {- @& x0 `8 X
+ M* r: I7 I$ x6 \6 D, c ~$ g
/* For AB-synchronized transfers, BCNTRLD is not used. */
. W: T L7 T. @4 o5 c2 k6 @
paramSet.bCntReload = PING_PONG_BCNT;
/ F" o. K" p. b6 c4 s* K
/ H0 L% i- i9 Y8 J1 O8 O
/* Src in constant mode Dest in INCR modes */
2 u% N7 H. _2 x* p
paramSet.opt &= 0xFFFFFFFDu;
' p+ U$ ~: i2 \
//paramSet.opt &= 0xFFFFFFFCu;
/ z, A; P" N% U. v2 B) ~
+ q; D2 x" ^% a( k' [% S- S5 E: g) W
/* Program the TCC */
7 ^) p- D! N; }% R& {, ]; P: ^
paramSet.opt |= ((tcc << OPT_TCC_SHIFT) & OPT_TCC_MASK);
4 Q4 I. w! R5 R9 ^7 i
. u' a# Y1 g8 H9 V) P0 E
/* Enable Intermediate & Final transfer completion interrupt */
- \9 } }: S' r- J! Y7 l: b
paramSet.opt |= (1 << OPT_ITCINTEN_SHIFT);
! s I6 [" C* i( u
paramSet.opt |= (1 << OPT_TCINTEN_SHIFT);
0 I4 k% s6 m. K7 m
8 s2 L- {! D) N; D3 v- O+ l
/* AB Sync Transfer Mode */
- G/ I( T8 K% I2 G% G1 n1 ~
paramSet.opt |= (1 << OPT_SYNCDIM_SHIFT);
/ Q3 @5 r+ S) b4 K' ]- o& e1 f
) d0 K+ o3 \# O) h- x
/* Program the source and dest addresses for master DMA channel */
& w7 |. o" r$ T" W7 u; q# q. g
paramSet.srcAddr = (uint32_t)(MCASP_BASEADDR+0X029C);
. P3 o" o$ n0 l9 j
paramSet.destAddr = (uint32_t)(ping_buffer);
6 H3 H( v+ e# f* \! ^
+ }4 B" h' V; J2 a* N
/* Write to the master DMA channel first. */
% X( h5 r& Y9 I: C. x8 G4 V% V
result = EDMA3_DRV_setPaRAM(hEdma, chId, ¶mSet);
! V! P( }% D3 h- J) a1 q
}
+ Z6 r9 l; L2 O# k# ~; N7 g
6 [ j% V& O' T+ {+ q
result = EDMA3_DRV_enableTransfer(hEdma,chId,EDMA3_DRV_TRIG_MODE_EVENT);
! ]' ^9 P6 x) F0 X. T: m
7 M; p, K2 s1 q, A4 f& g1 M
if(result == EDMA3_DRV_SOK)
7 w8 h: L+ x: e3 O- ]
{
" U5 r" P" y6 @. P$ c
print2arm("edma3 driver init success.",0);
. d0 B3 ?6 T. W$ r7 q1 z9 s
}
; i; ?6 @1 b' I( o, J( e- k$ X
}
8 p/ ^9 a. s7 Z- U3 Q
* ]! P9 n& j5 c/ k
$ I' V$ X; H- |8 S5 w4 ^" S
EDMA3的配置就这个函数,是由MCASP接收事件触发EDMA3传输的,中断函数edma3_isr只能进去一次,请大家帮忙看看哪里有问题。。。
, v; E8 r* h+ i4 d5 L9 {; M! L
$ j( o& t7 Z" f/ T! W% X+ Q2 i
( U& w7 T0 z5 k3 }, B8 f6 B
作者:
Lewis
时间:
2015-4-24 10:47
每次DMA传输完成后都要再次使能传输
作者:
silent123
时间:
2015-4-29 23:25
Lewis 发表于 2015-4-24 10:47
+ Y5 ]0 u3 c0 s+ m6 p5 N# v0 ]
每次DMA传输完成后都要再次使能传输
- ? J- F7 L. K5 |) x7 H! K% j
原来是这样,我明天去试试,谢谢了!
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4